20 เมษายน 2559

Published เมษายน 20, 2559 by with 0 comment

เริ่มต้น Neural Networks กับ Python

เริ่มต้น Neural Networks กับ Python

บทความนี้ผมจะใช้โค้ด bpnn.py ของ Neil Schemenauer มาเขียนบทความครับ (โค้ดเป็น public domain)

Neural Networks หรือ โครงข่ายประสาทเทียม คือ แบบจำลองทางคณิตาศาสตร์ที่จำลองการทำงานของโครงข่ายประสาทของมนุษย์

เมื่อเซลล์ประสาทหลาย ๆ เซลล์ทำงานร่วมกันกลายเป็นระบบประสาท
โครงสร้างเซลล์ประสาท (Neuron) ของมนุษย์ประกอบได้ด้วย
โครงสร้างเซลล์ประสาทของมนุษย์
ที่เราคุ้นเคยกันมี

  • axon เป็นหน่วยส่งออกข้อมูลจากเซลล์

  • dendrites เป็นหน่วยรับข้อมูลป้อนเข้าเซลล์

  • Synapses เป็นโครงสร้างส่งสัญญาณประสาทโดยใช้สารสื่อประสาท

เมื่อเซลล์ประสาทได้รับสัญญาณจาก dendrites ต่าง ๆ เข้าสู่เซลล์ เมื่อสัญญาณมีความแรงเกินค่าระดับ (threshold) เซลล์จะส่งสัญญาณไปทาง axon และ Synapses ส่งสัญญาณไปยังเซลล์ประสาทอื่นต่อไป

เซลล์ประสาทของมนุษย์มีด้วยกันหลายชนิด เช่น เซลล์ประสาทขั้วเดียว , เซลล์ประสาทขั้ว , เซลล์ประสาทหลายขั้ว

การที่มนุษย์มีการเรียนรู้ ทำให้เกิด Synapses ระหว่างเซลล์ประสาทขึ้นมาใหม่ และการเปลี่ยนสภาพของ Synapses ทำให้โครงสร้างประสาทของมนุษย์ ไม่ใช่แบบลำดับขั้นตอนเสมอไป




กลับมาเรื่อง Neural Networks หรือโครงข่ายประสาทเทียมกันต่อครับ

โครงข่ายประสาทเทียมประกอบไปด้วย

  1. ข้อมูลป้อนเข้า (input) เป็นข้อมูลตัวเลข

  2. ข้อมูลส่งออก (output) เป็นผลลัพธ์ที่ได้จากกระบวนการเรียนรู้ของโครงข่ายประสาทเทียม

  3. ค่าน้ำหนัก (weights)

  4. ฟังก์ชันรวม โดยเป็นผลรวมข้อมูลป้อนเข้า กับ ค่าน้ำหนัก

  5. ฟังก์ชันการแปลง เป็นฟังก์ชันการคำนวณการทำงานของโครงข่ายประสาทเทียม เช่น ฟังก์ชันซิกมอยด์ เป็นต้น

ฟังก์ชันซิกมอยด์ มีสูตรดังนี้ 1/(1+e^-x)


ส่วนประกอบของโครงข่ายประสาทเทียม โครงสร้าง Layer ของโครงข่ายประสาทเทียมแบบหลายชั้น รูปโดย Chrislb จากวิกิพีเดีย - https://commons.wikimedia.org/wiki/File:MultiLayerNeuralNetworkBigger_english.png
เราเรียกวงกลมแต่ละวงในรูปข้างบนว่า โหนด (node)

โดยทั่วไป Neural Networks  ประกอบไปด้วย Layer ทั้งหมด 3 Layer

  1. input layer เป็น Layer รับข้อมูล
  2. hidden layer เป็น Layer ส่วนนี้เป็นส่วนเรียนรู้ของ Neural Networks (DEEP NN)
  3. output layer เป็น Layer รวมผลลัพธ์ที่ได้จาก hidden layer และแปลงข้อมูลเพื่อส่งออกข้อมูล

เนื่องจากทฤษฎี Neural Networks มีมากมาย แนะนำให้ศึกษาเพิ่มเติมได้จาก  วารสาร มฉก.วิชาการ 12 (24) - http://www.lib.hcu.ac.th/KM/artificial-neural-networks/

การสร้างโครงข่ายประสาทเทียมมี 3 ขั้นตอนดังนี้

  1. Build
  2. Train
  3. Test
เรามาเริ่มลงมือศึกษา bpnn.py กันครับ

โดยตัวแปร pat ป้อนชุดข้อมูล XOR เข้าดังนี้
input1input2output
000
101
011
110

โดยโค้ด 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 ความคิดเห็น:

แสดงความคิดเห็น

แสดงความคิดเห็นได้ครับ :)