Bayesian Neural Network (ตอนที่ 3): อะไรคือ Deep Learning และอะไรคือ Neural Network — ฉบับมือใหม่
- ตอนที่ 1 ทฤษฎีความน่าจะเป็นแบบเบย์ๆ — https://goo.gl/DkC22U
- ตอนที่ 2 ช้าก่อน!! มาทำความเข้าใจเรื่อง Machine Learning กันก่อน — https://goo.gl/2vEHKm
- ตอนที่ 3 อะไรคือ Deep Learning และอะไรคือ Neural Network ฉบับมือใหม่ — https://goo.gl/yjTsLs
- ตอนที่ 4 Model ที่เรียนรู้ด้วย Probabilistic Distribution — https://goo.gl/UM3bDD
ในช่วงวันที่ 9–15 มีนาคม 2016 มีอีเวนท์การแข่งขันหนึ่งที่คนทั่วโลกต่างให้ความสนใจ นั่นคือเกมหมากล้อม (Go) ระหว่างอดีตแชมป์โลกของวงการหมากล้อม Lee Sedol (เข้าใจว่าในตอนนั้นแชมป์โลกจริงๆ แล้วคือ เค่อ เจี๋ย นักหมากล้อมชาวจีน) กับโปรแกรมคอมพิวเตอร์ที่ชื่อว่า AlphaGo ในตอนนั้นโลกได้เห็นถึงพลังของ Machine Learning จนทำให้หลายคนหันมาให้ความสนใจกับสิ่งนี้
ผมก็เป็นหนึ่งในนั้นครับ สำหรับผมแล้ว เหตุการณ์นั้นมันเป็น Rise of Deep Learning (ซึ่งจริงๆ แล้วมีอีกหลายเหตุการณ์ในวงการวิจัยที่เหมาะสมกับคำนี้มากกว่า) คนเริ่มสนใจกันว่า อะไรคือ Deep Learning กันแน่ เพราะที่ผ่านมาเกมหมากล้อมเป็นเกมที่มนุษย์คิดว่า ไม่น่าจะมีโปรแกรมคอมพิวเตอร์ไหนที่จะสามารถเอาชนะมนุษย์ได้ หรือถ้าทำได้ก็คงไม่ใช่เร็วๆ นี้หรอก นั่นก็เลยทำให้ Deep Learning ที่เป็นคำที่ DeepMind (ทีมผู้สร้าง AlphaGo) ใช้อธิบายถึงวิธีการคิดของโปรแกรม กลายเป็นคำที่ได้รับความสนใจอย่างมากเลยทีเดียว
Deep Learning ที่แล้วเป็นคนที่ค่อนข้างจะเป็น Buzzword คือคนเรามักใช้โฆษณาให้ดูน่าสนใจ ความจริงแล้วเราสามารถเรียกมันด้วยคำที่บอกความหมายได้ชัดเจนกว่า นั่นคือ Deep Artificial Neural Network หรือก็คือ Neural Network ที่มีมากกว่า 1 ชั้นเป็นต้นไป แล้วชั้นที่ว่านี้มันคืออะไรหล่ะ ??
Remark: ที่จริงแล้วเทคโนโลยีที่ AlphaGo ใช้คือ Reinforcement Learning และ Monte Carlo Tree Search แต่ Deep Artificial Neural Network เป็นส่วนหนึ่งในการทำงานของ Reinforcement Learning ไว้ถ้ามีเวลาจะมาเล่าเรื่องนี้ให้ฟังอีกทีครับ
Artificial Neural Network โครงข่ายประสาทเทียม
ในตอนที่ 2 (https://goo.gl/dZnK7n) เราได้ทำความเข้าใจ Linear Regression กันเป็นที่เรียบร้อยแล้ว ซึ่งที่อธิบายไปทั้งหมดนั้นก็เพื่อที่จะเป็นพื้นฐานให้สามารถเข้าใจเทคนิคที่ซับซ้อนขึ้นมาเล็กน้อย นั่นก็คือ Neural Network นั่นเองครับ
Neural Network หรือที่เรียกเป็นภาษาไทยว่าโครงข่ายประสาทเทียม ซึ่งเมื่อได้ยินแล้วก็คงนึกภาพไม่ออกหรอกครับว่ามันเกี่ยวข้องกับเทคโนโลยีทางคอมพิวเตอร์ยังไง เพราะชื่อมันออกจะชีววิทยาขนาดนั้น
เจ้า Neural Network มันคือการที่เราเอาเทคนิคการพยากรณ์ด้วยสมการเชิงเส้น มาใช้ต่อกับหลายๆ ตัว และหลายๆ ชั้นนั่นเองครับ
ซึ่งการที่มันต่อกันแล้วเนี่ย มันทำให้มันได้อะไรขึ้นมางั้นเหรอ ??
ใช่แล้วครับ คำตอบก็คือ มันทำให้การ Prediction ที่จากเดิมอ้างอิงจากเส้นตรงเส้นเดียว กลายร่างเป็นเส้นตรงหลายๆ เส้นที่ช่วยให้ Prediction ทำได้อย่างละเอียดมากขึ้นกว่าเดิม และแม่นยำกว่าเดิมครับ
ส่วนประกอบของ Neural Network
จากภาพที่ 2 จะเห็นว่าส่วนประกอบของ Neural Network มี 3 ส่วน
- Input Layer ที่ชั้นนี้จะเป็นข้อมูล input ของเรานั่นเองครับ จำนวนของโหนดขึ้นอยู่กับจำนวนของ input ของเรา ว่ามีข้อมูลอะไรบ้างที่เรานำเข้ามาคิดในโมเดล เช่น ถ้าข้อมูลของลูกค้าเป็น input ของเรา ซึ่งประกอบด้วย อายุ เพศ จังหวัดที่อาศัย รวมทั้งสิ้น 4 อย่าง input layer ก็จะมี 4 โหนด (ปกติแล้วใน Machine Learning เราจะเรียกปัจจัยที่นำมาวิเคราะห์เหล่านี้ว่า feature)
- Hidden Layer เป็นชั้นที่อยู่ระหว่างกลาง ซึ่งจะมีผลอย่างมากต่อประสิทธิภาพในการเรียนรู้ของโมเดล ซึ่ง hidden layer นั้นจะมีกี่ชั้นก็ได้ แล้วแต่ผู้สร้างเลยครับ แล้วแต่ละชั้นจะมีจำนวนของ Neuron เท่าไหร่ก็ได้เช่นกัน ซึ่งการเพิ่มชั้นและจำนวน neuron ก็จะส่งผลต่อการทำงานของโมเดล ในส่วนของ hidden layer มีการทำงานเปรียบเสมือนส่วนที่เรียนรู้ข้อมูลเชิงลึก หรือ deep learning นั่นแหละครับ โดยสิ่งสำคัญใน hidden layer อีกอย่างหนึ่งคือ ทุกๆ โหนดต้องประกอบด้วย nonlinearity function ด้วย ซึ่งจะมาพูดถึงภายหลังครับ
- Output Layer ชั้นที่เราจะนำเอาข้อมูลจากการคำนวณไปใช้ จำนวนของโหนดในชั้นนี้ ขึ้นอยู่กับรูปแบบของ output ที่เราจะเอาไปใช้ ซึ่งถ้ายกตัวอย่างง่ายๆ เช่น ถ้างานที่เราทำเป็น Regression ก็กำหนดให้ output layer เป็นแบบ 1 โหนด เพราะต้องการคำตอบค่าเดียว ถ้าเป็นหลายค่าก็เพิ่มไปตามที่ต้องการ เช่น ในบางงานเราอาจจะ predict หาตำแหน่งของภาพในแกน x และ y พร้อมๆ กัน ในกรณีนี้เราก็ใส่ output layer เป็น 2 โหนดไปซะ เป็นต้น
Prediction ที่คำนวณจาก Neural Network (Forward Propagation)
ถ้ายังพอจำได้ จากตอนที่แล้วที่เราพูดเรื่อง Linear Regression กันไป จำได้ไหมว่าหลักการมันก็คือ การเอาข้อมูลไปคูณกับ weight แล้วบวกกับ bias :
predicted_Y = w * X + bias
bias คือตัวเลขที่บวกเข้าไปเพื่อปรับให้ค่าที่คำนวณออกมาถูกต้องมากขึ้น โดยค่านี้จะไม่ขึ้นอยู่กับ X ใดๆ เป็นตัวแทนของ “ธรรมชาติของข้อมูล”
ตัวอย่างเช่น การพยากรณ์มูลค่าของบ้าน โดยใช้ระยะห่างจากสถานีรถไฟฟ้า ซึ่งเราอาจจะมีสมมุติฐานว่า ยิ่งระยะทางห่างมากขึ้น มูลค่าบ้านก็ยิ่งลดลง ดังนั้น w ในสมการก็จะเป็นค่าติดลบค่าหนึ่ง ซึ่งสมการที่ได้ก็คือ
มูลค่าบ้าน = w * ระยะห่างสถานี + bias
ซึ่งในกรณีที่เรามีข้อมูล X มีปัจจัยมากกว่าหนึ่งอย่าง เช่น ถ้าเรารู้ว่าปัจจัยที่มีผลต่อราคานั้นไม่ได้มีแต่เพียงระยะห่างจากสถานีรถไฟฟ้าเท่านั้น ยัง feature อื่นอีก ทั้ง area ของบ้าน จำนวนชั้น จำนวนห้องนอน เป็นต้น ซึ่งสมการก็คือ
มูลค่าบ้าน = w1*ระยะห่างฯ + w2*area + w3*จำนวนชั้น + w4*ห้องนอน + bias
เมื่อเราลองวาดเป็นภาพ ก็จะได้ประมาณนี้ครับ
การปรับค่า weight เพื่อ optimize สมการนี้ก็ทำได้ด้วยการ differentiation (แคลคูลัส ม. 6 กลับมาอีกครั้ง!!) ซึ่งพูดไปแล้วในครั้งที่แล้วครับ ซึ่งในกรณีของ X แบบที่มีหลาย feature เราใช้วิธี Partial Differentiation โดยเทียบตัวแปร weight ทีละตัว เช่น เริ่มจาก diff เทียบ w1 เพื่อปรับค่า w1 แล้วก็ diff เทียบ w2 เพื่อปรับค่า w2 และทำไปเรื่อยๆ จนครบ (รวมถึง bias ด้วยนะครับ)
Neural Network ก็มีวิธีการคิดแบบเดียวกัน แต่เพิ่ม Hidden layer เข้ามาตรงกลาง ซึ่งจะได้โครงสร้างประมาณนี้
และแน่นอนว่าต้องไม่ลืม bias ที่ hidden layer ด้วย
การคำนวณในส่วนของ hidden layer ก็คล้ายกับสมการด้านบนเลย นั่นคือเราจะมีสมการเชิงเส้นที่ต่อเข้าไปในแต่ละจุดวงกลมใน hidden layer โดยแต่ละจุดจะมี weight ของตัวเอง โดย weight ของแต่ละ node จะมีค่าเริ่มต้นที่สุ่มขึ้นมาไม่เหมือนกัน
วิธีการคำนวณก็คือ ให้เราเอาค่า input แต่ละตัวคูณกับ weight แต่ละเส้นที่เชื่อมต่อกับตัวเอง แล้วเอาผลลัพธ์มารวมกัน (Summation)
เมื่อเราได้ผลลัพธ์มาแล้ว เราจะนำค่านั้นไปผ่าน nonlinearity function เพื่อสร้างเป็น information ส่งไปให้ layer ถัดไป function นี้เราเรียกว่า ในตัวอย่างนี้เลือกใช้ nonlinearity function ที่ชื่อว่า Rectified Linear Unit (ReLU) ฟังก์ชันนี้ง่ายมากๆ ครับ
relu(x) = max(0, x)
หรือก็คือ เมื่อเอาค่าใดๆ เข้าฟังก์ชันนี้แล้ว ถ้าค่านั้นน้อยกว่า 0 ผลลัพธ์จะออกมาเป็น 0 แต่ถ้ามีค่ามากกว่า 0 ผลลัพธ์ก็จะออกมาเป็นค่า x นั้นๆ เลย เช่น
relu(10) = 10
relu(-5) = 0
Nonlinearity Function
นอกจาก ReLU แล้ว ยังมีอีกหลายฟังก์ชันที่เราสามารถใช้ได้ตรงตำแหน่งนี้ แต่ที่ได้รับความนิยมที่สุดในปัจจุบันก็คือ ReLU เพราะว่าได้เปรียบในเชิงแคลคูลัส ในตอนที่โมเดลเรียนรู้เพื่อปรับค่า weight จะทำได้เร็วกว่าแบบอื่นๆ แต่ก็จะขอนำเสนอฟังก์ชันอื่นๆ ที่เคยได้รับความนิยม และยังนิยมอยู่บ้างในบางงานครับ
- Sigmoid เป็นฟังก์ชันที่เปลี่ยนค่าทั้งหมดบนเส้นจำนวนให้กลายเป็นช่วง (0, 1) สมการคือ sigmoid(x) = 1/(1+e^(-x))
- Tanh ทำงานคล้าย sigmoid แต่เปลี่ยนช่วงของ output เป็น (-1, 1) สมการคือ tanh(x) = (2/(1+e^(-2x))) - 1
วิธีการที่ Neural Network ใช้ในการเรียนรู้ข้อมูล (Back Propagation)
การเรียนรู้ของโมเดลเกิดขึ้นเมื่อเราเอาค่าที่ได้จากการคำนวณในส่วน forward propagation มาเทียบกับค่าของ output ที่เกิดขึ้นจริง (Ground Truth) ค่าความผิดพลาดที่เกิดขึ้นเราเรียกได้หลายชื่อ ไม่ว่าจะเป็น Loss, Error หรือ Residual
มาถึงตรงนี้โมเดลก็เหมือนกับคนเลยครับ เมื่อ loss แล้วจึงเรียนรู้ ก็คือเรียนรู้เอาจากความผิดพลาด
วิธีการก็เหมือนกับโมเดล linear regression ครับ ที่โมเดลของเราจะปรับ weight เพื่อให้คำนวณผลลัพธ์ได้แม่นยำมากขึ้น โดยดูจากการ differentiation ค่า loss เทียบกับค่า weight แต่ละตัว
วิธีการตรงนี้ฟังดูยากและซับซ้อนครับ แต่จริงๆ ก็ไม่ได้มีอะไร แค่เรา diff แล้วก็ diff ไปเรื่อยๆ ครับ
องค์ความรู้ที่โมเดลได้รับ
สุดท้ายแล้วองค์ความรู้ที่โมเดลของเราได้รับมานั้นก็คือ weight ที่ทำการปรับเรียบร้อยแล้ว ซึ่งเป็น weight ที่เมื่อใช้คำนวณ forward propagation แล้วจะเกิด loss น้อยที่สุด (ก็คือมีความคลาดเคลื่อนไปจากความจริงน้อยที่สุดนั่นเอง)
มีอะไรในตอนต่อไป
ตอนหน้าจะเป็นตอนที่พูดถึง Bayesian Neural Network จริงๆ ซะที หลังจากที่ใช้เป็น Marketing word หลอกให้คนสนใจมานาน
แนวคิดคร่าวๆ คือ ใน Neural Network ธรรมดาเนี่ย เราจะนึกภาพว่า weight แต่ละค่าคือค่าคงที่ค่าหนึ่งที่ชัดเจนไปเลย (Deterministic) แต่ใน Bayesian Network นั้นเราจะเลิกทำแบบนั้น แล้วเปลี่ยนมาเรียนรู้ความเป็นไปได้ในการเกิดค่า weight ต่างๆ แทน (Probabilistic) จะเป็นอย่างไรนั้น ติดตามตอนต่อไปนะครับ