Back-propagation ของ Convolution Layer

Part 1  Chain Rule

ถ้ามีสมการ

y=c×(a+b)

เราอาจเขียนใหม่ได้เป็น

x=a+b
y=c×x

แปลความออกมาในรูปของ computational graph ก็จะได้





ถ้ากำหนดให้ a = 1, b = 2, c = 3 แล้วท่อง graph นี้จากซ้ายไปขวา หรือ เรียกว่าแบบ "feed forward" ผลลัพธ์หรือค่าของ y จะเป็น  9




ที่นี้กลับมามองในมุมมองของการ train neural network บ้าง หากค่าที่ได้จากการสังเกตุจริง ค่าของ y เป็น 12 (ในขณะที่ค่าจากการคำนวณเป็น 9) เราจะสามารถคำนวนค่าความผิดพลาดนี้ได้จาก

e=912=3


ความผิดพลาดนี้ย่อมมาจากความผิดพลาดของ x และ c  แต่จะโทษแต่ x และ c ไม่ได้ เพราะ x เกิดจาก a และ b ด้วย ดังนั้นควรแบ่งความรับผิดชอบกันไปทั่วหน้า เริ่มต้นต้้งแต่ปลายทางย้อนกลับไปยังจุดเริ่มต้น เรียกวิธีการคิดแบบนี้ว่า feed backward หรือ back propagation แต่จะให้รับผิดชอบกันอย่างไร เราใช้หล้กการของ partial derivative มาช่วย

e=cx12
ex=cxx12x
ex=c

ทำนองเดียวกันจะได้
ec=x



และ X  = a + b ดังนั้น คำถามต่อไปคือ ea=?,eb=?




คำตอบคือ "chain rule"
ea=exxa

ea=c(a+b)a

ea=c[aa+ba]

ea=c

และทำนองเดียวกัน

eb=exxb
eb=c

บทบาทของ Chain rules อาจพอสรุปได้ตามแผนภาพต่อไปนี้


Data และ Weight ถูกนำเข้าไปใน Neuron เพื่อสร้าง Output (Z) หรือ f(X,W) = Z 



ขั้นตอนการทำ back propagation เริ่มต้นการหาคา local gradient ด้วย partial derivative ของทั้ง Data และ Weight


คำนวณหาอิทธิพลของตัวแปรแต่ละตัวใน Neuron โดยการหาผลคูณระหว่าง global gradient กับ local gradient 


Part 2  Convolution

ความหมายของ Convolution จาก Wiki :

"In mathematics (and, in particular, functional analysisconvolution is a mathematical operation on two functions (f and g) to produce a third function that expresses how the shape of one is modified by the other. The term convolution refers to both the result function and to the process of computing it."

ถ้าเรามี 2  Matrix  คือ X ขนาด 5x5 และ W ขนาด 3x3 ซึ่งจะเรียก X ว่าเป็น matrix ของข้อมูลที่จะถูกนำมาทำ convolution กับ matrix W

เราจะนิยาม matrix O ซึ่งเป็นผลลัพธ์จากการทำ convolution ระหว่าง X กับ W ดังนี้

โดย

O11=X11W11+X12W12+X13W13+X21W21+X22W22+X23W23+X31W31+X32W32+X33W33

O12=X12W11+X13W12+X14W13+X22W21+X23W22+X24W23+X32W32+X32W32+X34W33

O13=X13W11+X14W12+X15W13+X23W21+X24W22+X25W23+X33W32+X34W32+X35W33

O21=X21W11+X22W12+X23W13+X31W21+X32W22+X33W23+X41W32+X42W32+X43W33

O22=X22W11+X23W12+X24W13+X32W21+X33W22+X34W23+X42W32+X42W32+X44W33

O23=X23W11+X24W12+X25W13+X33W21+X34W22+X35W23+X43W32+X44W32+X45W33

