关于卷积神经网络的正向和反向传播网上已经有了大量的技术指导,但是绝大部分都止步于卷积核步长为1,且通道数为1的简单的示意性的推导,当步长为2时,大多数的教程都语焉不详,或直接跳过。我在这里就对步长为2以上的卷积操作进行详细讨论。本文假设读者已经基本掌握神经网络的链式求导法则,所以不会再讲这些细节。另外,本文只考虑卷积操作的正向和反向传播,如果想对池化层的相应过程做了解可以直接移步参考文献。
申明:本文所涉及的卷积不对卷积核做180°翻转操作。
1. 一些记号
我们以l代表层数,Hl,Wl代表第l层图像的长和宽,nl代表第l层的通道数。wl代表第l层的卷积核,它的形状为(k1,k2,nl),而bl是偏置项,形状为(1,1,nl)。步长用sl表示,由于我们只看其中一层的传播的,所以下文忽略这个步长的上标l,用s表示。Zl是**前的线性组合,Al代表**后的输出,有Al=g(Zl),而g(·)则是**函数。其中,Zl和Al是相同形状的三维张量,形状为(Hl,Wl,nl)。
另外总的代价函数为J, ∂J∂w代表代价函数对卷积核参数的梯度,我们简写用dw表示, 同样还有误差敏感项∂J∂Z,简写作dZ。
另外,关于坐标的记号:
上文中所述的Al,Zl,wl都是三维矩阵(张量),前两个维度表示平面2D坐标(第一个维度指示行,第二个维度指示列),最后一个维度代表通道。在具体表示某一个元素时,我会用脚标的形式给出,例如Zli,j,k(i=0,1,…,Hl−1;j=0,1,…,Wl−1;k=0,1,…,nl−1)代表第k号通道下第i行第j列的元素(注意i,j,k都是从0开始计数的)。而有时候,我们会想表示某个通道的全部元素,例如wl·,·,k′代表第l层第k′个卷积核的全部元素,这时它是一个二维的矩阵(相当于对原来的三维张量wl做了切片操作)。
2. 前向传播
我们先看卷积核的滑动过程,假设我们有一张7×7的图片(这里只画出来了一个通道),卷积核大小为3×3,步长为2,那么卷积过后可以得到3×3的图片。

彩色画笔标出来的框框代表了卷积核滑动后产生结果。相信聪明的你一定看的明白。
现在我们讨论一下卷积前后坐标的变化情况:
我们看卷积后的小图片(等号右边3×3的图片),它的左上角(0,0)对应了7×7的大图片上(0,0)到(2,2)的所有方格(蓝色线所覆盖的方格)。而小图片上红色点(0,1)对应了大图片(0,2)到(2,4)的方格,绿色粗点(0,2)则对应了(0,4)到(2,6)的方格。所以,卷积后的坐标(i,j)对应了卷积前(i∗s,j∗s)到(i∗s+k1−1,j∗s+k2−1)的坐标。
综上,我们抽象出前向传播的过程,如下所示:
Zli,j,k=∑k′=0nl−1−1∑m=0k1−1∑n=0k2−1Al−1i∗s+m,j∗s+n,k′∗wlm,n,k+blk
Ali,j,k=g(Zli,j,k)
式中:
i=0,1,…,Hl−1;
j=0,1,…,Wl−1;
k=0,1,…nl−1;
其中,卷积前后图片长度H和宽度W的变化情况如下:
Hl=⌊Hl−1−k1s⌋+1;
Wl=⌊Wl−1−k2s⌋+1;
公式解释:⌊·⌋是向下取整操作,Al−1代表了卷积前的大图片, Zl就是卷积后的小图片,它们之间的坐标存在一个s的倍数关系。其中最左边的累加号代表对卷积核wl·,·,k对Al的所有通道做了2D的卷积操作,第二个和第三个累加就是具体某一层的二维卷积操作,稍加推导你就能明白。
3. 反向传播
3.1 dw的求法
我们知道wl是一个三维的张量,Zl也是三维的张量,而且两者的第三个维度,也就是通道维是相等。形象的说,第一个卷积核wl·,·,0对Al−1做卷积可以得到Zl的第一个通道,即Zl·,·,0,那么第二个卷积核wl·,·,1对Al−1做卷积可以得到Zl的第二个通道,即Zl·,·,1。所以wl·,·,k′仅仅通过Zl·,·,k′对代价函数J的误差做出贡献,那么误差反向传播回来的时候,也就是当我们求dwm′,n′,k′时,不需要对通道维做累加,只需要对平面的两个维度做累加即可。
用公式来描述就是:
dwlm′,n′,k′=∑i∑j∂J∂Zli,j,k′∗∂Zli,j,k′∂wlm′,n′,k′
那么平面上两个的坐标i,j满足什么样的条件呢?
假设在下面这幅图中,我们要求dw1,1,k′(k′=0,1…,nl−1),卷积核(1,1)上的参数(红点)在大图片(Al−1)上滑过的位置由红点标出,而做卷积的结果则显示在了小图片的红点上。

所以,卷积结果的二维坐标i,j会布满整个输出的图像,公式如下:
dwlm′,n′,k′=∑K=0nl−1−1∑i=0Hl−1∑j=0Wl−1Al−1m′+i∗s,n′+j∗s,K∗dZli,j,k′
3.2 dZ的求法
上一个求dw的式子中,我们假设dZ是已知的。现在我们来求dZ。由于我们这里只画出了一层卷积层,即第l层,所以我们就根据dZl求dZl−1。
注意在这里,求dZl−1时,我们需要对通道数做累加,因为卷积核wl·,·,k′(k′=0,1…nl−1)是对Zl−1的所有通道做卷积操作(其实是直接对Al−1做卷积,但是Al−1和Zl−1的元素是一一对应的,所以在计算图上两者地位是一致的),从而得到Zl·,·,k′对误差做贡献的。
形象的画图表示就是这样:

所以对于特定的一层Zl−1·,·,k′,它的梯度是需要对通道做累加的。
公式如下:
dZl−1i′,j′,k′=∑k=0nl−1∑i∑j∂J∂Zli,j,k∗∂Zli,j,k∂Zl−1i′,j′,k′
同样的,下面讨论平面上两个的坐标i,j满足什么样的条件。看图说话:

假设我们要求的是紫色标出来的方格(2,2)处的dZl−12,2,k′,那么卷积核上滑过该点的位置分别是红色点(2,2),绿色点(2,0) ,蓝色点(0,2)和棕色点(0,0),产生在Zl上的结果也由个颜色对应的点位所示。抽象成数学式子就是:
dZl−1i′,j′,k′=∑k=0nl−1∑i∑jdZli,j,k∗wli′−j∗s,j′−j∗s,k∗g′(Zi−1i′,j′,k′)
式中:
i′−k1s<i⩽min(i′s,Hl−1),i∈N
j′−k2s<j⩽max(j′s,Wl−1),j∈N
建议各位旁友拿起纸和笔推导一下,尤其上面两个关于i,j的限制条件。
3.3 db的求法
db最为简单,我们直接给出结果:
dblk′=∑i=0Hl−1∑j=0Wl−1dZli,j,k′
参考文献
http://www.jefkine.com/general/2016/09/05/backpropagation-in-convolutional-neural-networks/