เปิดม่าน Deep Learning (1) : Neural Network – Perceptron

บทความนี้ก็จะขอเกาะกระแส Neural Network กันหน่อยค่ะ เนื่องจาก Neural Network หรือ ที่เราเรียกกันง่ายๆ ว่า  “นิวรอลเน็ต” ช่วงนี้มาแรงมากๆ คิดๆ แล้วก็ไม่น่าเชื่อนะคะ ว่า นิวรอลเน็ต ที่หลายๆ คนเคยมองว่าเป็นอัลกอริทึมที่หยุดพัฒนาไปแล้ว ซึ่งคนในวงการคอมพิวเตอร์เคยพูดติดตลกกันว่า นิวรอลเน็ตน่ะเป็นอัลกอริทึ่มตายแล้ว! แต่แล้ววันนี้ เจ้านิวรอลเน็ตได้กลับมาเป็นกระแสขึ้นมาอีกครั้ง ซึ่งก็คงจะปฏิเสธไม่ได้เลยว่าจะต้องตบรางวัลให้กับเจ้าตัว  Deep Leaning “AlphaGo” ตัวเก่งจาก Google ที่สามารถเอาชนะแชมป์โลกในการแข่งขันเกมส์ Go มาได้อย่างสวยงาม น่าชื่นชมจริงๆ ค่ะ

เคยคิดกันมั้ยคะ ว่า AlphaGo ใช้เทคนิคพิเศษอะไรถึงเอาชนะสมองอันซับซ้อนของมนุษย์ได้ จริงๆ ก็มีหลายปัจจัยนะคะ แต่ปัจจัยที่น่าชื่นชมที่สุดในความคิดของผู้เขียน ก็คือ “ความสามารถในการเรียนรู้จากสถานการณ์แวดล้อม” หรือ ที่รู้จักกันในชื่อ ​Reinforcement Learning ซึ่งถ้าใครติดตามข่าวกันมา การจะสร้าง AlphaGo นี้ต้องมีการทดลองแข่งขันกับมนุษย์ในหลายต่อหลายรอบ และเจ้า AlphaGo ก็แพ้มนุษย์ซะหลายรอบซะด้วยในช่วงแรกๆ!!! แต่เมื่อผ่านการแข่งขันไปได้จำนวนหนึ่ง เจ้า AlphaGo สามารถเรียนรู้ และ จดจำรูปแบบ ทำให้กลับมาเอาชนะได้ในที่สุด ไม่ต้องสงสัยเลยค่ะว่า เมื่อไหร่ที่มนุษย์เอาชนะ AlphaGo ได้อีกครั้ง ผู้เขียนก็ขอเดาไว้เลยว่า ไม่นานเกินรอเจ้า  AlphaGo ก็จะเรียนรู้ และ กลับมาชนะได้อีกอย่างแน่นอน เพราะคอมพิวเตอร์จำไม่เคยลืม! คำนวณไม่เคยพลาด! และ ไม่รู้จักคำว่าเหนื่อย! 

 

Screen Shot 2017-06-10 at 13.30.32
Neural Network’s basic structure

เรื่อง Reinforcement learning ก็เป็นอีกเรื่องที่น่าสนใจ แต่ถ้าจะให้พูดถึงก็คงจะอีกยาว ยังไงก็ขอกลับมาเรื่องนิวรอลเน็ตของเรากันก่อนดีกว่าค่ะ เห็นคนพูดเรื่องนิวรอลเน็ตกันมาเยอะแล้ว วันนี้เราจะมาเจาะลึกเข้าไปในตัว node หรือ cell เพียงตัวเดียว ที่เรียกว่า “Neuron” หรือ “Perceptron” กันดีกว่า ว่าเจ้า cell นิวรอนตัวนี้ทำงานยังไง?

What is Perceptron (Neuron)? and what is Neural Network?