O31=X31W11+X32W12+X33W13+X41W21+X42W22+X43W23+X51W32+X52W32+X53W33

O32=X32W11+X33W12+X34W13+X42W21+X43W22+X44W23+X52W32+X53W32+X54W33

O33=X33W11+X34W12+X35W13+X43W21+X44W22+X45W23+X53W32+X54W32+X55W33

อาจสรุปขั้นตอนการทำ convolution มีลำดับดังนี้
1. เริ่มต้นที่ตำแหน่งมุมขวาบนของทั้ง matrix X และ W
2. หา element - wise multiplication ระหว่าง X และ W
3. นำลัพธ์จากข้อ 2 มาหาผลบวก จะได้ค่าของ Oij
4. ขยับ W ไปทางขวาของ X  แล้วทำซ้ำข้อ 2 -3 จำนวนตำแหน่งที่ขยับไปทางขวาเรียกว่า stride
5. เมื่อขยับไปทางขวาจนสุดแล้ว ให้กลับมาเริ่มจากซ้ายสุดและขยับตำแหน่งลงมาข้างล่าง จำนวนที่ขยับลงเท่ากับ stride
6. ทำซ้ำข้อ 2 - 5 จนหมดจำนวนสมาชิกของ X

ภาพจาก https://towardsdatascience.com/applied-deep-learning-part-4-convolutional-neural-networks-584bc134c1e2


Part 3 Back Propagation

ปัญหาที่ค้างมาจาก Part 1 คือเราจะหา local gradient ของ X, และ W เพื่อนำไปสู่การหาค่า global gradient เทียบกับ X,W ได้จะต้องเริ่มต้นด้วยการหา partial derivative ของ output เทียบกับ X และ W ก่อน ซึ่งใน Part 2 เราก็ได้ทราบว่า output จากการทำ convolution ระหว่าง X, W ได้มาได้อย่างไร ใน Part 3 ก็จะนำเอาความรู้ทั้งหมดมาใช้เพื่อทำ Back propagation ของ Convolution Layer กัน

ยกตัวอย่าง

O11=X11W11+X12W12+X13W13+X21W21+X22W22+X23W23+X31W31+X32W32+X33W33

ทำให้หา partial derivative ของ O11 เทียบกับ X11 ได้ดังนี้

O11X11=(X11W11)X11+(X12W12)X11+(X13W13)X11+(X21W21)X11+(X22W22)X11+(X23W23)X11+(X31W31)X11+(X32W32)X11+(X33W33)X11

O11X11=W11

ในทำนองเดียวกันเราก็จะสามารถหาค่า partial derivative อื่นได้ดังนี้

O11X12=W12O11X13=W13O11X21=W21O11X22=W22O11X23=W23O11X31=W31O11X32=W32O11X33=W33
O11W11=X11O11W12=X12O11W13=X13O11W21=X21O11W22=X22O11W23=X23O11W31=X31O11W32=X32O11W33=X33
...

ค่า global gradient เทียบกับ W

LW11=LO11O11W11+LO12O12W11+LO13O13W11+LO21O21W11+LO22O22W11+LO23O23W11+LO31O31W11+LO32O32W11+LO33O33W11

LW12=LO11O11W12+LO12O12W12+LO13O13W12+LO21O21W12+LO22O22W12+LO23O23W12+LO31O31W12+LO32O32W12+LO33O33W12


LW13=LO11O11W13+LO12O12W13+LO13O13W13+LO21O21W13+LO22O22W13+LO23O23W13+LO31O31W13+LO32O32W13+LO33O33W13

LW21=LO11O11W21+LO12O12W21+LO13O13W21+LO21O21W21+LO22O22W21+LO23O23W21+LO31O31W21+LO32O32W21+LO33O33W21

LW22=LO11O11W22+LO12O12W22+LO13O13W22+LO21O21W22+LO22O22W22+LO23O23W22+LO31O31W22+LO32O32W22+LO33O33W22

LW23=LO11O11W23+LO12O12W23+LO13O13W23+LO21O21W23+LO22O22W23+LO23O23W23+LO31O31W23+LO32O32W23+LO33O33W23

LW31=LO11O11W31+LO12O12W31+LO13O13W31+LO21O21W31+LO22O22W31+LO23O23W31+LO31O31W31+LO32O32W31+LO33O33W31

LW31=LO11O11W32+LO12O12W32+LO13O13W32+LO21O21W32+LO22O22W32+LO23O23W32+LO31O31W32+LO32O32W32+LO33O33W32

LW33=LO11O11W33+LO12O12W33+LO13O13W33+LO21O21W33+LO22O22W33+LO23O23W33+LO31O31W33+LO32O32W33+LO33O33W33
 ...
จากความรู้ก่อนหน้านี้ทำให้เราสามารถเขียนสมการนี้ทั้งหมดได้เป็น

LW11=LO11X11+LO12X12+LO13X13+LO21X21+LO22X22+LO23X23+LO31X31+LO32X32+LO33X33
 ....

หากสังเกตุให้ดีจะเห็นว่าการหาผลลัพธ์ที่ได้มีลักษณะเช่นเดียวกันการใช้ convolution นั้นคือ

LW=[X11X12X13X14X15X21X22X23X24X25X31X32X33X34X35X41X42X43X44X45X51X52X53X54X55][LO11LO12LO13LO21LO22LO23LO31LO32LO33](1)

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

LX=[W33W32W31W23W22W21W13W12W11][LO11LO12LO13LO21LO22LO23LO31LO32LO33](2)

หรือสรุปเป็นรูปแบบที่จำง่ายดังนี้

LX=Rotate180(Weight)LO

LW=XLO

หมายเหตุ
1. การ rotate180 ในที่นี้คือการ flip matrix 2 ครั้ง ครั้งแรก flip แนวตั้ง ครั้งที่สอง flip แนวนอน

import numpy as np
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
b = np.flip(a,axis=1) # flip vertically
c = np.flip(b,axis=0) # flip horizontally

2. การทำ convolution ระหว่าง Rotate180(Weight)LO ต้องใช้ stride = 1 และ padding = size matrix global gradient - 1 เท่านั้น

3. การทำ convolution ระหว่าง X และ global gradient จะกำหนดให้ padding = 0 และ stride  = 1

4.  ใช้หลักการ Wk=Wk1ϵLW เพื่อปรับค่า Weight

  ข้อมูลอ้างอิง
[1] http://colah.github.io/posts/2014-07-Understanding-Convolutions/
[2] http://colah.github.io/posts/2015-08-Backprop/
[3] https://youtu.be/QJoa0JYaX1I
[4] https://youtu.be/r2-P1Fi1g60
[5] https://youtu.be/tIeHLnjs5U8
[6] https://www.cs.cmu.edu/~mgormley/courses/10601-s17/slides/lecture20-backprop.pdf
[7] http://neuralnetworksanddeeplearning.com/chap2.html
[8] https://www.reddit.com/r/math/comments/4ieenr/calculus_and_backpropagation/
[9] https://www.youtube.com/playlist?list=PL3FW7Lu3i5JvHM8ljYj-zLfQRF3EO8sYv
[10] https://youtu.be/i94OvYb6noo
[11] https://en.wikipedia.org/wiki/Chain_rule
[12] http://www.cs.columbia.edu/~mcollins/ff2.pdf
[13] https://www.mathsisfun.com/calculus/derivatives-introduction.html?ref=binfind.com/web
[14] https://www.mathsisfun.com/calculus/derivatives-partial.html
[15] https://en.wikipedia.org/wiki/Convolution
[16] https://en.wikipedia.org/wiki/Matrix_(mathematics)
[17] https://medium.freecodecamp.org/an-intuitive-guide-to-convolutional-neural-networks-260c2de0a050

ความคิดเห็น