卷積神經網絡的訓練
和全鏈接神經網絡相比,卷積神經網絡的訓練要複雜一些。但訓練的原理是同樣的:利用鏈式求導計算損失函數對每一個權重的偏導數(梯度),而後根據梯度降低公式更新權重。訓練算法依然是反向傳播算法。算法
咱們先回憶一下上一篇文章零基礎入門深度學習(3) - 神經網絡和反向傳播算法介紹的反向傳播算法,整個算法分爲三個步驟:數組
- 前向計算每一個神經元的輸出值
aj
(
j
表示網絡的第
j
個神經元,如下同);
- 反向計算每一個神經元的偏差項
δj
,
δj
在有的文獻中也叫作敏感度(sensitivity)。它其實是網絡的損失函數
Ed
對神經元加權輸入
netj
的偏導數,即
δj=∂Ed∂netj
;
- 計算每一個神經元鏈接權重
wji
的梯度(
wji
表示從神經元
i
鏈接到神經元
j
的權重),公式爲
∂Ed∂wji=aiδj
,其中,
ai
表示神經元
i
的輸出。
最後,根據梯度降低法則更新每一個權重便可。網絡
對於卷積神經網絡,因爲涉及到局部鏈接、下采樣的等操做,影響到了第二步偏差項
δ
的具體計算方法,而權值共享影響了第三步權重
w
的梯度的計算方法。接下來,咱們分別介紹卷積層和Pooling層的訓練算法。ide
卷積層的訓練
對於卷積層,咱們先來看看上面的第二步,即如何將偏差項
δ
傳遞到上一層;而後再來看看第三步,即如何計算filter每一個權值
w
的梯度。函數
卷積層偏差項的傳遞
最簡單狀況下偏差項的傳遞
咱們先來考慮步長爲一、輸入的深度爲一、filter個數爲1的最簡單的狀況。學習
假設輸入的大小爲3*3,filter大小爲2*2,按步長爲1卷積,咱們將獲得2*2的feature map。以下圖所示:atom

在上圖中,爲了描述方便,咱們爲每一個元素都進行了編號。用
δl−1i,j
表示第
l−1
層第
j
行第
j
列的偏差項;用
wm,n
表示filter第
m
行第
n
列權重,用
wb
表示filter的偏置項;用
al−1i,j
表示第
l−1
層第
i
行第
j
列神經元的輸出;用
netl−1i,j
表示第
l−1
行神經元的加權輸入;用
δli,j
表示第
l
層第
j
行第
j
列的偏差項;用
fl−1
表示第
l−1
層的激活函數。它們之間的關係以下:spa
netlal−1i,j=conv(Wl,al−1)+wb=fl−1(netl−1i,j)(17)(18)
上式中,
netl
、
Wl
、
al−1
都是數組,
Wl
是由
wm,n
組成的數組,
conv
表示卷積操做。code
在這裏,咱們假設第
l
中的每一個
δl
值都已經算好,咱們要作的是計算第
l−1
層每一個神經元的偏差項
δl−1
。orm
根據鏈式求導法則:
δl−1i,j=∂Ed∂netl−1i,j=∂Ed∂al−1i,j∂al−1i,j∂netl−1i,j(19)(20)
咱們先求第一項
∂Ed∂al−1i,j
。咱們先來看幾個特例,而後從中總結出通常性的規律。
例1,計算
∂Ed∂al−11,1
,
al−11,1
僅與
netl1,1
的計算有關:
netj1,1=w1,1al−11,1+w1,2al−11,2+w2,1al−12,1+w2,2al−12,2+wb
所以:
∂Ed∂al−11,1=∂Ed∂netl1,1∂netl1,1∂al−11,1=δl1,1w1,1(21)(22)
例2,計算
∂Ed∂al−11,2
,
al−11,2
與
netl1,1
和
netl1,2
的計算都有關:
netj1,1=w1,1al−11,1+w1,2al−11,2+w2,1al−12,1+w2,2al−12,2+wbnetj1,2=w1,1al−11,2+w1,2al−11,3+w2,1al−12,2+w2,2al−12,3+wb
所以:
∂Ed∂al−11,2=∂Ed∂netl1,1∂netl1,1∂al−11,2+∂Ed∂netl1,2∂netl1,2∂al−11,2=δl1,1w1,2+δl1,2w1,1(23)(24)
例3,計算
∂Ed∂al−12,2
,
al−12,2
與
netl1,1
、
netl1,2
、
netl2,1
和
netl2,2
的計算都有關:
netj1,1=w1,1al−11,1+w1,2al−11,2+w2,1al−12,1+w2,2al−12,2+wbnetj1,2=w1,1al−11,2+w1,2al−11,3+w2,1al−12,2+w2,2al−12,3+wbnetj2,1=w1,1al−12,1+w1,2al−12,2+w2,1al−13,1+w2,2al−13,2+wbnetj2,2=w1,1al−12,2+w1,2al−12,3+w2,1al−13,2+w2,2al−13,3+wb
所以:
∂Ed∂al−12,2=∂Ed∂netl1,1∂netl1,1∂al−12,2+∂Ed∂netl1,2∂netl1,2∂al−12,2+∂Ed∂netl2,1∂netl2,1∂al−12,2+∂Ed∂netl2,2∂netl2,2∂al−12,2=δl1,1w2,2+δl1,2w2,1+δl2,1w1,2+δl2,2w1,1(25)(26)
從上面三個例子,咱們發揮一下想象力,不難發現,計算
∂Ed∂al−1
,至關於把第
l
層的sensitive map周圍補一圈0,在與180度翻轉後的filter進行cross-correlation,就能獲得想要結果,以下圖所示:

