Convolutional Neural Networks(CNN) #5 特徵圖&偏差值的導數
本篇文章要來介紹對特徵圖(Feature map)與偏差值(Bias)在Backward propagation的推導過程與可程式化的計算方法。由於卷積神經網路(Convolutional Neural Network, CNN)在使用倒傳遞法(Backpropagation)的反向傳遞(Backward pass)過程中,就是藉著計算參數之梯度(偏微分)作為更新並訓練參數的手段,因此了解這些原理對於初探卷積神經網路的學習者來說也非常重要。
如果各位想要了解如何在卷積神經網路之中計算的卷積核的偏微分,可以來讀上一篇文章(CNN #4 卷積核的Back propagation),希望能幫助到各位。
此外,本篇內容中卷積神經網路的功能,同步存放於Github:https://github.com/PoLun-Wang/DL_practice_convolutional_neural_networks
本文所使用的範例設計如下表(1)以及圖(1),而且接下來會介紹的特徵圖(Feature map)與偏差值(Bias)偏微分原理都會以此範例當基礎。
表(1):符號對照表
符號 | 說明 |
$x$ | 非第0層的Feature map。(第0層指的就是input images) |
$w$ | 卷積核,形狀為$(2\times 2)$。 |
$z$ | 為$x$、$w$經過卷積運算出來的結果,形狀為$(4\times 4)$。 |
$L(\cdot)$ | 指的是Loss function,導傳遞法就是要計算參數對於Loss function的影響力。 |
圖(1):推導用簡易架構圖
圖(2):Backward propagation in Feature maps of CNN.
由於Backpropagation的反向傳遞階段(Backward pass)會使用到各層神經網路的輸出計算偏微分,藉此來反推該層神經網路的參數對於Loss function的偏微分量。不太了解導傳遞法原理的話可以來讀一讀這一篇文章:Backpropatation。
先列出每一個$z$的組成,以此釐清對$x$和$w$進行偏微分的時候該怎麼推導。
p.s. 圖(2~5)$\frac{\partial L}{\partial z}$矩陣的左邊有個等號『$=$』僅表示原先卷積神經網路在Forward propagation的過程中的相依關係,並不代表相等的概念唷。
p.s. 本文所使用之部分記號僅是為了方便理解,而採用類神經網路神經元與其輸入、輸出用的記號。
下列分析$z$的組成是很重要的過程,推導$\frac{\partial L}{\partial w}$、$\frac{\partial L}{\partial x}$都會用到。
$z_{11}=0w_{11}+0w_{12}+0w_{21}+x_{11}w_{22}$
$z_{12}=0w_{11}+0w_{12}+x_{11}w_{21}+x_{12}w_{22}$
$z_{13}=0w_{11}+0w_{12}+x_{12}w_{21}+x_{13}w_{22}$
$z_{14}=0w_{11}+0w_{12}+x_{13}w_{21}+0w_{22}$
– – – – –
$z_{21}=0w_{11}+x_{11}w_{12}+0w_{21}+x_{21}w_{22}$
$z_{22}=x_{11}w_{11}+x_{12}w_{12}+x_{21}w_{21}+x_{22}w_{22}$
$z_{23}=x_{12}w_{11}+x_{13}w_{12}+x_{22}w_{21}+x_{23}w_{22}$
$z_{24}=x_{13}w_{11}+0w_{12}+x_{23}w_{21}+0w_{22}$
– – – – –
$z_{31}=0w_{11}+x_{21}w_{12}+0w_{21}+x_{31}w_{22}$
$z_{32}=x_{21}w_{11}+x_{22}w_{12}+x_{31}w_{21}+x_{32}w_{22}$
$z_{33}=x_{22}w_{11}+x_{23}w_{12}+x_{32}w_{21}+x_{33}w_{22}$
$z_{34}=x_{23}w_{11}+0w_{12}+x_{33}w_{21}+0w_{22}$
– – – – –
$z_{41}=0w_{11}+x_{31}w_{12}+0w_{21}+0w_{22}$
$z_{42}=x_{31}w_{11}+x_{32}w_{12}+0w_{21}+0w_{22}$
$z_{43}=x_{32}w_{11}+x_{33}w_{12}+0w_{21}+0w_{22}$
$z_{44}=x_{33}w_{11}+0w_{12}+0w_{21}+0w_{22}$
依循原理推導Feature map的導數
以求出$\frac{\partial L}{\partial x_{11}}$為例子來說,我們可以先從對$z$的組成分析中挑出組成中包含$x_{11}$且係數不為$0$的式子,如下所示:
$z_{11}$$=0w_{11}+0w_{12}+0w_{21}+$$x_{11}$$w_{22}$
$z_{12}$$=0w_{11}+0w_{12}+$$x_{11}$$w_{21}+x_{12}w_{22}$
$z_{21}$$=0w_{11}+$$x_{11}$$w_{12}+0w_{21}+x_{21}w_{22}$
$z_{22}$$=$$x_{11}$$w_{11}+x_{12}w_{12}+x_{21}w_{21}+x_{22}w_{22}$
依據微積分的連鎖率(Chain rule)我們可以得知$\frac{\partial L}{\partial x}=\frac{\partial L}{\partial z}\frac{\partial z}{\partial x}$,所以欲求得$\frac{\partial L}{\partial x_{11}}$就得找到包含$x_{11}$的$z$,而我們上面已經篩選出含有$x_{11}$的$z$為:$z_{11}$、$z_{12}$、$z_{21}$、$z_{22}$。
因此,直接求出$\frac{\partial L}{\partial z_{11}}\frac{\partial L}{\partial x_{11}}$、$\frac{\partial L}{\partial z_{12}}\frac{\partial L}{\partial x_{11}}$、$\frac{\partial L}{\partial z_{21}}\frac{\partial L}{\partial x_{11}}$、$\frac{\partial L}{\partial z_{22}}\frac{\partial L}{\partial x_{11}}$再加總,就能獲得$\frac{\partial L}{\partial x_{11}}$。
$\frac{\partial L}{\partial z_{11}}\frac{\partial L}{\partial x_{11}}=\frac{\partial L}{\partial z_{11}}w_{22}$
$\frac{\partial L}{\partial z_{12}}\frac{\partial L}{\partial x_{11}}=\frac{\partial L}{\partial z_{12}}w_{21}$
$\frac{\partial L}{\partial z_{21}}\frac{\partial L}{\partial x_{11}}=\frac{\partial L}{\partial z_{21}}w_{12}$
$\frac{\partial L}{\partial z_{22}}\frac{\partial L}{\partial x_{11}}=\frac{\partial L}{\partial z_{22}}w_{11}$
$\begin{align*}
\frac{\partial L}{\partial x_{11}}=\frac{\partial L}{\partial z_{11}}w_{22}+\frac{\partial L}{\partial z_{12}}w_{21}+\frac{\partial L}{\partial z_{21}}w_{12}+\frac{\partial L}{\partial z_{22}}w_{11}
\end{align*}$
按照這個方法示範計算$\frac{\partial L}{\partial x_{22}}$的詳細過程:
$z_{22}$$=x_{11}w_{11}+x_{12}w_{12}+x_{21}w_{21}+$$x_{22}$$w_{22}$
$z_{23}$$=x_{12}w_{11}+x_{13}w_{12}+$$x_{22}$$w_{21}+x_{23}w_{22}$
$z_{32}$$=x_{21}w_{11}+$$x_{22}$$w_{12}+x_{31}w_{21}+x_{32}w_{22}$
$z_{33}$$=$$x_{22}$$w_{11}+x_{23}w_{12}+x_{32}w_{21}+x_{33}w_{22}$
$\begin{align*}
\frac{\partial L}{\partial x_{22}}=\frac{\partial L}{\partial z_{22}}\frac{\partial z_{22}}{x_{22}}+\frac{\partial L}{\partial z_{23}}\frac{\partial z_{23}}{x_{32}}+\frac{\partial L}{\partial z_{32}}\frac{\partial z_{22}}{x_{22}}+\frac{\partial L}{\partial z_{33}}\frac{\partial z_{33}}{x_{22}}\\
=\frac{\partial L}{\partial z_{22}}w_{22}+\frac{\partial L}{\partial z_{23}}w_{21}+\frac{\partial L}{\partial z_{32}}w_{12}+\frac{\partial L}{\partial z_{33}}w_{11}
\end{align*}$
另一種易於程式化的方法
其實熟悉原理之後,應該會發現很簡單,但是此做法要程式化是有其困難度的。但最終我們都是要將這些計算過程轉化為程式,因此易於程式化的作法就更顯其重要性。
以文字描述此方法:
由於本範例設定Padding$=1$,所以首先要把補充像素填入上一層的Feature map,請參考圖(3~5)左上方的$x$矩陣。(若Padding$=0$,則不需進行此步驟)
依照加入Padding後的上層Feature map的形狀,作為暫存計算結果用的表格,如圖(3~5)右下方的矩陣。
以圖(3)為例,首先從$\frac{\partial L}{\partial z}$依序選取數據($\frac{\partial L}{\partial z_{11}}$)和卷積核($\begin{bmatrix}w_{11} & w_{12}\\w_{21}&w_{22}\end{bmatrix}$)相乘,並將乘積累加至暫存表格中相對應的位置,如本圖中間的計算過程與右下方的暫存表格。
圖(3):Backward propagation in Feature map-1.
以圖(4)來說,累加至暫存表的相對位置與圖(3)僅相差$1$格,原因是Stride$=1$。
(倘若Stride$=2$,就要累加到相對於$\begin{bmatrix}0&0\\x_{12}&x_{13}\end{bmatrix}$的位置喔,就跟卷積運算移動的規則一樣。)
圖(4):Backward propagation in Feature map-2.
圖(5):Backward propagation in Feature map-3.
最後經過多次計算,你會得到一個如圖(6)的矩陣,這個矩陣還不是微分的結果,我們還要經過最後一道手續,去除灰底格子的數值,這樣就可獲得$\frac{\partial L}{\partial x}$,也就是前一層 Feature map 對 Loss function 的影響力。
(灰底的部分其實就是最一開始為了方便計算時填入數值而加入的Padding。)
圖(6):去除灰底的部分就會成為$\frac{\partial L}{\partial x}$(前一層Feature map)微分的結果
一般來說,偏差值Bias($b$)會在進啟動函數之前才會跟這一層卷積計算後的Feature map($z$)相加,假設啟動函數的輸出為$A$,請參閱公式(1, 2)。因為,在討論卷積神經網路的Bias時,可以將問題簡化為類神經網路的神經元便於理解。
假設,我們已經獲得$\frac{\partial L}{\partial z}$,而現在需要計算$b$對$L$(Loss function)的影響力,該怎麼計算?
很簡單,利用Chain rule,立馬解出來。☺️
$\begin{align*}\frac{\partial L}{\partial b}=\frac{\partial L}{\partial z}\frac{\partial z}{\partial b}\\
=\frac{\partial L}{\partial z}\end{align*}$
$z=xw+b$ | (1) |
$A=ReLU(z)$ | (2) |