นิวรอน (Neuron) หมายถึง “nerve cell” หรือ เซลล์แต่ละเซลล์ในสมองของมนุษย์ ซึ่งในทางคอมพิวเตอร์ได้พยายามจำลองการทำงานของเซล์ตัวนี้ และ ตั้งชื่อให้ว่า Perceptron ต่อมาได้มีการนำเซลล์เหล่านี้มาเชื่อมต่อกันเป็นโครงข่าย หรือ ที่เรียกกันว่า “Neural network” เพื่อหวังว่า neuron หรือ perceptron เหล่านี้จะทำการส่งข้อมูลสื่อสารระหว่างกันเหมือนการส่งสัญญาณในสมองของมนุษย์ เพื่อเป้าหมายที่หวังว่า เจ้า Neural network จะมีความสามารถทัดเทียมกับสมองมนุษย์ในการ คิด รู้จำ ตัดสินใจ และ จดจำรูปแบบ เป็นต้น

Screen Shot 2017-06-11 at 12.31.26

ในบทความนี้ เราจะไม่พูดถึงทั้งโครงข่ายของนิวรอลเน็ต แต่เราจะมาเจาะลึกเข้าไปในการทำงานของ perceptron หรือ neuron แต่ละตัวกันค่ะ ว่ามันมีการทำงานพื้นฐานอย่างไร

Screen Shot 2017-06-11 at 13.05.09

จริงๆ แล้ว “นิวรอน” มีการทำงานพื้นฐานที่ง่าย ไม่ซับซ้อน นิวรอนจะอ่านค่าข้อมูลเข้า และ ทำการคำนวณ (ด้วยฟังก์ชันที่กำหนดไว้) ต่อมา นิวรอนจะส่งผลลัพธ์ที่ทำนายได้ออกมา ผลลัพธ์นั้นก็จะถูกนำไปเปรียบกับค่าจริงจากข้อมูลสอน แล้วคำนวณหาค่า error (เช่น ถ้านิวรอนทำรายราคาหุ้นออกมาเป็น 15 แต่ ราคาที่เกิดขึ้นจริงเท่ากับ 17 error ก็จะเป็น 2) ต่อมา ค่า error นั้นก็จะถูกดึงกลับเข้าไป เพื่อปรับค่าในฟังก์ชันของนิวรอนอีกครั้ง ทำงานวนไปเรื่อยๆ จนหมดข้อมูล จึงจะได้โมเดลที่พร้อมใช้งาน

ตัวอย่างการใช้นิวรอน เพื่อการ Classification

จากหลักการทำงานที่กล่าวไว้ข้างต้น ในตัวอย่างนี้เราจะแสดงตัวอย่างการใช้  “นิวรอน” โหนดเดียวในการแบ่งกลุ่มข้อมูลของเนื้องอกออกเป็น 2  ชนิด คือ เนื้องอกอันตราย “Malignant” และ เนื้องอกปกติ “Benign” ออกจากกัน ตัวอย่างข้อมูล แสดงได้ดังนี้

Screen Shot 2017-06-10 at 23.17.51

จากรูป มนุษย์สามารถหาจุดแบ่งข้อมูล และลากเส้นแบ่งระหว่างข้อมูลสองกลุ่มได้อย่างง่ายดาย แต่คอมพิวเตอร์ไม่สามารถทำได้!  คอมพิวเตอร์จะไม่มีไอเดียเลยว่ากลุ่มข้อมูลอยู่ตรงไหนในทางกราฟฟิกแบบเรา มาดูกันดีกว่าค่ะ คอมพิวเตอร์แก้ปัญหานี้ด้วย นิวรอน ได้อย่างไร

Step 1 : เตรียม input เพื่อใช้เป็นข้อมูลสอน  (Training set) เพื่อใช้สอนนิวรอน

ในที่นี้เราจะลองสอนนิวรอนของเราด้วย ข้อมูลสอนเพียงแค่ 2 inputs ก่อนเพื่อให้ง่ายต่อความเข้าใจ ดังนี้

Screen Shot 2017-06-10 at 23.19.51

Step 2 : อ่านข้อมูลสอนแถวแรก และ Random คำตอบแรก