由於卷積至關於將filter旋轉180度的cross-correlation,所以上圖的計算能夠用卷積公式完美的表達:
∂Ed∂al=δl∗Wl
上式中的
Wl
表示第
l
層的filter的權重數組。也能夠把上式的卷積展開,寫成求和的形式:
∂Ed∂ali,j=∑m∑nwlm,nδli+m,j+n
如今,咱們再求第二項
∂al−1i,j∂netl−1i,j
。由於
al−1i,j=f(netl−1i,j)
因此這一項極其簡單,僅求激活函數
f
的導數就好了。
∂al−1i,j∂netl−1i,j=f′(netl−1i,j)
將第一項和第二項組合起來,咱們獲得最終的公式:
δl−1i,j=∂Ed∂netl−1i,j=∂Ed∂al−1i,j∂al−1i,j∂netl−1i,j=∑m∑nwlm,nδli+m,j+nf′(netl−1i,j)(式7)(27)(28)(29)
也能夠將式7寫成卷積的形式:
δl−1=δl∗Wl∘f′(netl−1)(式8)
其中,符號
∘
表示element-wise product,即將矩陣中每一個對應元素相乘。注意式8中的
δl−1
、
δl
、
netl−1
都是矩陣。
以上就是步長爲一、輸入的深度爲一、filter個數爲1的最簡單的狀況,卷積層偏差項傳遞的算法。下面咱們來推導一下步長爲S的狀況。
卷積步長爲S時的偏差傳遞
咱們先來看看步長爲S與步長爲1的差異。

如上圖,上面是步長爲1時的卷積結果,下面是步長爲2時的卷積結果。咱們能夠看出,由於步長爲2,獲得的feature map跳過了步長爲1時相應的部分。所以,當咱們反向計算偏差項時,咱們能夠對步長爲S的sensitivity map相應的位置進行補0,將其『還原』成步長爲1時的sensitivity map,再用式8進行求解。
輸入層深度爲D時的偏差傳遞
當輸入深度爲D時,filter的深度也必須爲D,
l−1
層的
di
通道只與filter的
di
通道的權重進行計算。所以,反向計算偏差項時,咱們可使用式8,用filter的第
di
通道權重對第
l
層sensitivity map進行卷積,獲得第
l−1
層
di
通道的sensitivity map。以下圖所示:

filter數量爲N時的偏差傳遞
filter數量爲N時,輸出層的深度也爲N,第
i
個filter卷積產生輸出層的第
i
個feature map。因爲第
l−1
層每一個加權輸入
netl−1d,i,j
都同時影響了第
l
層全部feature map的輸出值,所以,反向計算偏差項時,須要使用全導數公式。也就是,咱們先使用第
d
個filter對第
l
層相應的第
d
個sensitivity map進行卷積,獲得一組N個
l−1
層的偏sensitivity map。依次用每一個filter作這種卷積,就獲得D組偏sensitivity map。最後在各組之間將N個偏sensitivity map 按元素相加,獲得最終的N個
l−1
層的sensitivity map:
δl−1=∑d=0Dδld∗Wld∘f′(netl−1)(式9)
以上就是卷積層偏差項傳遞的算法,若是讀者還有所困惑,能夠參考後面的代碼實現來理解。
卷積層filter權重梯度的計算
咱們要在獲得第
l
層sensitivity map的狀況下,計算filter的權重的梯度,因爲卷積層是權重共享的,所以梯度的計算稍有不一樣。

如上圖所示,
ali,j
是第
l−1
層的輸出,
wi,j
是第
l
層filter的權重,
δli,j
是第
l
層的sensitivity map。咱們的任務是計算
wi,j
的梯度,即
∂Ed∂wi,j