卷積神經網絡中的反向傳播


卷積神經網絡中的反向傳播

反向傳播是梯度下降法在神經網絡中應用,反向傳播算法讓神經網絡的訓練成為來可能。
首先要弄清一點,神經網絡的訓練過程就是求出一組較好的網絡權值的過程。反向傳播的直觀解釋就是先用當前網絡的權值計算結果,然后根據計算結果和真實結果的差值來更新網絡的權值,使得計算結果和真實結果的差值越來越小。
當然要想准確的理解反向傳播,你需要知道:梯度的概念,梯度下降法,復合函數求導的鏈式法則。
在多層感知機中,反向傳播比較簡單,要計算當前節點的誤差\(\delta\),只需要根據后一層節點的誤差和當前節點的連接權重相乘后求和,如下圖。

那么,在卷積神經網絡中的反向傳播也會和多層神經網絡中的一樣嗎?
先來看一下多層感知機和卷積神經網絡的關系:

可以看到,實際上,多層感知機可以通過去除一部分的網絡連接並且共享權值(上圖相同顏色的連接表示,連接權值相等)轉化為卷積神經網絡。
可能你會說上圖最右邊看起來並不像一個卷積神經網絡,那么請看下圖:

解釋:

  • 輸入層的9個節點是3×3原始圖像的9個像素
  • 卷積核是2×2大小的,用4種顏色表示不同位置
  • 3×3圖像經過2×2卷積操作后得到2×2圖像,即網絡中間層的4個節點。
  • 四個角的像素各自只參與一次卷積計算,因此只有一條連接到下一層節點,而中間位置的像素參與4次卷積計算,到下一層節點有四個連接。

所以,在卷積神經網絡(CNN)的反向傳播的節點誤差\(\delta\)也可以像之前的多層感知機一樣計算:

通常,為了便於計算,反向傳播計算誤差時同樣使用卷積來表示,這時需要將卷積核做180度旋轉(原因見下面公式推導):


在前向計算的過程中,使用的是valid卷積方式,卷積操作的對象是前一層的輸出,而在后向傳播中使用的full卷積方式,卷積操作的對象是后一層傳回的誤差。
接下來會進行一些公式推導:
在多層感知機中,第\(l\)層節點\(j\)的誤差(偏導)為:\(\delta^l_j = \frac{\partial C}{\partial z^l_j}\)

其中:$z^{l_j}= \sum\limits_{k} w^l_{jk} a^{l-1}_k + b^l_j $,

\(a_j^l = \sigma(z_j^l)\)

其中\(\sigma\)表示sigmoid, tanh或者relu等激活函數。
在卷積神經網絡中,使用\(z_{x,y}\)代替\(z_{j}\),得到前向過程的卷積計算\(z_{x,y}^{l+1} = w^{l+1} * \sigma(z_{x,y}^l) + b_{x,y}^{l+1} = \sum \limits_{a} \sum \limits_{b} w_{a,b}^{l+1}\sigma(z_{x-a,y-b}^l)+ b_{x,y}^{l+1}\)
在卷積神經網絡中節點\(j\)的偏導為:$ \delta_{x,y}^l = \frac{\partial C}{\partial z_{x,y}^l} =\sum \limits_{x'} \sum \limits_{y'}\frac{\partial C}{\partial z_{x',y'}^{l+1}}\frac{\partial z_{x',y'}^{l+1}}{\partial z_{x,y}^l}\( 而\)z_{x,y}^l\(的誤差是由\)z_{x,y}^{l+1}$傳導而來,因此使用鏈式法則有:

\[\frac{\partial C}{\partial z_{x,y}^l} =\sum \limits_{x'} \sum \limits_{y'}\frac{\partial C}{\partial z_{x',y'}^{l+1}}\frac{\partial z_{x',y'}^{l+1}}{\partial z_{x,y}^l} = \sum \limits_{x'} \sum \limits_{y'} \delta_{x',y'}^{l+1} \frac{\partial(\sum\limits_{a}\sum\limits_{b}w_{a,b}^{l+1}\sigma(z_{x'-a, y'-b}^l) + b_{x',y'}^{l+1})}{\partial z_{x,y}^l} \]

