機器學習自學筆記08: Backpropagation

by wenwu
0 comment

機器學習自學筆記08: Backpropagation

今日的課程來自於: https://youtu.be/CXgbekl66jc
參考筆記:https://github.com/Sakura-gh/ML-notes/blob/master/ML-notes-pdf/8_Deep%20Learning.pdf

Backpropagation(反向傳播)是一種 gradient descent,也是一種演算法。Backpropagation 就是告訴我們用 gradient 吃來 train一個 neural network 的時候該怎麼做,他只是求微分的一種方式,而不是一種新的算法。

我們在使用 gradient descent 的時候可能會用到上千萬筆的參數,而我們可以使用backpropagation有效率的算出來。backpropagation並不是一個和gradient descent 不同的方法,他就是gradient descent ,他只是一個比較有效率的算法。

Chain Rule

backpropagation裡面並沒有什麼高深的數學,只需要記得的就是chain rule
對整個neural network,我們定義一個 loss function: L(θ) 等於所有的training data的loss總和

對L(θ)偏微之後,可以得到下面的式子:

接下來我們就不用計算 ∂L(θ)/∂w ,可以計算所有的∂l^n(θ)/∂w ,最後再總和起來

而現在的問題是∂l/∂w 該怎麼算,我們可以把它拆成兩項: ∂l/∂w=∂z/∂w * ∂l/∂z

前面這項比較簡單 (∂z/∂w) ,方法叫做Forward pass; 而求後面這項的方法比較複雜(∂l/∂z),稱之為Backward pass

Forward pass

∂l/∂w=∂z/∂w * ∂l/∂z 中,考慮前面這項∂z/∂w,他的結果可以馬上算出來。因為 z=x1w1+x2w2+b,所以z的偏微是: ∂z/∂w1 = x1,∂z/∂w2 = x2。

其實他有一個規律,就是∂z/∂w=w前面連結的input值。

(好了 forward pass 講完了)

Backward pass

再考慮∂l/∂z這一項,它是比較複雜的,這裡假設activation function 是sigmoid function

在下圖中,z 通過 activation function 得到 a ,這個neuron的output 是 a = σ(z),a 乘上 weight w3 得到 z’,a 乘上 weight w4 得到 z’’

我們想要求的 ∂l/∂z可以寫成 : ∂l/∂z = ∂a/∂z*∂l/∂a 
 ∂a/∂z 實際上就是 activation function 的微分(在這裡就是sigmoid function 的微分)。a = σ(z),而 ∂a/∂z = σ’(z) ,而σ’(z) 就是一個常數。

再來就是求∂l/∂a ,因為 a 會影響 z’ 和 z’’,z’ 和 z’’會影響 l ,所以通過chain rule 可以得到

這裡的 ∂z’/∂a =w3,∂z’’/∂a =w4,而 ∂l/∂z’ 和 ∂a/∂z’’ 就要再最後面解釋了。假設我們知道∂l/∂z’ 和 ∂a/∂z’’,就可以將 ∂l/∂z寫成下面的形式 :

最後我們需要解決的問題是: ∂l/∂z’ 和 ∂a/∂z’’這兩項 ,假設兩種不同的case

Case1: output layer

假設藍色的neuron已經是hidden layer 的最後一層了,也就是說連接在z’ 和 z’’ 後的這兩個紅色的neuron已經是output layer ,它的output就已經是整個network 的output 了,這時候就會比較簡單。

因為最後的output 為 y1 & y2 ,所以可以將∂l/∂z’ 寫成∂y1/∂z’ * ∂l/∂y1 
其中,∂y1/∂z’ 就是output layer 的activation function (softmax) 對 z’ 的偏微分
而∂l/∂y1就是loss 對 y1的偏微分,他取決於你的loss function是怎麼定義的,也就是你的output和target之間是怎樣evaluate 的,你可以用cross entropy,也可以用mean square error ,用不同的定義,∂l/∂y1的值就不一樣。

這時我們已經可以算出l對w1 &w2 的偏微分值了

Case2: Not Output Layer

假設現在紅色的neuron並不是整個network的output,那 z’ 經過紅色neuron的activation function 得到 a’ ,然後 a’ 乘上w5、w6,得到 za、zb ,如下圖所示:

和先前的方法類似,如果知道 ∂l/∂za 和 ∂l/∂zb,我們就可以計算∂l/∂z’。並且知道z’和z’’就可以知道z ……,這個過程反覆進行下去,直到找到output layer 就可以算出確切的值,在一層一層反推回去

聽起來很驚人,要一層一層算要算到何時??

只要算一個方向,從output layer 的 ∂l/∂z 開始算,你就會發現它的運算輛跟原來的network的Feedforward path 其實是一樣的


Example

假設我們現在有6個neuron,每一個neuron的activation function的 input 分別為 z1~ z6,我們要計算 l 對這些 z 的偏微分,按照原來的思路,我們想知道z1 的偏微分,要去算z3 和 z4 的偏微分,想要知道z3 和 z4 的偏微分,就要在算z5 和 z6 的偏微分才能知道z1 的偏微分

反觀,若是先計算z5 和 z6 的偏微分,這個過程就變得有效率了。我們先計算z5 和 z6 的偏微分,就可以算出z3 和 z4 的偏微分,最後就可以得到z1 和 z2 的偏微分。這一整個過程,就像下圖:

在做backward pass 的時候,實際上的做法就是件另一個neural network,本來正向neural network 裡面的activation function 都是sigmoid function,而現在backward pass 的時候,就是建一個反向的neural network ,它的activation function就是一個運算放大器op-amp,每一個反向neuron的input 是loss l 對後面一層layer的z 的偏微分 ∂l/∂z ,output則是loss l 對這個neuron的z 的偏微分 ∂l/∂z,做Backward pass 就是通過這樣一個反向neural network 的運算,把loss l 對每一個neuron的z 的偏微分∂l/∂z 都給算出來


Summary

最後,我們總結一下Backpropagation 是怎麼做的,Backpropagation分成兩個步驟:

Forward pass 每一個neuron 的activation function 的output,就是他所連結的weight 的 ∂z/∂w

Backward pass 建一個與原來方向相反的neural network,它的三角形neuron的output 就是 ∂l/∂z,把通過forward pass 得到的 ∂z/∂w 和通過backward pass 得到的 ∂l/∂z 乘起來就可以得到 l 對 w 的偏微分 ∂l/∂w

今天的筆記就到這裡,我覺得老師講的很清楚

Related Articles

發表迴響