Backpropagation

Pisit Bee
Boobee
Published in
4 min readMay 9, 2018

Backpropagation เป็น วิธีการที่สำคัญในการเรียนรู้ของ Neural network ครับ ใครทำ Neural Network แล้วจะไม่รู้จัก Backpropagation นี่ไม่ได้เลยครับ

Backpropagation เริ่มจากเราต้องการหา ค่า Error ที่คำนวนได้จาก output ของ Neural Network นำมาเปรียบเทียบกับ target ที่เราคาดหวังไว้ เมื่อได้ค่า Error ก็จะ แพร่ค่า Error ที่ได้กลับไปยังผู้มีส่วนเกี่ยวข้อง ในที่นี้คือ ค่า weight ต่างๆ Weight ใดให้ค่าน้ำหนักมา ก็จะได้รับผลกระทบของการปรับไปมาก Weight ใดให้ค่าน้อยก็จะได้รับผลกระทบ ไปน้อยๆ เช่นกัน เหมือนๆ หาคนรับผิดชอบที่ทำให้ค่า output มันไม่เท่ากับ target นะครับ

ทีนี้ขอเริ่มจาก เรามี Neural Net แบบตัวอย่าง ด้านล่างนี้ครับ ผมจะพยายาม ล้อกับบทความนี้ นะครับ https://mattmazur.com/2015/03/17/a-step-by-step-backpropagation-example/ ใครอยากอ่านต้นฉบับภาษาอังกฤษตามเข้าไปอ่านได้เลยครับ

source : https://mattmazur.com/2015/03/17/a-step-by-step-backpropagation-example/

ทีนี้จะเห็นว่า เรามี input อยู่ 2 ค่า คือ 0.5 และ 0.1 จาก i1 และ i2 กำหนดค่า Weight w1,w2,…w8 เป็นค่าดังรูปนะครับ ส่วน output เราตั้ง target ไว้ที่ output 1 เป็น 0.01 ส่วน output 2 เป็น 0.99

ทีนี้เราลองมาคำนวนค่า output จริงๆ ที่ได้จาก neural net กันครับ เริ่มจาก ค่า output ที่ได้จาก h1 ก่อน ค่าที่ได้จาก

h1 = i1*w1 + i2*w2 + b1 = 0.05*0.15 + 0.1*0.2 + 0.35 = 0.3775

netout_h1 = sigmoid(h1) = sigmoid(0.3775) = 1/(1+e^(-0.3775)) =0.59326

คำนวน h2
h2 = i1*w3 + i2*w4 + b1 = 0.05*0.25+0.1*0.3+0.35=0.3925

netout_h2 = sigmoid(0.3925) = 0.59688

ทำการคำนวน แบบเดิมครับ เพื่อหา O1 และ O2 ขอข้ามตัวอย่างการคำนวนไปนะครับ จาก netout_h1 จะกลายเป็นค่า input ของชั้นถัดไปแทน ทำลักษณะคล้ายๆ เดิมครับ อย่าไปเคลียด ค่อยๆ อ่าน จาก netout ทั้ง 2
netout_h1= 0.59326
netout_h2= 0.59688

O1 = h1*w5 + h2*w6 + b2= 0.59326*0.4 + 0.59688*0.45 +0.6= 1.1059

netout_O1 = sigmoid(1.1059) = 1/(1+e^(-1.1059)) = 0.75136

O2 = h1*w7 + h2*w8 + b2 = 0.59326*0.5 + 0.59688*0.55 +0.6 = 1.2249

netout_O2 = sigmoid(1.2428) = 1/(1+e^(-1.2249)) = 0.7729

เมื่อได้ output ของแต่ละ กิ่งแล้วคือ o1 และ o2 เรามาหา Error กันครับ ซึ่ง ค่า Error หาได้จาก

