在卷積神經網絡(CNN)前向傳播算法中,咱們對CNN的前向傳播算法作了總結,基於CNN前向傳播算法的基礎,咱們下面就對CNN的反向傳播算法作一個總結。在閱讀本文前,建議先研究DNN的反向傳播算法:深度神經網絡(DNN)反向傳播算法(BP)css
1. 回顧DNN的反向傳播算法
咱們首先回顧DNN的反向傳播算法。在DNN中,咱們是首先計算出輸出層的
δL
δL:html
δL=∂J(W,b)∂zL=∂J(W,b)∂aL⊙σ′(zL)
δL=∂J(W,b)∂zL=∂J(W,b)∂aL⊙σ′(zL)
利用數學概括法,用
δl+1
δl+1的值一步步的向前求出第l層的
δl
δl,表達式爲:git
δl=δl+1∂zl+1∂zl=(Wl+1)Tδl+1⊙σ′(zl)
δl=δl+1∂zl+1∂zl=(Wl+1)Tδl+1⊙σ′(zl)
有了
δl
δl的表達式,從而求出
W,b
W,b的梯度表達式:github
∂J(W,b)∂Wl=∂J(W,b,x,y)∂zl∂zl∂Wl=δl(al−1)T
∂J(W,b)∂Wl=∂J(W,b,x,y)∂zl∂zl∂Wl=δl(al−1)T
∂J(W,b,x,y)∂bl=∂J(W,b)∂zl∂zl∂bl=δl
∂J(W,b,x,y)∂bl=∂J(W,b)∂zl∂zl∂bl=δl
有了
W,b
W,b梯度表達式,就能夠用梯度降低法來優化
W,b
W,b,求出最終的全部
W,b
W,b的值。算法
如今咱們想把一樣的思想用到CNN中,很明顯,CNN有些不一樣的地方,不能直接去套用DNN的反向傳播算法的公式。網絡
2. CNN的反向傳播算法思想
要套用DNN的反向傳播算法到CNN,有幾個問題須要解決:函數
1)池化層沒有激活函數,這個問題倒比較好解決,咱們能夠令池化層的激活函數爲
σ(z)=z
σ(z)=z,即激活後就是本身自己。這樣池化層激活函數的導數爲1.post
2)池化層在前向傳播的時候,對輸入進行了壓縮,那麼咱們如今須要向前反向推導
δl−1
δl−1,這個推導方法和DNN徹底不一樣。學習
3) 卷積層是經過張量卷積,或者說若干個矩陣卷積求和而得的當前層的輸出,這和DNN很不相同,DNN的全鏈接層是直接進行矩陣乘法獲得當前層的輸出。這樣在卷積層反向傳播的時候,上一層的
δl−1
δl−1遞推計算方法確定有所不一樣。優化
4)對於卷積層,因爲
W
W使用的運算是卷積,那麼從
δl
δl推導出該層的全部卷積核的
W,b
W,b的方式也不一樣。
從上面能夠看出,問題1比較好解決,可是問題2,3,4就須要好好的動一番腦筋了,而問題2,3,4也是解決CNN反向傳播算法的關鍵所在。另外你們要注意到的是,DNN中的
al,zl
al,zl都只是一個向量,而咱們CNN中的
al,zl
al,zl都是一個張量,這個張量是三維的,即由若干個輸入的子矩陣組成。
下面咱們就針對問題2,3,4來一步步研究CNN的反向傳播算法。
在研究過程當中,須要注意的是,因爲卷積層能夠有多個卷積核,各個卷積核的處理方法是徹底相同且獨立的,爲了簡化算法公式的複雜度,咱們下面提到卷積核都是卷積層中若干卷積核中的一個。
3. 已知池化層的
δl
δl,推導上一隱藏層的
δl−1
δl−1
咱們首先解決上面的問題2,若是已知池化層的
δl
δl,推導出上一隱藏層的
δl−1
δl−1。
在前向傳播算法時,池化層通常咱們會用MAX或者Average對輸入進行池化,池化的區域大小已知。如今咱們反過來,要從縮小後的偏差
δl
δl,還原前一次較大區域對應的偏差。
在反向傳播時,咱們首先會把
δl
δl的全部子矩陣矩陣大小還原成池化以前的大小,而後若是是MAX,則把
δl
δl的全部子矩陣的各個池化局域的值放在以前作前向傳播算法獲得最大值的位置。若是是Average,則把
δl
δl的全部子矩陣的各個池化局域的值取平均後放在還原後的子矩陣位置。這個過程通常叫作upsample。
用一個例子能夠很方便的表示:假設咱們的池化區域大小是2x2。
δl
δl的第k個子矩陣爲:
δlk=(2486)
δkl=(2846)
因爲池化區域爲2x2,咱們先講
δlk
δkl作還原,即變成:
⎛⎝⎜⎜⎜0000024008600000⎞⎠⎟⎟⎟
(0000028004600000)
若是是MAX,假設咱們以前在前向傳播時記錄的最大值位置分別是左上,右下,右上,左下,則轉換後的矩陣爲:
⎛⎝⎜⎜⎜2000004000060800⎞⎠⎟⎟⎟
(2000000804000060)
若是是Average,則進行平均:轉換後的矩陣爲:
⎛⎝⎜⎜⎜0.50.5110.50.511221.51.5221.51.5⎞⎠⎟⎟⎟
(0.50.5220.50.522111.51.5111.51.5)
這樣咱們就獲得了上一層
∂J(W,b)∂al−1k
∂J(W,b)∂akl−1的值,要獲得
δl−1k
δkl−1:
δl−1k=∂J(W,b)∂al−1k∂al−1k∂zl−1k=upsample(δlk)⊙σ′(zl−1k)
δkl−1=∂J(W,b)∂akl−1∂akl−1∂zkl−1=upsample(δkl)⊙σ′(zkl−1)
其中,upsample函數完成了池化偏差矩陣放大與偏差從新分配的邏輯。
咱們歸納下,對於張量
δl−1
δl−1,咱們有:
δl−1=upsample(δl)⊙σ′(zl−1)
δl−1=upsample(δl)⊙σ′(zl−1)
4. 已知卷積層的
δl
δl,推導上一隱藏層的
δl−1
δl−1
對於卷積層的反向傳播,咱們首先回憶下卷積層的前向傳播公式:
al=σ(zl)=σ(al−1∗Wl+bl)
al=σ(zl)=σ(al−1∗Wl+bl)
其中
n_in
n_in爲上一隱藏層的輸入子矩陣個數。
在DNN中,咱們知道
δl−1
δl−1和
δl
δl的遞推關係爲:
δl=∂J(W,b)∂zl=∂J(W,b)∂zl+1∂zl+1∂zl=δl+1∂zl+1∂zl
δl=∂J(W,b)∂zl=∂J(W,b)∂zl+1∂zl+1∂zl=δl+1∂zl+1∂zl
所以要推導出
δl−1
δl−1和
δl
δl的遞推關係,必須計算
∂zl∂zl−1
∂zl∂zl−1的梯度表達式。
注意到
zl
zl和
zl−1
zl−1的關係爲:
zl=al−1∗Wl+bl=σ(zl−1)∗Wl+bl
zl=al−1∗Wl+bl=σ(zl−1)∗Wl+bl
所以咱們有:
δl−1=δl∂zl∂zl−1=δl∗rot180(Wl)⊙σ′(zl−1)
δl−1=δl∂zl∂zl−1=δl∗rot180(Wl)⊙σ′(zl−1)
這裏的式子其實和DNN的相似,區別在於對於含有卷積的式子求導時,卷積核被旋轉了180度。即式子中的
rot180()
rot180(),翻轉180度的意思是上下翻轉一次,接着左右翻轉一次。在DNN中這裏只是矩陣的轉置。那麼爲何呢?因爲這裏都是張量,直接推演參數太多了。咱們以一個簡單的例子說明爲啥這裏求導後卷積核要翻轉。
假設咱們
l−1
l−1層的輸出
al−1
al−1是一個3x3矩陣,第
l
l層的卷積核
Wl
Wl是一個2x2矩陣,採用1像素的步幅,則輸出
zl
zl是一個3x3的矩陣。咱們簡化
bl都是0
bl都是0,則有
al−1∗Wl=zl
al−1∗Wl=zl
咱們列出
a,W,z
a,W,z的矩陣表達式以下:
⎛⎝⎜a11a21a31a12a22a32a13a23a33⎞⎠⎟∗(w11w21w12w22)=(z11z21z12z22)
(a11a12a13a21a22a23a31a32a33)∗(w11w12w21w22)=(z11z12z21z22)
利用卷積的定義,很容易得出:
z11=a11w11+a12w12+a21w21+a22w22
z11=a11w11+a12w12+a21w21+a22w22
z12=a12w11+a13w12+a22w21+a23w22
z12=a12w11+a13w12+a22w21+a23w22
z21=a21w11+a22w12+a31w21+a32w22
z21=a21w11+a22w12+a31w21+a32w22
z22=a22w11+a23w12+a32w21+a33w22
z22=a22w11+a23w12+a32w21+a33w22
接着咱們模擬反向求導:
∇al−1=∂J(W,b)∂al−1=∂J(W,b)∂zl∂zl∂al=δl∂zl∂al
∇al−1=∂J(W,b)∂al−1=∂J(W,b)∂zl∂zl∂al=δl∂zl∂al
從上式能夠看出,對於
al−1
al−1的梯度偏差
∇al−1
∇al−1,等於第
l
l層的梯度偏差乘以
∂zl∂al
∂zl∂al,而
∂zl∂al
∂zl∂al對應上面的例子中相關聯的
w
w的值。假設咱們的
z
z矩陣對應的反向傳播偏差是
δ11,δ12,δ21,δ22
δ11,δ12,δ21,δ22組成的2x2矩陣,則利用上面梯度的式子和4個等式,咱們能夠分別寫出
∇al−1
∇al−1的9個標量的梯度。
好比對於
a11
a11的梯度,因爲在4個等式中
a11
a11只和
z11
z11有乘積關係,從而咱們有:
∇a11=δ11w11
∇a11=δ11w11
對於
a12
a12的梯度,因爲在4個等式中
a12
a12和
z12,z11
z12,z11有乘積關係,從而咱們有:
∇a12=δ11w12+δ12w11
∇a12=δ11w12+δ12w11
一樣的道理咱們獲得:
∇a13=δ12w12
∇a13=δ12w12
∇a21=δ11w21+δ21w11
∇a21=δ11w21+δ21w11
∇a22=δ11w22+δ12w21+δ21w12+δ22w11
∇a22=δ11w22+δ12w21+δ21w12+δ22w11
∇a23=δ12w22+δ22w12
∇a23=δ12w22+δ22w12
∇a31=δ21w21
∇a31=δ21w21
∇a32=δ21w22+δ22w21
∇a32=δ21w22+δ22w21
∇a33=δ22w22
∇a33=δ22w22
這上面9個式子其實能夠用一個矩陣卷積的形式表示,即:
⎛⎝⎜⎜⎜00000δ11δ2100δ12δ2200000⎞⎠⎟⎟⎟∗(w22w12w21w11)=⎛⎝⎜∇a11∇a21∇a31∇a12∇a22∇a32∇a13∇a23∇a33⎞⎠⎟
(00000δ11δ1200δ21δ2200000)∗(w22w21w12w11)=(∇a11∇a12∇a13∇a21∇a22∇a23∇a31∇a32∇a33)
爲了符合梯度計算,咱們在偏差矩陣周圍填充了一圈0,此時咱們將卷積核翻轉後和反向傳播的梯度偏差進行卷積,就獲得了前一次的梯度偏差。這個例子直觀的介紹了爲何對含有卷積的式子求導時,卷積核要翻轉180度的緣由。
以上就是卷積層的偏差反向傳播過程。
5. 已知卷積層的
δl
δl,推導該層的
W,b
W,b的梯度
好了,咱們如今已經能夠遞推出每一層的梯度偏差
δl
δl了,對於全鏈接層,能夠按DNN的反向傳播算法求該層
W,b
W,b的梯度,而池化層並無
W,b
W,b,也不用求
W,b
W,b的梯度。只有卷積層的
W,b
W,b須要求出。
注意到卷積層
z
z和
W,b
W,b的關係爲:
zl=al−1∗Wl+b
zl=al−1∗Wl+b
所以咱們有:
∂J(W,b)∂Wl=∂J(W,b)∂zl∂zl∂Wl=δl∗rot180(al−1)
∂J(W,b)∂Wl=∂J(W,b)∂zl∂zl∂Wl=δl∗rot180(al−1)
因爲咱們有上一節的基礎,你們應該清楚爲何這裏求導後
al−1
al−1要旋轉180度了。
而對於b,則稍微有些特殊,由於
δl
δl是三維張量,而
b
b只是一個向量,不能像DNN那樣直接和
δl
δl相等。一般的作法是將
δl
δl的各個子矩陣的項分別求和,獲得一個偏差向量,即爲
b
b的梯度:
∂J(W,b)∂bl=∑u,v(δl)u,v
∂J(W,b)∂bl=∑u,v(δl)u,v
6. CNN反向傳播算法總結
如今咱們總結下CNN的反向傳播算法,以最基本的批量梯度降低法爲例來描述反向傳播算法。
輸入:m個圖片樣本,CNN模型的層數L和全部隱藏層的類型,對於卷積層,要定義卷積核的大小K,卷積核子矩陣的維度F,填充大小P,步幅S。對於池化層,要定義池化區域大小k和池化標準(MAX或Average),對於全鏈接層,要定義全鏈接層的激活函數(輸出層除外)和各層的神經元個數。梯度迭代參數迭代步長
α
α,最大迭代次數MAX與中止迭代閾值
ϵ
ϵ
輸出:CNN模型各隱藏層與輸出層的
W,b
W,b
1) 初始化各隱藏層與輸出層的各
W,b
W,b的值爲一個隨機值。
2)for iter to 1 to MAX:
2-1) for i =1 to m:
a) 將CNN輸入
a1
a1設置爲
xi
xi對應的張量
b) for
l
l=2 to L-1,根據下面3種狀況進行前向傳播算法計算:
b-1) 若是當前是全鏈接層:則有
ai,l=σ(zi,l)=σ(Wlai,l−1+bi,l)
ai,l=σ(zi,l)=σ(Wlai,l−1+bi,l)
b-2) 若是當前是卷積層:則有
ai,l=σ(zi,l)=σ(Wl∗ai,l−1+bi,l)
ai,l=σ(zi,l)=σ(Wl∗ai,l−1+bi,l)
b-3) 若是當前是池化層:則有
ai,l=pool(ai,l−1)
ai,l=pool(ai,l−1), 這裏的pool指按照池化區域大小k和池化標準將輸入張量縮小的過程。
c) 對於輸出層第L層:
ai,L=softmax(zi,L)=softmax(Wi,Lai,L−1+bi,L)
ai,L=softmax(zi,L)=softmax(Wi,Lai,L−1+bi,L)
c) 經過損失函數計算輸出層的
δi,L
δi,L
d) for
l
l= L to 2, 根據下面3種狀況進行進行反向傳播算法計算:
d-1) 若是當前是全鏈接層:
δi,l=(Wl+1)Tδi,l+1⊙σ′(zi,l)
δi,l=(Wl+1)Tδi,l+1⊙σ′(zi,l)
d-2) 若是當前是卷積層:
δi,l=δi,l+1∗rot180(Wl+1)⊙σ′(zi,l)
δi,l=δi,l+1∗rot180(Wl+1)⊙σ′(zi,l)
d-3) 若是當前是池化層:
δi,l=upsample(δi,l+1)⊙σ′(zi,l)
δi,l=upsample(δi,l+1)⊙σ′(zi,l)
2-2) for
l
l = 2 to L,根據下面2種狀況更新第
l
l層的
Wl,bl
Wl,bl:
2-2-1) 若是當前是全鏈接層:
Wl=Wl−α∑i=1mδi,l(ai,l−1)T
Wl=Wl−α∑i=1mδi,l(ai,l−1)T,
bl=bl−α∑i=1mδi,l
bl=bl−α∑i=1mδi,l
2-2-2) 若是當前是卷積層,對於每個卷積核有:
Wl=Wl−α∑i=1mδi,l∗rot180(ai,l−1)
Wl=Wl−α∑i=1mδi,l∗rot180(ai,l−1),
bl=bl−α∑i=1m∑u,v(δi,l)u,v
bl=bl−α∑i=1m∑u,v(δi,l)u,v
2-3) 若是全部
W,b
W,b的變化值都小於中止迭代閾值
ϵ
ϵ,則跳出迭代循環到步驟3。
3) 輸出各隱藏層與輸出層的線性關係係數矩陣