บทความนี้ผมเขียนเกี่ยวกับในส่วนของ Neuron และวิธีการเรียนรู้ของ Neural Network ซึ่งจะแบ่งเป็น 2 ส่วน: {Inside the Neuron, How do Neural Networks Learn?} Show
Inside The Neuron จะมี Weight, Bias,และ Activation Function How do Neural Networks จะมี Cost Function, Gradient Descent, และ Backpropagation ซึ่งจะต่อยอดจากบทความที่แล้ว พื้นฐาน Deep Learning (ทฤษฎี): Introสำหรับผู้ที่สนใจที่จะเรียนรู้วิธีการสร้าง Deep Learning Model หรือ Artificial Neural Network, ใน Series…medium.com Recap (+ เพิ่มเติมนิดๆ, ข้ามก็ได้นะ) การทำงานของ Neural Network, โดยเริ่มจาก Layers, ในส่วนของInput Layer จะมีจำนวน Neuron เท่ากับขนาดของ Data, สมมติว่าเรามีภาพขนาด 28*28 pixels, จำนวนของ Neuronใน Input Layer ก็คือ 784 หรือ 28*28 Node พอได้ข้อมูลมาแล้ว, แต่ละ Neuron ใน Input Layer ก็จะส่งตัวเลขของ Input ไปให้ Neuron อื่นๆ ใน Layer ต่อไป หรือใน ANN จะเรียกว่า Hidden Layer โดยในแต่ละ Neuron ใน Hidden Layer จะมีสิ่งที่เรียกว่า Activation Function เพื่อ Transform ค่าทุกค่า ที่ได้รับมาจากทุกๆ Node ใน Layer ก่อนหน้า เพื่อ ส่งต่อไปยัง Layer ต่อไป, แต่, ก่อนที่ทุกๆค่าจะเข้า Activation Function จะต้องมีการ ถ่วงน้ำหนักของค่าแต่ละค่าก่อน หรือ Weight, จะได้ในมารูป (xᵢ*wᵢ) หรือ (Input * Weight) โดย Weight ตอนเริ่มต้นของ แต่ละ Input จะเป็นแบบสุ่ม, และค่อยๆเปลี่ยนแปลงไปเรื่อยๆ เพื่อให้ Fit กับ Data พอถ่วงน้ำหนักเรียบร้อย, จะนำแต่ละค่าที่ถูกถ่วงน้ำหนักมารวมกัน(Sum) และเข้า Activation Function เพื่อ Transform ให้ออกมาเป็นค่า Output และส่งไปยัง Neuron ต่อไป https://intellipaat.com/community/253/role-of-bias-in-neural-networksแต่ถ้าสังเกตจากภาพ จะมีสิ่งที่เรียกว่า Bias โผล่มาด้วย, Bias จะเป็นตัวแปรที่จะเลื่อน Activation Function ไปซ้ายหรือขวาครับ, อ่านแล้วอาจจะงง ผมอธิบายไว้ด้านล่างแล้วครับ ถ้า่มองเป็นสูตรโดยรวม output = activation_function( sum[inputs * weights]+ bias ) Recap ซะยาว และ งงนิดๆ แต่ไม่ต้องกังวลไปครับ เรื่องของ Parameters ผมอธิบายไว้ด้านล่างเรียบร้อย Inside the NeuronWeight & Biasสองตัวแปรนี้ เป็นตัวแปรที่จะเปลี่ยนแปลงค่าตัวเองไปเรื่อยๆระหว่างการ Train เพื่อให้ Fit กับ Data, เรียกว่า Learnable Parameters หรือ Trainable Parameters ซึ่งในทุกๆ Node ใน Neural Network จะมีตัวแปรสองตัวนี้เพื่อคอยปรับค่าของ Input, ซึ่งตอนเริ่มต้นของการ Train, Weight และ Bias จะสุ่มค่ามาก่อน Weightสมมติว่าคุณจะขายรถมือสอง, ราคาที่ลดลงจากมือหนึ่งอาจจะมีผลมาจาก สภาพ และ ระยะทาง(ใช้ขับไปแล้วกี่km) แน่นอนว่า ทั้ง สภาพ และ ระยะทาง จะส่งผลกระทบต่อราคาด้วยขนาดที่ต่างกัน ซึ่งตัวที่บ่งบอกว่า ตัวไหนส่งผลน้อย หรือ มาก เราจะเรียกว่า น้ำหนัก(Weight) หรือง่ายๆ,
ซึ่งในมุมของ Deep Learning, Weight จะเป็นตัวที่ถ่วงน้ำหนักให้ Input ก่อนที่จะเข้าสู่ Node ก็หมายความว่า มันจะเป็นตัวบอกว่า Input ตัวนี้สำคัญแค่ไหน output = activation_function( sum[inputs * weights]+ bias ) Biasจะเป็นตัวแปรที่เข้าไป (+) หรือ (-) ค่าที่ได้หลังจากรวมรวมค่าทุกๆค่าก่อนจะเข้า Activation Function, output = activation_function( sum[inputs * weights]+ bias ) ซึ่งมันจะส่งผลให้ตัว Activation Function เลื่อนไปซ้ายหรือขวา, นั่นก็หมายความว่า, ค่า Output ที่ได้หลังจากผ่าน Activation Function จะเปลี่ยนแปลงไปตาม Bias ด้วย Sigmoid Function(w/o Bias) vs Sigmoid Function(w/ Bias) [Using TI Student Software]ในภาพเคลื่อนไหว สมมติว่า เราใช้ ReLU เป็น Activation Function แล้ว ค่า Weighted Sum ที่เราได้หลังจากรวม (Input*Weight)ทุกค่าแล้ว เท่ากับ (-0.35), ReLU Function(w/o Bias) vs ReLU Function(w/ Bias) [Using TI Student Software]แน่นอนว่า ReLU(-0.35) = 0 นั่นก็หมายความว่า Node นี้จะไม่ทำงาน, ซึ่งมันอาจจะส่งผลดีหรือผลเสียต่อตัว Network หรือเปล่าก็ไม่ทราบ แต่ที่เรามี Bias มา ก็เพื่อมาเปลี่ยนแปลงค่าของ Weighted Sum หรือ (-0.35) ที่เราได้มาจาก sum(inputs*weights) สมมติว่า Bias = 1 , จะได้ว่า ReLU(-0.35 + 1) = ReLU(0.65) = 0.65 ก็หมายความว่า Node นี้ที่มี Bias = 1 และ Weighted Sum = -0.35, จะส่งค่า 0.65 ออกมา, หมายความว่า Node นี้จะทำงาน และส่งค่า 0.65 ไปให้ Node อื่นต่อๆไป Activation FunctionActivation Function, เป็นตัวบ่งบอกหน้าตาของ Neuron ว่า ถ้า Input ผ่านแต่ละ Neuron ใน Layer นี้ ค่าของ Output จะเป็นยังไง, ซึ่งก่อนที่ Input ทุกๆตัวจะถูกส่งไปยัง Node อื่นๆ, จะต้องถูก Transform ให้ได้ค่าที่เหมาะสมก่อน และ ทุกๆ Node ต้องมี Activation Function ถ้าสมมติว่า Neurons ใน Neural Network เราไม่มี Activation Function ล่ะ, มันก็จะเป็นแค่ Linear Function ทั่วไป, output = sum(inputs * weights) + bias และแน่นอนว่า มันจะไม่ช่วยให้ Neural Network เรียนรู้อะไรที่ซับซ้อนของ Data เลย ถ้ามองในมุมของ Classification, ซึ่งแน่นอนว่า ถ้าใช้สมการ y = mx + c หรือสมการเส้นตรง มันทำไม่ได้อยู่แล้ว, How do Neural Networks Learn? หัวข้อนี้ผมนำAnimationส่วนใหญ่มาจากคลิปของ 3Blue1Brown นะครับ 3Blue1Brown3blue1brown, by Grant Sanderson, is some combination of math and entertainment, depending on your disposition. The goal…www.youtube.com เพื่อให้เห็นภาพที่เข้าใจง่ายกว่า สมมติว่าเรามี Neural Network อ้างอิงจากภาพ, Node ที่ขึ้นสีขาวหมายถึง Node นั้นเกิดการทำงาน และส่งค่าไปให้ Node อื่นๆ, ซึ่งจะเห็นได้ว่า แต่ละ Node ในทุกๆ Hidden Layer ไม่ได้เกิดการทำงาน เพราะ ค่า Input หลังผสานกับ Weight และ Bias ไม่ผ่าน Activation Function ของ Node นั้น ต้องเข้าใจก่อนว่า แต่ละ Node ใน Layer นั้นๆ จะจับ Pattern ของ Input นั้นๆ, ซึ่งการที่ตัว Neural Network จะทำแบบนี้ได้ จะต้องมาจากการเรียนรู้ข้อมูลครับ สิ่งที่ Machine Learning Model มีคล้ายๆมนุษย์คือ Experience ครับ การเรียนรู้ข้อมูลก็ถือเป็น Experience และแน่นอนว่า, ด้วย Cost Function (Loss Function, Error Function)Cost Function เป็นฟังก์ชั่นที่ใช้ในการหาค่า Loss (แปลว่าการสูญเสีย) หรือ Cost, ซึ่งค่านี้จะเยอะเมื่อ Neural Network ส่งออกค่าที่ผิดออกมา เหมือนกับว่า กว่าจะได้ Output แบบนี้มา ต้องสูญเสียไปเท่าไร? Cost Function ก็มีหลายแบบเหมือน Activation Function แหละครับ, ลองดูภาพนี้ครับ https://www.youtube.com/watch?v=IHZwWFHWa-w&t=128sในภาพนี้ คือเมื่อตอนที่ Neural Network กำลัง Train กับรูปเลข 3, นี่คือ Output Layer ของ Neural Network ที่กล่าวถึงไว้ด้านบน ทางซ้าย(กรอบสีเหลือง) คือ Output Layer ตอนที่ส่งออกค่า หลังจากได้รับรูปเลข 3 ไป, ทางขวาคือ Output Layer ที่ควรจะเป็น, สังเกตได้ว่า มีเฉพาะ Node ของเลข 3 ที่ทำงาน, ในขั้นนี้จะอยู่ในช่วงคำนวณครับ ค่าที่ถูกส่งออกมา จะถูก ลบ ด้วย ค่าที่ควรถูกส่งออกมา นั่นก็หมายถึง ถ้า Output ถูก ค่าก็จะน้อย, Output ผิด ค่าก็จะเยอะ เสร็จแล้วก็นำ (y- ŷ)² ของทุก Node มารวมกัน ซึ่งหลังจากผ่านขั้นตอนนี้ไปแล้ว ก็จะได้ Cost ของรูปๆนั้นมาครับ, https://www.youtube.com/watch?v=IHZwWFHWa-w&t=128sและแน่นอนว่า ถ้าหาก Output ออกมาถูกต้องตามความต้องการ ค่า Cost ก็จะน้อย ตาม Loss Function (MSE) จะต้องนำค่า (y- ŷ)² มาถึงตอนนี้, ต้องเข้าใจก่อนครับว่า Loss Function จะใช้กับค่า Output ของแต่ละ Node ใน Output Layer, จึงจะสามารถนำไปคำนวณค่า Weight ที่ควรจะเป็นได้ ด้วย Gradient DescentGradient Descent เป็นวิธีการในการคำนวณหา จุดที่ต่ำที่สุด ของ Function นั้นๆ ด้วยการ Derivative (การหาความชัน) ของทีละจุดแล้วค่อยเลื่อนไปในจุดที่ต่ำกว่า ไปจนถึงจุดที่ต่ำที่สุด ที่เป็นไปได้, จุดที่ต่ำที่สุดจะมี 2 แบบครับ: Global Minimum(จุดที่ต่ำที่สุดจริงๆ) และ Local Minimum(จุดที่ต่ำที่สุด ในระแวกนั้นๆ), การที่จะหา Global Minimum มันยากกว่าการหา Local Minimum อยู่แล้ว เพราะบางที Gradient Descent Algorithm อาจมองLocal Minimumเป็นจุดที่ต่ำที่สุดจริงๆ
(ถ้าเจอ Mojibake หรือตัวอักษรเพี้ยน,
“Gradient” หมายถึงทิศทางที่จะมีความชันสูงขึ้น
ถ้าลองใช้ Gradient Descent Algorithm กับ ฟังก์ชั่นตัวแปรเดียว ( 1 Parameter) f(x) = x⁴-3x³+2 ซึ่งค่า Global Minimum อยู่ที่ 2.25 (ตามทฤษฎีของ Fermat) Machine Learning หน้า 108, ผศ.ดร. ปริญญา สงวนสัตย์หากลองใช้ จะพบ Local Minimum ที่ ~2.21 ซึ่ง ต่างจาก 2.25 อยู่ ~1.68% แต่ถ้าหากลองใช้ จะพบ Local Minimumที่ ~2.251 ซึ่งต่างจากค 2.25 อยู่ ~0.04% ถ้าเราลองเปรียบเทียบ Learning Rate กับการ เดินทาง, แน่นอนว่า ถ้าเราเดินแล้วแวะหลายๆที่ (Learning Rate ต่ำ) แต่ ถ้าเราเดินแล้วแวะไม่กี่ที่ (Learning Rate สูง) ถ้าสังเกตจากรูปด้านบนทั้งสองรูป,แกน Y จะเป็นผลลัพท์ของ f(x) / แกน X จะเป็นค่าของ ( x )
ในมุมของ Deep Learningการ Gradient Descent จะใช้กับ Cost Function เพื่อเปลี่ยนแปลง Weight และ Bias, นั่นก็หมายถึง
แต่เป็น Weight และ Bias ของ ทุกๆ Layer ที่ส่งผลให้ค่าของ Input เปลี่ยนแปลง, เพราะฉะนั้น จะไม่ใช่เพียงแค่ 1 Parameter (1D) แน่นอน, และการที่จะเปลี่ยน Weight และ Bias ของทุกๆ Node, จะต้องใช้วิธีการ Backward Propagation (Backpropagation)คำว่า Propagate แปลว่า {เผยแพร่, ส่งต่อ, ถ่ายทอด}, ในมุมของ Deep Learning, จะมีขั้นตอน Forwardpass(Forward Propagation) ซึ่งขั้นตอน Forward Propagation ก็เป็นขั้นตอนที่ทำให้ Neural Network ส่งต่อ Input ไปข้างหน้า ทีละ Layer จนได้ Output ออกมา Backward Propagation เป็นขั้นตอนที่จะใช้ร่วมกับ ลองนึกถึงตอนที่ Neural Network เรากำลังโง่อยู่ แล้วให้ Output ตอนกำลัง Train กับรูปเลขสองแบบมั่วๆ https://www.youtube.com/watch?v=Ilg3gGewQ5U&t=20sสิ่งที่เราต้องการคือ, เราต้องการให้ค่า Output ของ Node เลข 2 สูงขึ้น และขนาดของลูกศร ที่แสดงไว้ในภาพเคลื่อนไหว ก็หมายถึง เราต้องการเปลี่ยนแปลงค่า Output ของ Node นั้นๆ มากแค่ไหน, สูงขึ้นหรือต่ำลง นั่นก็บ่งบอกถึง การที่จะ เพิ่มค่าของ Node เลข 2 สำคัญกว่า การลดค่าของ Node เลข 8 มากๆ ซึ่งมันก็ส่ง Output มาในค่าที่มันควรจะเป็นแล้ว, ทีนี้ ลองมาสังเกตที่ Node ของ เลข 2 (Node ที่เราต้องการให้ค่า Output เพิ่ม) Outputนี้(0.2) ได้มาจาก activation_function( sum[inputs * weights]+bias ) การที่เราจะเพิ่มค่า Output ของ Node นั้นได้ ก็ต้องมาจากการเพิ่ม Weight และ Bias สังเกตที่ Node ของ Hidden Layer 4 Nodeนั้น จะมีผลมากที่สุดในการเปลี่ยนแปลงค่าของ Node เลข 2 เพราะฉนั้นก็หมายความว่า หากเปลี่ยนแปลง Weight และ Bias ให้ 4 Node นี้ จะทำให้ Output ของเลข 2 เปลี่ยนแปลงไปอย่างมาก ส่งผลใน Error เปลี่ยนแปลงไปอย่างมากเช่นกัน ซึ่งจะดีหรือไม่ เปรียบเสมือนกับคำว่า แต่ก็ไม่ใช่ว่าจะต้องเปลี่ยนแค่ 4 Node นั้น, สำหรับ Node ที่มี Weight เป็น (-), และ Node ที่มี Weight เป็น (+), การที่ค่า Weight และ Bias นี่เป็นเพียงแค่ ความต้องการที่จะให้ค่า Output ของ Nodeเลข2 เพิ่มขึ้น เรายังมีค่าของ Output Nodes อื่นๆที่ต้องการให้ลดลงเช่นกัน ทำด้วยวิธีเดิม กับทุกๆ Node ไปเรื่อยๆจนจบ แล้วก็นำค่าของการเปลี่ยนแปลงทุกๆค่า ของ Node นั้นๆมารวมกัน และก็ทำวิธีเดิมซ้ำกับ Layer ก่อนหน้า ไปเรื่อยๆ จนถึง Input Layer และจะได้ค่า Weight ทุกๆอันมา และนั่น ก็เป็นเพียงสำหรับ รูปเลข 2 รูปเดียวเท่านั้น, แล้วก็นำค่าของ Weight และ Bias ของ Node นั้นๆ มาหาค่าเฉลี่ย และ Update ค่านั้น, ซึ่งนั่นก็คือค่าของแต่ละ Parameter ในวิธีการ Gradient Descent นั่นเอง ซึ่งค่าเหล่านี่ จะเป็นค่าของ Weight และ Bias(ไม่มีในภาพ) ที่จะถูกเปลี่ยน. มาถึงจุดนี้แล้ว ผมอยากให้รู้จักคำสำคัญๆ เช่น epoch และ batch ไว้หน่อย, Epoch หมายถึง จำนวนครั้งในการที่จะให้ตัว Neural Network เรียนรู้ Data นั้นๆ ทั้งหมดตั้งแต่หัวจรดเท้า, Batch หมายถึง ชุดของข้อมูล ที่ถูกแบ่งออกมาเป็นชุดๆ จากข้อมูลทั้งหมด , ที่ผมพูดถึง 2 คำนี้ ก็เพราะมันมีผลต่อการ Update Weight & Bias และการ Train และแน่นอน ถ้าใช้วิธีการ Backpropagation กับ Batch Gradient Descent(วิธีที่ใช้ในรูปด้านบน) จะต้องใช้เวลานานมาก เพราะต้องคำนวณ Weight และ Bias ของทุกๆ หInput ที่มี Gradient Descient แบ่งเป็น 3 ประเภทBatch Gradient Descent Stochastic Gradient Descent Mini Batch Gradient Descent ถ้าลองรวบรวมทุกอย่าง แล้วอธิบายเริ่มจาก, Neural Network เราจะแบ่งเป็น Layer 3 ชนิด แบ่งเป็น Input, Output, และ Hidden Layer Activation Function จะเป็นหน้าตาของ Node, Output layer จะใช้ Softmax ถ้าใช้เพื่อการ Classification, Neural Network จะแบ่งเป็น 2 ขั้นตอน Forward และ Backward การทำให้ Neural Network Fit กับ Data หรือ การเรียนรู้ของ Neural Network, ค่า Error หรือ Cost หรือ Loss หาด้วย Cost(Error, Loss) Function ซึ่งเป็นค่าที่บ่งบอกถึงความผิดพลาดที่ได้จากการ Train การหาค่า Parameters ที่จะทำให้ Error ลดลงได้ จะต้องใช้วิธี Gradient Descent เพื่อหา ค่า Weight และ Bias ที่ทำให้อยู่จุดที่มีค่า Error ต่ำที่สุดเท่าที่เป็นไปได้ Backward Propagation ใช้วิธีการ Gradient Descent เพื่อหาค่า Parameters ที่ทำให้ ค่า Error ลดและจำนำไป Update กับทุกๆ Parameters เท่านี้ก็ถือว่าเรียบร้อย เพิ่มเติม หลายๆการกระทำในบทความนี้ใช้ Calculus(โดยเฉพาะ Backpropagation) ถ้าสนใจศึกษาเพิ่มเติม ผมแนะนำให้ไปลองดูคลิปของคุณ 3Blue1Brown ครับ
|