อ่านข้อมูลสอนแถวแรก และ ทำการสร้างค่าคำตอบแรกด้วยการสุ่ม ขอให้จำไว้ว่านิวรอลจะต้องมีจุดเริ่มต้นเสมอ (ในอนาคตเมื่อเราไปถึง นิวรอลเน็ต เราก็จะได้เห็นการ random นำ้หนักกัน)ในที่นี้เราจะลองใช้นิวรอลของเราหาเส้นตรงในการแบ่งข้อมูล ซึ่งเรารู้อยู่แล้วว่าสมการเส้นตรงก็คือ y =  ax + c (เพื่อให้เข้าใจได้ง่าย เราจะขอกำหนดค่า c = 0 นั่นก็คือ เราบังคับให้เส้นตรงลากออกจากจุด 0,0 เสมือ) ดังสมการของจะเป็นดังนี้

y = Ax

จากสมการ ค่า y  คือ ค่าที่นิวรอนจะทำนายออกมาให้เรา ส่วนค่า x คือ ค่า input ค่า A เป็นค่าที่นิวรอนต้องกำหนดเอง (เพื่อให้ได้ค่า y  ที่ถูกต้องมากที่สุด)

หลังจากอ่านข้อมูลสอนชุดแรก x = 2, y = 2 เข้ามา ในการสอนรอบแรก นิวรอนจะสุ่มค่า A ออกมาเป็นค่าเริ่มต้นก่อน สมมุตว่า สุ่มได้ A = 0.35 สมการที่เราได้ก็จะเป็น y = 0.35x ซึ่ง สอดคล้องกับเส้นตรงที่มีลักษณะดังนี้

Screen Shot 2017-06-11 at 13.21.16

จะเห็นได้ชัดเจนว่าเส้นแบ่งที่ได้ยัง ไม่ เหมาะสมเนื่องจากไม่สามารถแบ่งข้อมูล 2 คลาสออกจากกันได้เลยแม้แต่นิดเดียว ซึ่งก็ไม่แปลกเพราะค่าแรก เป็นเพียงค่าที่นิวรอนสุ่มมา ยังไม่ได้เริ่มการเรียนรู้ใดๆ เลย

Step 3 :  คำนวณค่า error

หลังจากได้เส้นตรงจากการสุ่มมาแล้วเป็น  y =  0.35x  ขั้นตอนต่อไป คือ การหาค่า error ที่เกิดจากเส้นตรงนี้ ซึ่งค่า error ก็คือ ค่าความแตกต่างระหว่างค่าที่ได้จากนิวรอน และ ค่า target ที่เราต้องการ

ค่าจริงจากข้อมูลสอนก็คือ  x = 2 และ y = 2  ซึ่งหมายความว่า ถ้าใส่ x = 2 ลงไป ค่า y ที่ถูกต้องควรจะเป็น 2 แต่เนื่องจากในที่นี้ เราต้องการแก้ปัญหาการแบ่งกลุ่ม เราจึงไม่สร้างจุดแบ่งที่ตรงกับข้อมูลพอดี แต่เราต้องการแบ่งที่จุดที่อยู่เหนือข้อมูล ดังนั้น ในที่นี้เราจะกำหนดค่า y taget เป็น 2.1 เพื่อให้เส้นตรงอยู่เหนือข้อมูลสอนจุดแรก

Screen Shot 2017-06-11 at 13.31.06.png ได้ target y  มาแล้ว คือ  2.1 ต่อมาเรามาดูค่า y ที่ทำนายได้จากนิวรอน ด้วย สมการ y = 0.35x กัน

y     = 0.35 * 2
……..= 0.70

ดังนั้น ค่า error  จะเท่ากับส่วนต่างระหว่าง Target y (ค่าที่ต้องการ) และ predicted y (ค่าที่ได้จากการทำนาย) ดังนี้

Error   =  2.1 – 0.70
…………..= 1.40

Step 4 :  Adjust ค่า A  ด้วยการ evaluate ค่า error ในขั้นตอนที่ 3

เพื่อให้จุดแบ่งมีประสิทธิภาพมากขึ้น นิวรอนจะต้องทำการปรับค่า A เพื่อให้คำตอบวิ่งเข้าใกล้ค่า Target มากขึ้น โดยส่วนใหญ่แล้วค่า A จะถูกปรับด้วยการ นำค่า  Error (E) มาหารด้วยค่า x ดังนี้