จากรูป ลองดูที่ตัวเลขสีฟ้า ที่ปลาย ของ O1 และ O2 ครับ สังเกตุว่า O1 เราได้ 0.75136 ซึ่งเราอยากได้ 0.01 ส่วน O2 เราอยากได้ 0.99 แต่คำนวนได้ 0.77292 ดังนั้น หา Error ของทั้งระบบ
E_total = ((0.75136 - 0.01)² + (0.77292–0.99)²)/2

The Backwards Pass

เมื่อเราได้ Error มาแล้วเราจะต้องหา ผู้รับผิดชอบที่ทำให้ เกิด Error ดังกล่าวครับ แบ่งๆ กันรับผิดไป ใครลงมากก็รับกรรมไปมาก ใคร Weigh น้อย แบ่งไปน้อยๆ ตามกำลังศรัทธา

มาพิจารณา Weight แต่ละตัวเรามี Weight ทั้งหมด 8 ตัวและ 2 bias ที่ต้องรับผิดชอบ ผลของ Error ดังกล่าว ดังนั้นเราจะต้องปรับ ทีละตัว ( ไหวไหม ?? ไม่ไหวครับ ขอยกแค่ w8 ละกันครับ) ลองปรับ w8 กันก่อนครับ ดังนั้นเราจะหาค่า gradient ที่จะต้องทำการปรับ เราก็ Diff Error เทียบกับ w8 เลยครับ ดูว่า ค่า gradient เป็นเท่าไร

ด้านบน เป็น partial diff ของ error เทียบกับ w8 ที่เราจะปรับครับ แต่ๆๆ สมการ Error ไม่มี parameter ของ w8 อยู่เลย ทำไงดีครับ เรายังจำ chain rule ตอนมัธยมปลายได้อยู่ หรือป่าว เอามาใช้ครับ ดังนั้นจะเขียนได้เป็นสมการดังนี้

งัดทีละตัวครับ อย่าเพิ่งตกใจ ตัวแรกก่อน จาก E_total สมการบน นะครับ กระจายได้เป็นแบบนี้

จากนั้นก็ partial diff ตรงไหนที่ไม่ใช้ netout_O2 มองเป็นค่าคงที่ diff ค่าคงที่ ก็ ได้ 0 ดังนั้น term ด้านหน้ากลายเป็น 0 ครับ ทีนี้พิจารณาตัวหลัง จะเห็นว่า diff ได้ก็ดิฟ (อย่าลืม diff ใส้ด้วย) จะออกมาเป็นหน้าตาด้านบนครับ จากนั้น แทนค่าครับ รออะไร

ได้มา 1 term แล้วครับ จากนั้นทำ term ถัดไป

สำหรับตัวนี้พิเศษหน่อยเดี๋ยวว่างๆ จะ prove ให้นะครับ diff sigmoid จะได้ sigmoid(1-sigmoid)

Term สุดท้าย เหนื่อยแล้ว

ดังนั้นจาก สมการ

เราสามารถ หาค่า อัตราการเปลี่ยนแปลงของ W8 ได้

ทีนี้ เพื่อที่จะลดค่า Error ให้ต่ำที่สุดเราก็ต้องนำไปปรับให้กับ ค่า W8 ของเรา จาก SGD (stochastic gradient descent) โดยให้ learning rate = 0.5 ครับ

ดังนั้น w8 ใหม่ของเราจะมีค่า 0.5613 ซึ่งมากกว่าเดิม มานิดนึงเพราะ ค่า netout_O2 มันน้อย ไม่ถึง 0.9 ก็เลยต้อง upweight ขึ้นมาทีละหน่อยๆ ไปครับ
จากนั้นก็ทำการหารค่า W7 ,W6, W5 เมื่อได้ค่าครบ ก็ ลงไปทำชั้นถัดไปคือหา W4 W3 W2 และ W1 ในชั้นที่ลึกๆ กว่า

ทั้งหมดก็มีเพียงเท่านี้สำหรับการปรับ Weight ด้วย Backpropagation ครับ หวังว่าจะมีประโยชน์ ไม่มากก็น้อยครับ แล้วพบกันใหม่โอกาส หน้า สวัสดีครับ

--

--