由於只有下標為\(x=x'-a\)\(y=y'-b\)的項的誤差會傳給\(z_{x,y}^l\),其它項的偏導為0,所以$$ \sum \limits_{x'} \sum \limits_{y'} \delta_{x',y'}^{l+1} \frac{\partial(\sum\limits_{a}\sum\limits_{b}w_{a,b}^{l+1}\sigma(z_{x'-a, y'-b}^l) + b_{x',y'}^{l+1})}{\partial z_{x,y}^l} = \sum \limits_{x'} \sum \limits_{y'} \delta_{x',y'}^{l+1} w_{a,b}^{l+1} \sigma'(z_{x,y}^l)$$
而當\(x=x'-a\)\(y=y'-b\)時,有\(a=x'-x\)\(b=y'-y\),所以上式可以寫成

\[\sum \limits_{x'} \sum \limits_{y'} \delta_{x',y'}^{l+1} w_{a,b}^{l+1} \sigma'(z_{x,y}^l) =\sum \limits_{x'}\sum \limits_{y'} \delta_{x',y'}^{l+1} w_{x'-x,y'-y}^{l+1} \sigma'(z_{x,y}^l)=\delta^{l+1} * w_{-x,-y}^{l+1} \sigma'(z_{x,y}^l) \]

上式中\(rot_{180^\circ}(w_{x,y}^{l+1}) = w_{-x, -y}^{l+1}\),因此在反向傳播計算誤差時需要將卷積核旋轉180°
接下來計算誤差受權值\(w_{a,b}^l\)的影響$\frac{\partial C}{\partial w_{a,b}^l} $

\[\frac{\partial C}{\partial w_{a,b}^l} = \sum \limits_{x} \sum\limits_{y} \frac{\partial C}{\partial z_{x,y}^l}\frac{\partial z_{x,y}^l}{\partial w_{a,b}^l} = \sum \limits_{x}\sum \limits_{y}\delta_{x,y}^l \frac{\partial(\sum\limits_{a'}\sum\limits_{b'}w_{a',b'}^l\sigma(z_{x-a', y-b'}^l) + b_{x,y}^l)}{\partial w_{a,b}^l} \]

\[=\sum \limits_{x}\sum \limits_{y} \delta_{x,y}^l \sigma(z_{x-a,y-b}^{l-1}) = \delta_{a,b}^l * \sigma(z_{-a,-b}^{l-1}) =\delta_{a,b}^l * \sigma(rot_{180^\circ}(z_{a,b}^{l-1})) \]

所以在卷積神經網絡中的訓練過程如下:

  1. 輸入x
  2. 前向過程:對每一個網絡層l=2,3, …,L,計算$ z_{x,y}^l = w^l * \sigma(z_{x,y}^{l-1}) + b_{x,y}^l , a_{x,y}^l = \sigma(z_{x,y}^l)$
  3. 輸出誤差\(\delta^L\):計算向量$ \delta^L = \nabla_a C \odot \sigma'(z^L)$
  4. 誤差反向傳播:對每一個網絡層l=L-1,L-2,…,2,計算\(\delta_{x,y}^l =\delta^{l+1} * rot_{180^\circ}(w_{x,y}^{l+1}) \sigma'(z_{x,y}^l)\)
  5. 根據梯度更新參數:成本函數的梯度由下式給出$ \frac{\partial C}{\partial w_{a,b}^l} =\delta_{a,b}^l * \sigma(rot_{180^\circ}(z_{a,b}^{l-1})) $

References:
Convolutional Neural Networks backpropagation: from intuition to derivation
Backpropagation In Convolutional Neural Networks


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM