在卷积神经网络(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) 输出各隐藏层与输出层的线性关系系数矩阵