delta (A)    =   E / x
………………..=  1.40 / 2
……………….=  0.7

จากสมการ เราจะได้ค่า delta(A)  หรือ ค่า A ที่เปลี่ยนไป จากนั้น เราจะนำค่า  delta(A) มาปรับค่า A ใหม่ ดังนี้

A_new       = A_old  +  delta(A)
………………..= 0.35 + 0.7
………………..= 1.05

จะเห็นว่า A ถูกเปลี่ยนจาก 0.35 (จากการสุ่มในขั้นตอนที่ 1) เป็น 1.05 ทำให้สมการเราเปลี่ยนเป็น              y = 1.05x เส้นแบ่งหลังจากทำการปรับค่า แสดงได้ดังนี้

 

Screen Shot 2017-06-11 at 13.42.02

จะเห็นว่าเส้นตรงเส้นใหม่ ที่ได้จากการสอนนิวรอนด้วยข้อมูลแถวแรก ดีขึ้นกว่าเส้นแรก แต่ ก็ยังไม่ดีพอ เนื่องจากการแบ่งแบบนี้ Benign มีโอกาสถูกทำนายผิดเป็น Malignant ได้ง่ายมากๆ ดังรูป

Screen Shot 2017-06-11 at 13.45.35.png

จะเห็นว่า ถ้ามีข้อมูลใหม่ (new input) เข้ามา แล้วอยู่เหนือเส้นแบ่งเพียงแค่นิดเดียว การทำนายจะทำนายผิด เป็นคลาส  malignant  ทันที  นั่งเป็นเหตุผลที่ เราต้องให้นิวรอนได้เรียนจากข้อมูลสอนตัวอื่นๆเพิ่ม

Step 5 :  สอนนิวรอนด้วยข้อมูลแถวที่ 2 และหา error

ในการสอนด้วยข้อมูลแถวใหม่ เราก็จะทำเหมือนเดิมเลย คือ การอ่านข้อมูลเข้า และหาค่า error ที่ได้จาก   นิวรอน สมการล่าสุดตอนนี้คือ  y = 1.05x ข้อมูลเข้าแถวที่ 2 คือ ถ้า x = 3.0 จะได้ y = 4.0  ซึ่งเราจะ target ที่ y = 3.9 ด้วยเหตุผลเดียวกับขั้นตอนที่  3

Screen Shot 2017-06-11 at 13.54.30ดังนั้น ค่า predicted y ที่ได้จากนิวรอน คือ

y       = 1.05 * 3.0
……….= 3.15

ค่า error ที่เกิดจากข้อมูลนี้คือ

E      = 3.9 – 3.15
………= 0.75

Step 6 :  Adjust ค่า A  ด้วยการ evaluate ค่า error ในขั้นตอนที่ 5

ปรับค่า A ใหม่ โดยหาค่า A ที่เปลี่ยนไป หรือ delta(A) โดยใช้สูตรเดิมจากขั้นตอนที่ 4 ดังนี้

delta(A)    = E / x
……………….= 0.75 / 3.0
……………….= 0.25

คำนวณค่า A ใหม่ หรือ A_new

A_new        =  A_old  +  delta(A)
…………………= 1.05 + 0.25
…………………= 1.30

ดังนั้น สมการคำตอบใหม่ที่ได้จากการสอนด้วยข้อมูลแถวที่สองจะได้  y = 1.3x  มาดูเส้นแบ่งใหม่กันค่ะ

Screen Shot 2017-06-11 at 13.58.45.png

จะเห็นว่าเส้นคำตอบใหม่ที่ได้ เป็นเส้นที่สามารถแบ่งข้อมูลได้ตามที่เราต้องการ  และ เป็นคำตอบสุดท้ายที่ได้จากนิวรอนโหนดนี้ หลังจากการสอนด้วยข้อมูลสอนจำนวน 2 แถว เป็นที่เรียบร้อย

สรุปแล้ว ผลที่ได้ “ดี” หรือ “ไม่ดี”? อย่างไร? 

