Convolutional Neural Networks(CNN) #4 卷積核的Back propagation
Convolutional Neural Networks卷積神經網路的參數最終仍會以倒傳遞演算法(Backpropagation)優化,本文將由淺而深的從原理到可程式化的計算方法向各位介紹Kernel的偏微分計算方法。而本文採用的範例是包含padding的卷積層,這種設定也將更趨近於現實,希望透過這種方式讓各位完全理解。
本篇內容中卷積神經網路的功能,同步存放於Github:https://github.com/PoLun-Wang/DL_practice_convolutional_neural_networks
此外,想要了解卷積神經網路的基本運算過程可以參考這3篇文章:CNN #1(Kernel, Stride, Padding)、CNN #2(Pooling layer)、CNN #3(計算參數量)
本文所使用的範例是1層卷積層來講解與推導Backpropagation的過程,如下圖(1)。
表(1):符號對照表
符號 | 說明 |
x | 非第0層的Feature map。(第0層指的就是input images) |
w | 卷積核,形狀為(2×2)。 |
z | 為x、w經過卷積運算出來的結果,形狀為(4×4)。 |
L(⋅) | 指的是Loss function,導傳遞法就是要計算參數對於Loss function的影響力。 |
圖(1):推導用簡易架構圖
由於Backpropagation的反向傳遞階段(Backward pass)會使用到各層神經網路的輸出計算偏微分,藉此來反推該層神經網路的參數對於Loss function的偏微分量。不太了解導傳遞法原理的話可以來讀一讀這一篇文章:Backpropatation。
先列出每一個z的組成,以此釐清對x和w進行偏微分的時候該怎麼推導。
下列分析z的組成是很重要的過程,推導∂L∂w、∂L∂x都會用到。
z11=0w11+0w12+0w21+x11w22
z12=0w11+0w12+x11w21+x12w22
z13=0w11+0w12+x12w21+x13w22
z14=0w11+0w12+x13w21+0w22
– – – – –
z21=0w11+x11w12+0w21+x21w22
z22=x11w11+x12w12+x21w21+x22w22
z23=x12w11+x13w12+x22w21+x23w22
z24=x13w11+0w12+x23w21+0w22
– – – – –
z31=0w11+x21w12+0w21+x31w22
z32=x21w11+x22w12+x31w21+x32w22
z33=x22w11+x23w12+x32w21+x33w22
z34=x23w11+0w12+x33w21+0w22
– – – – –
z41=0w11+x31w12+0w21+0w22
z42=x31w11+x32w12+0w21+0w22
z43=x32w11+x33w12+0w21+0w22
z44=x33w11+0w12+0w21+0w22
圖(2):從∂L∂z反向傳遞至卷積核(w)與前一層的Feature map(x)
這需要透過Chain rule來達成我們的目的,不是很了解的話建議來看看這篇文章Backpropatation。
前面已經將每一個z的組成都分析過了,現在我們可以用傳統的方法來推導∂L∂w11。
首先,從剛才用來分析z的式子中找出w11的係數不為0的z:z22,z23,z24,z32,z33,z34,z42,z43,z44
z11=0w11+0w12+0w21+x11w22
z12=0w11+0w12+x11w21+x12w22
z13=0w11+0w12+x12w21+x13w22
z14=0w11+0w12+x13w21+0w22
– – – – –
z21=0w11+x11w12+0w21+x21w22
z22=x11w11+x12w12+x21w21+x22w22
z23=x12w11+x13w12+x22w21+x23w22
z24=x13w11+0w12+x23w21+0w22
– – – – –
z31=0w11+x21w12+0w21+x31w22
z32=x21w11+x22w12+x31w21+x32w22
z33=x22w11+x23w12+x32w21+x33w22
z34=x23w11+0w12+x33w21+0w22
– – – – –
z41=0w11+x31w12+0w21+0w22
z42=x31w11+x32w12+0w21+0w22
z43=x32w11+x33w12+0w21+0w22
z44=x33w11+0w12+0w21+0w22
透過連鎖率計算個別的∂L∂z∂z∂w,最後將這些偏微分值加總,就會得到∂L∂w。剩下的w12、w21、w22依照Step-1、Step-2的方法就可以算出卷積核對L的影響力囉。
∂L∂w11=∂L∂z22∂z22∂w11+∂L∂z23∂z23∂w11+∂L∂z24∂z24∂w11+∂L∂z32∂z32∂w11+∂L∂z33∂z33∂w11+∂L∂z34∂z34∂w11+∂L∂z42∂z42∂w11+∂L∂z43∂z43∂w11+∂L∂z44∂z44∂w11=∂L∂z22x11+∂L∂z23x12+∂L∂z24x13+∂L∂z32x21+∂L∂z33x22+∂L∂z34x23+∂L∂z42x31+∂L∂z43x32+∂L∂z44x33
∂L∂w12=∂L∂z21x11+∂L∂z22x12+∂L∂z23x13+∂L∂z31x21+∂L∂z32x22+∂L∂z33x23+∂L∂z41x31+∂L∂z42x32+∂L∂z43x33
∂L∂w21=∂L∂z12x11+∂L∂z13x12+∂L∂z14x13+∂L∂z22x21+∂L∂z23x22+∂L∂z24x23+∂L∂z32x31+∂L∂z33x32+∂L∂z34x33
∂L∂w22=∂L∂z11x11+∂L∂z12x12+∂L∂z13x13+∂L∂z21x21+∂L∂z22x22+∂L∂z23x23+∂L∂z31x31+∂L∂z32x32+∂L∂z33x33
看到這裡,有沒有覺得很複雜且不易程式化?但這就是基礎原理,希望各位可以了解。
接下來要說明的就更快、更容易程式化的做法。
這個方法是從Coursera的課程學習到的,此方法套用至具有padding的卷積層也能完美解決卷積核在Back propagation過程的程式化問題!
我們先用文字描述此做法,再用下方的圖示幫助理解:
以圖(3)來說,先將上一層的Feature map加入padding,再以Kernel的大小形成一個Sliding window對已加入padding的上層Feature map框選矩陣(e.g. [000x11]),將框選到的矩陣乘上∂L∂z11,先把結果暫存起來。接著將Sliding window依據stride設定移動,重複上述操作並將乘積不斷加總,如圖(4~6)所示。
因為是Sliding window矩陣乘上一個純量,所以結果也會是一個與Kernel形狀一致的矩陣,加總後的結果就會是[∂L∂w11∂L∂w12∂L∂w21∂L∂w22]。
圖(3):計算卷積核偏微分量1
圖(4):計算卷積核偏微分量2
圖(5):計算卷積核偏微分量3
圖(6):計算卷積核偏微分量4
最終,∂L∂w的結果應該是:
∂L∂w11=∂L∂z22x11+∂L∂z23x12+∂L∂z24x13+∂L∂z32x12+∂L∂z33x22+∂L∂z34x23+∂L∂z42x31+∂L∂z43x32+∂L∂z44x33
∂L∂w12=∂L∂z21x11+∂L∂z22x12+∂L∂z23x13++∂L∂z31x21+∂L∂z32x22+∂L∂z33x23+∂L∂z41x31+∂L∂z42x32+∂L∂z43x33
∂L∂w21=∂L∂z12x11+∂L∂z13x12+∂L∂z14x13+∂L∂z22x21+∂L∂z23x22+∂L∂z24x23+∂L∂z32x31+∂L∂z33x32+∂L∂z34x33
∂L∂w22=∂L∂z11x11+∂L∂z12x12+∂L∂z13x13+∂L∂z21x21+∂L∂z22x22+∂L∂z23x23+∂L∂z31x31+∂L∂z32x32+∂L∂z33x33