สวัสดีครับ ก่อนที่จะสนุกสนานกับวันปีใหม่ ก็มาพูดกันในเรื่องประสาทเทียมกันก่อน (สามารถดูบทความก่อนหน้าที่ blog ที่ผมเขียนนี่แหล่ะ)  คราวนี้พูดต่อกันในเรื่องฟังก์ชันถ่ายโอนกัน พร้อมการใช้งานบางอย่าง

       โดยปกติฟังก์ชันถ่ายโอนนี้ตัวเราจะต้องเป็นผู้เลือกใช้ครับ ส่วนค่าน้ำหนักและไบอัสจะถูกปรับค่าตามกฎการเรียนรู้ของแต่ละแบบจำลองระบบประสาทนั้นๆ ส่วนที่ว่าฟังก์ชันถ่านโอนที่เราเลือกมานั้นจะเหมาะสมกับงานของเราหรือไม่ ก็เป็นเรื่องที่ต้องลองใช้ดูถึงจะรู้ครับ วิธีลองก็ไม่ยากคือให้ทดลองฝึกสอน (train)   พอสอนเสร็จก็ลองทดสอบ (simulation)

       ฟังก์ชันถ่ายโอนทำหน้าที่รวมค่าเชิงตัวเลขจากเอาท์พุตของเซลล์ประสาท(Σ) แล้วตัดสินใจว่าจะส่งเอาท์พุท y ออกมาในรูปแบบใด ซึ่งอาจเป็นไปได้ทั้งเชิงเส้นหรือไม่เป็นเชิงเส้นก็ได้ ฟังก์ชันที่เราเลือกใช้ได้ในโปรแกรม MATLAB ก็อย่างเช่น

Transfer Function

ฟังก์ชัน 3 ตัวนี้หล่ะครับ ที่ถูกเลือกใช้กันบ่อย สังเกตว่าฟังก์ชันซิกมอยแบบลอกาลิทึมมีเอาท์พุทอยู่ในช่วง [0,1]  ฟังก์ชันซิกมอยแบบเส้นสัมผัสไฮเปอร์โบลาร์มีเอาท์พุตในช่วง [-1,1] ในขณะที่ฟังก์ชันเส้นตรงมีค่าเอาท์พุตได้กว้างมาก เมื่อเป็นอย่างนี้แล้วเราก็ต้องกำหนดเอาท์พุตให้เป็นไปในช่วงของแต่ละฟังก์ชันด้วย ไม่เช่นนั้นจะได้ผลการสอนที่ไม่ดีครับ

       ผมจะพูดถึงเฉพาะแบบจำลองแบบแพร่กลับ และคำสั่งในการฝึกสอนของโปรแกรม MATLAB คือ
net = newff   หมายความว่าต้องการสร้าง neural network แบบแพร่กลับ โดยมีชื่อว่า net หรือจะเป็นชื่ออื่นก็ได้ เช่น
kikapo = netff  หมายความว่าต้องการสร้าง neural network แบบแพร่กลับ โดยมีชื่อว่า kikapo เป็นต้น
เพื่อความกระจ่างเรามาทดลองมาใช้กันดีกว่า ในที่นี้สมมุติว่าผมต้องการประมาณค่าฟังก์ชัน f(x) =2*cos(x)  ในช่วงตั้งแต่ –pi ไปจนถึง +pi ผมก็จะเขียนเป็นอินพุตและเอาท์พุตใน MATLAB command windows ตามนี้


>> x= -pi:pi/180:pi;    % โดย x เป็นอินพุตของระบบประสาท

>> y=2*cos(x);          % โดย y เป็นเอาท์พุตของระบบประสาท

>>net=newff(x,y,[]);   % สร้างระบบเครือข่ายแบบแพร่กลับในชื่อ net

                                  %มีกลุ่มข้อมูล x เป็นอินพุตและ y เป็นเอาท์พุต

>>out=sim(net,x);       %บรรทัดนี้จะทดลองเครือข่ายชื่อ net ที่สร้างไว้

                                  %(ตอนนี้ยังไม่มีการสอน)

>>plot(out,'rp')            %ลองพล็อตกราฟดูครับ

NN No training

>>MSE=mse(y-out)   %ทีนี้....ลองดูค่าความผิดพลาดเฉลี่ยกำลังสองดูซิ

MSE =

    3.1108

 เห็นได้ว่าผิดพลาดเพียบเลย คราวนี้เอาใหม่ ลองสอนให้ระบบประสาทรู้และประมาณค่า โดยใช้อินพุต x และเอาท์พุท y เดียวกัน

>> kikapo=newff(x,y,[5,5],{'tansig','tansig'});

% สร้างระบบประสาทใหม่ในชื่อ kikapo มี x,y เป็นอินพุตและเอาท์พุตตามลำดับ

% มีชั้นซ่อน (Hidden layer) 2 ชั้น ชั้นละ 5 นิวรอน และชั้นซ่อนถูกกำหนด

% ฟังก์ชันถ่ายโอนเป็นแบบซิกมอยแบบเส้นสัมผัสไฮเปอร์โบลาร์

>> kikapo.trainParam.goal = 1e-10;    % กำหนดค่าผิดพลาดเป้าหมายเป็น 10^-10

>> kikapo.trainParam.epochs = 3000; % กำหนดรอบสูงสุดในการฝึกสอนเป็น 3000

>> kikapo.trainParam.max_fail =3;  % กำหนดให้ตรวจสอบค่า validation =3 (ซึ่งค่า default = 4)

>> kikapo = train(kikapo,x,y);  % สอนระบบประสาทให้ประมาณค่า

Training state

ภาพในขณะ MATLAB สอนระบบปราสาทเสร็จเรียบร้อยแล้ว  ถ้าหากลองกดดูที่ปุ่ม Regression เพื่อดูผลของการสอน ซึ่งถ้าหากมีค่าเข้าใกล้ 1 แสดงถึงว่ามีความแม่นยำในการสอนเพื่อให้ได้เอาท์พุตที่กำหนดได้ดีครับ

คราวนี้ลองทดสอบสิ่งที่ได้สอนเอาไว้ โดยใช้ค่าอินพุตเป็นตัวทดสอบครับ

>>out=sim(kikapo,x);

>>MSE=mse(y-out)   % ลองดูค่าความผิดพลาดเฉลี่ยกำลังสองดูอีกที   เห็นว่าผิดพลาดน้อยมากเลย
 
MSE =
 
  1.3824e-006

>>  plot(out,'rp')    %สุดท้ายครับ ไหนลองพล๊อตกราฟดูผลของการสอนดูหน่อยสิ

output


>> save net_Lover kikapo  %บันทึกระบบปราสาท kikapo โดยกำหนดชื่อใหม่เป็น net_Lover

ถึงตอนนี้นั่นหมายความว่าเราได้ระบบประสาทเทียม kikapo เอาไว้ใช้งานเมื่อยามต้องการในชื่อใหม่คือ net_Lover และมันได้เรียนรู้แล้วว่าถ้าหากมีอินพุตเข้ามาในรูปแบบเดียวกันกับ x จะต้องให้เอาท์พุตออกมาในรูปแบบเดียวกันกับ out   ไว้เดี๋ยวครั้งหน้าหลังปีใหม่ผมจะลองทำระบบประสาทเพื่อการรู้จำสิ่งของหรือวัตถุกันบ้าง สุขสันต์ปีใหม่ครับ