บทความนี้ผมจะใช้โค้ด bpnn.py ของ Neil Schemenauer มาเขียนบทความครับ (โค้ดเป็น public domain)
Neural Networks หรือ โครงข่ายประสาทเทียม คือ แบบจำลองทางคณิตาศาสตร์ที่จำลองการทำงานของโครงข่ายประสาทของมนุษย์
เมื่อเซลล์ประสาทหลาย ๆ เซลล์ทำงานร่วมกันกลายเป็นระบบประสาท
โครงสร้างเซลล์ประสาท (Neuron) ของมนุษย์ประกอบได้ด้วย

ที่เราคุ้นเคยกันมี
- axon เป็นหน่วยส่งออกข้อมูลจากเซลล์
- dendrites เป็นหน่วยรับข้อมูลป้อนเข้าเซลล์
- Synapses เป็นโครงสร้างส่งสัญญาณประสาทโดยใช้สารสื่อประสาท
เมื่อเซลล์ประสาทได้รับสัญญาณจาก dendrites ต่าง ๆ เข้าสู่เซลล์ เมื่อสัญญาณมีความแรงเกินค่าระดับ (threshold) เซลล์จะส่งสัญญาณไปทาง axon และ Synapses ส่งสัญญาณไปยังเซลล์ประสาทอื่นต่อไป
เซลล์ประสาทของมนุษย์มีด้วยกันหลายชนิด เช่น เซลล์ประสาทขั้วเดียว , เซลล์ประสาทขั้ว , เซลล์ประสาทหลายขั้ว
การที่มนุษย์มีการเรียนรู้ ทำให้เกิด Synapses ระหว่างเซลล์ประสาทขึ้นมาใหม่ และการเปลี่ยนสภาพของ Synapses ทำให้โครงสร้างประสาทของมนุษย์ ไม่ใช่แบบลำดับขั้นตอนเสมอไป
กลับมาเรื่อง Neural Networks หรือโครงข่ายประสาทเทียมกันต่อครับ
โครงข่ายประสาทเทียมประกอบไปด้วย
- ข้อมูลป้อนเข้า (input) เป็นข้อมูลตัวเลข
- ข้อมูลส่งออก (output) เป็นผลลัพธ์ที่ได้จากกระบวนการเรียนรู้ของโครงข่ายประสาทเทียม
- ค่าน้ำหนัก (weights)
- ฟังก์ชันรวม โดยเป็นผลรวมข้อมูลป้อนเข้า กับ ค่าน้ำหนัก
- ฟังก์ชันการแปลง เป็นฟังก์ชันการคำนวณการทำงานของโครงข่ายประสาทเทียม เช่น ฟังก์ชันซิกมอยด์ เป็นต้น
ฟังก์ชันซิกมอยด์ มีสูตรดังนี้ 1/(1+e^-x)

เราเรียกวงกลมแต่ละวงในรูปข้างบนว่า โหนด (node)
โดยทั่วไป Neural Networks ประกอบไปด้วย Layer ทั้งหมด 3 Layer
- input layer เป็น Layer รับข้อมูล
- hidden layer เป็น Layer ส่วนนี้เป็นส่วนเรียนรู้ของ Neural Networks (DEEP NN)
- output layer เป็น Layer รวมผลลัพธ์ที่ได้จาก hidden layer และแปลงข้อมูลเพื่อส่งออกข้อมูล
เนื่องจากทฤษฎี Neural Networks มีมากมาย แนะนำให้ศึกษาเพิ่มเติมได้จาก วารสาร มฉก.วิชาการ 12 (24) - http://www.lib.hcu.ac.th/KM/artificial-neural-networks/
การสร้างโครงข่ายประสาทเทียมมี 3 ขั้นตอนดังนี้
- Build
- Train
- Test
โดยตัวแปร pat ป้อนชุดข้อมูล XOR เข้าดังนี้
input1 | input2 | output |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
โดยโค้ด bpnn.py เป็นโคงข่ายประสาทเทียมแบบหลายชั้น และ ใช้การแพร่ย้อนกลับ (Back Propagation)
มี 2 input layer , 2 hidden layer และ 1 output layer ตามค่า n ที่ประกาศไว้ในคำสั่ง
n = NN(2, 2, 1)
ในโค้ดนี้มีการใช้งานฟังก์การแปลง อย่างฟังก์ชันซิกมอยด์
จากการทำงานของ bpnn.py เราต้องการสอน XOR function ให้กับ Neural Networks แล้วเรียนรู้โดยให้ใกล้เคียงกับชุดข้อมูลแล้วหาค่า error โดยเปรียบเทียบกับข้อมูลที่มีอยู่แล้ว แล้วแพร่ย้อนกลับไปยัง input layer พร้อมทั้งคำนวณค่าน้ำหนักที่เปลี่ยนทุกการเชื่อมโยง มาเรียนรู้ไปเรื่อย ๆ จนครบ 10,000 รอบการลูป แล้วส่งผลลัพธ์ที่ Neural Networks ได้เรียนรู้มา
โค้ด
ผลลัพธ์
error 0.94250 error 0.04287 error 0.00348 error 0.00164 error 0.00106 error 0.00078 error 0.00092 error 0.00053 error 0.00044 error 0.00038 [0, 0] -> [0.03036939032113823] [0, 1] -> [0.9817636240847771] [1, 0] -> [0.9816259907635363] [1, 1] -> [-0.025585374843295334]
จะเห็นได้ว่า ค่าที่ออกมาใกล้เคียงกับตารางชุดข้อมูล XOR ข้างบน ถือว่า Neural Networks ประสบการณ์ความสำเร็จ
ศึกษาเพิ่ม
- แกะโค้ดและเขียนอธิบายการทำงานใส่กระดาษ A4
- ลองปรับเปลี่ยนค่า input layer , hidden layer และ output layer ดู
- ลองเพิ่มจำนวนการลูป
- ลองสร้างกราฟ error ของ Neural Networks
- วาดโครงสร้างการทำงานของ Neural Networks ของโค้ดนี้ดู
- ลองชุดข้อมูลอื่น ๆ
โค้ดต้นฉบับ http://arctrix.com/nas/python/bpnn.py
[embed]https://imgur.com/2Tla9xb[/embed]
แนะนำวิดีโอสอนทฤษฎี Neural Networks (ภาษาอังกฤษ) https://youtu.be/BL32A4TMjJc?list=PLJqRpPcJQ_g1mhwpyFno3SRgBEPlWkTen
กับ Neural Networks Demystified
ติดตามบทความต่อไปนะครับ
ขอบคุณครับ
0 ความคิดเห็น:
แสดงความคิดเห็น
แสดงความคิดเห็นได้ครับ :)