1. 全連接層
與深度神經網絡DNN的反向傳播算法一致,輔助變量:
⎩⎪⎪⎪⎨⎪⎪⎪⎧δL=∂zL∂J=∂aL∂J⊙σ′(zL)δl=(Wl+1)Tδl+1⊙σ′(zl)
進而求得參數W,b的梯度:
⎩⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎧∂Wl∂J=∂zl∂J∂Wl∂zl=δl(al−1)T∂bl∂J=∂zl∂J∂bl∂zl=δl
2. 池化層
設池化層的輸入爲al,輸出爲zl+1,則有:
zl+1=pool(al)
則
δl=∂zl∂J=∂zl+1∂J∂al∂zl+1∂zl∂al=upsample(δl+1)⊙σ′(zl)
其中,upsample指在反向傳播時,把δl+1的矩陣大小還原成池化之前的大小,一共分爲兩種情況:
- 如果是Max,則把δl+1的各元素值放在之前做前向傳播算法得到最大值的位置,所以這裏需要額外記錄每個區塊中最大元素的位置
- 如果是Average,則把δl+1的各元素值取平均後,填入對應的區塊位置。
舉例,設池化層的核心大小是2×2,則:
δl+1=(2486)Max upsample⎝⎜⎜⎛2000004000060800⎠⎟⎟⎞
δl+1=(2486)Average upsample⎝⎜⎜⎛0.50.5110.50.511221.51.5221.51.5⎠⎟⎟⎞
注意,對於Average情況下的反向傳播,容易誤認爲是把梯度值複製幾遍之後直接填入對應的區塊位置。其實很容易理解爲什麼要把梯度值求平均,我們用一個小例子來說明:
假設對四個變量a,b,c,d求平均,得到z,也即:
z=41(a+b+c+d)
那麼,z關於每個變量的導數都是1/4。反向傳播到z時,累積的梯度值爲δ,那麼,
⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧∂a∂J=∂z∂J∂a∂z=41δ∂b∂J=∂z∂J∂b∂z=41δ∂c∂J=∂z∂J∂c∂z=41δ∂d∂J=∂z∂J∂d∂z=41δ
這樣就很容易理解了。
3. 卷積層
卷積層的前向傳播公式:
al+1=σ(zl+1)=σ(al∗Wl+1+bl+1)
則
δl=∂zl∂J=∂zl+1∂J∂al∂zl+1∂zl∂al=δl+1∗Rotation180(Wl+1)⊙σ′(zl)
其中Rotation180意思是卷積核W被旋轉180度,也即上下翻轉一次,接着左右翻轉一次。
詳細推導請參見 https://www.cnblogs.com/pinard/p/6494810.html
參數W,b的梯度:
⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧∂Wl∂J=∂zl∂J∂Wl∂zl=al−1∗δl∂bl∂J=∂zl∂J∂bl∂zl=u,v∑(δl)u,v
其中,關於W的梯度沒有旋轉操作,u,v∑(δl)u,v意思是把δl的所有通道沿通道方向求和,累加成一個通道。
4. 參考資料
感謝 https://www.cnblogs.com/pinard/p/6494810.html