จากนี้เราจะมาวิเคราะห์ผลกันดูค่ะ ว่าที่เราทำมาทั้งหมดนี้เราได้เส้นแบ่งที่มีประสิทธิภาพ หรือไม่ อย่างไร ก่อนจะสรุปผล เรามาดูผลงานของเรากันก่อน

Screen Shot 2017-06-10 at 23.40.29

จากการทำงานทั้งหมด หลังจากสอนข้อมูล 2 ชุด เราได้มีการพัฒนาผลลัพธ์ จากเส้นที่ 1  ไปจนถึงเส้นที่ 3  ซึ่งเส้นที่ได้ก็ทำงานได้ แต่ “ไม่ดี”  เพราะว่าเส้นแต่ละเส้นจะถูกปรับเข้าใกล้ค่าล่าสุดเสมอ!!! นี่แหละค่ะ เป็นรูปแบบพื้นฐานอีกหนึ่งรูปแบบของปัญหาที่เราเรียกๆ กันติดปากว่า OVERFITTING!!! ซึ่งเส้นแบ่งในลักษณะนี้ สุ่มเสี่ยงต่อกันแบ่งกลุ่มข้อมูลผิดพลาดเป็นอย่างมาก!

Overfitting เกิดจากการที่ผลลัพธ์ที่ได้ มีความเฉพาะเจาะจงกับข้อมูลสอนมากเกินไป วีธีการแก้ไข ณ จุดนี้ คือ เราต้องปรับค่าในการคำนวณค่า A โดยใช้ค่าที่เรียกค่า  “Learning Rate”  เข้ามาช่วยในการคำนวณ ช่วยให้นิวรอนของเรา ไม่ Sensitive หรือ อ่อนไหวกับค่าข้อมูลสอนมากจนเกินไป ซึ่งจะสามารถลดปัญหาของการ Overfitting ได้ต่อไป

ปล. ถ้าใครรู้จัก SVM  หรือ Support Vector Machine ก็จะสังเกตุได้นะคะ ว่าปัญหาในแนวนี้ SVM ก็จะแก้ด้วยการหาเส้นตรงที่อยู่ตรงกลางระหว่างข้อมูล 2  คลาส ซึ่งถ้ามีโอกาสก็จะพยายามทำบทความตัวนี้ออกมาให้นะคะ เป็นอีกหนึ่ง Machine Learning ที่ถึงจะเก่าแต่ก็ยังน่าสนใจอยู่ไม่น้อยทีเดียวค่ะ

หวังว่าบทความนี้จะเป็นประโยชน์แก่ผู้สนใจในการเริ่มต้นศึกษานิวรอนเน็ตอย่างลึกซึ้งไม่มากก็น้อย อาจจะยาวไปหน่อย แต่ผู้เขียนเชื่อมั่นเป็นอย่างยิ่งว่า การเรียนรู้จากแก่นพื้นฐาน แล้วต่อยอดขึ้นไปเรื่อยๆ เป็นการเรียนรู้ที่ยั่งยืน จริงๆแล้วเราจะจับ ดีฟนิวรอน มาพูดกันเลยก็ได้ แต่นั่นหมายถึง เราอยากที่จะได้แค่ ได้ทำ แต่ขาดความเข้าใจ และ สุดท้าย ไม่วันใดก็วันหนึ่ง ก็จะถึงทางตัน เมื่อเราไม่สามารถแก้ไข ปรับนิวรอนเน็ต ของเราได้อย่างเหมาะ เพราะไม่ได้เข้าใจมันจริงๆตั้งแต่แรก นั่นเองค่ะ ….

Advertisements

2 thoughts on “เปิดม่าน Deep Learning (1) : Neural Network – Perceptron

  1. ขอบคุณครับ อธิบายได้ดีมากเลยได้เข้าใจพื้นฐาน อยากให้เขียนต่อมากๆเลย ^^

    Liked by 1 person

    1. ขอบคุณมากๆนะคะสำหรับรับกำลังใจ กำลังทยอยเขียนต่อค่ะ จะทำเป็นวีดีโอสั้นๆ และ โค้ดด้วยจะได้เข้าใจง่าย และ นำไปประยุกต์ใช้ได้ค่ะ

      Like

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s