本文转自《零基础入门深度学习》系列文章,阅读原文请移步这里
最近几年卷积神经网络中,激活函数往往不选择sigmoid或tanh函数,而是选择relu函数。Relu函数的定义是: f ( x ) = m a x ( 0 , x ) f(x)=max(0,x) f(x)=max(0,x)Relu函数图像如下图所示:
Relu函数作为激活函数,有下面几大优势:
全连接神经网络之所以不太适合图像识别任务,主要有以下几个方面的问题:
那么,卷积神经网络又是怎样解决这个问题的呢?主要有三个思路:
对于图像识别任务来说,卷积神经网络通过尽可能保留重要的参数,去掉大量不重要的参数,来达到更好的学习效果。
接下来,我们将详述卷积神经网络到底是何方神圣。
首先,我们先获取一个感性认识,下图1是一个卷积神经网络的示意图:
图1 卷积神经网络
如图1所示,一个卷积神经网络由若干卷积层、Pooling层、全连接层组成。你可以构建各种不同的卷积神经网络,它的常用架构模式为: I N P U T − > [ [ C O N V ] ∗ N − > P O O L ? ] ∗ M − > [ F C ] ∗ K INPUT -> [[CONV]*N -> POOL?]*M -> [FC]*K INPUT−>[[CONV]∗N−>POOL?]∗M−>[FC]∗K也就是N个卷积层叠加,然后(可选)叠加一个Pooling层,重复这个结构M次,最后叠加K个全连接层。
对于图1展示的卷积神经网络: I N P U T − > C O N V − > P O O L − > C O N V − > P O O L − > F C − > F C INPUT -> CONV -> POOL -> CONV -> POOL -> FC -> FC INPUT−>CONV−>POOL−>CONV−>POOL−>FC−>FC按照上述模式可以表示为: I N P U T − > [ [ C O N V ] ∗ 1 − > P O O L ] ∗ 2 − > [ F C ] ∗ 2 INPUT -> [[CONV]*1 -> POOL]*2 -> [FC]*2 INPUT−>[[CONV]∗1−>POOL]∗2−>[FC]∗2也就是: N = 1 , M = 2 , K = 2 N=1, M=2, K=2 N=1,M=2,K=2。
从图1我们可以发现卷积神经网络的层结构和全连接神经网络的层结构有很大不同。全连接神经网络每层的神经元是按照一维排列的,也就是排成一条线的样子;而卷积神经网络每层的神经元是按照三维排列的,也就是排成一个长方体的样子,有宽度、高度和深度。
对于图1展示的神经网络,我们看到输入层的宽度和高度对应于输入图像的宽度和高度,而它的深度为1。接着,第一个卷积层对这幅图像进行了卷积操作(后面我们会讲如何计算卷积),得到了三个Feature Map。这里的"3"可能是让很多初学者迷惑的地方,实际上,就是这个卷积层包含三个Filter,也就是三套参数,每个Filter都可以把原始输入图像卷积得到一个Feature Map,三个Filter就可以得到三个Feature Map。至于一个卷积层可以有多少个Filter,那是可以自由设定的。也就是说,卷积层的Filter个数也是一个超参数。我们可以把Feature Map可以看做是通过卷积变换提取到的图像特征,三个Filter就对原始图像提取出三组不同的特征,也就是得到了三个Feature Map,也称做三个通道(channel)。
继续观察图1,在第一个卷积层之后,Pooling层对三个Feature Map做了下采样(后面我们会讲如何计算下采样),得到了三个更小的Feature Map。接着,是第二个卷积层,它有5个Filter。每个Fitler都把前面下采样之后的3个Feature Map卷积在一起,得到一个新的Feature Map。这样,5个Filter就得到了5个Feature Map。接着,是第二个Pooling,继续对5个Feature Map进行下采样,得到了5个更小的Feature Map。
图1所示网络的最后两层是全连接层。第一个全连接层的每个神经元,和上一层5个Feature Map中的每个神经元相连,第二个全连接层(也就是输出层)的每个神经元,则和第一个全连接层的每个神经元相连,这样得到了整个网络的输出。
至此,我们对卷积神经网络有了最基本的感性认识。接下来,我们将介绍卷积神经网络中各种层的计算和训练。
我们用一个简单的例子来讲述如何计算卷积,然后,我们抽象出卷积层的一些重要概念和计算方法。
假设有一个55的图像,使用一个33的filter进行卷积,想得到一个33的Feature Map,如下所示:
为了清楚的描述卷积计算过程,我们首先对图像的每个像素进行编号,用 x i , j x_{i,j} xi,j表示图像的第行第列元素;对filter的每个权重进行编号,用表示第行第列权重,用表示filter的偏置项;对Feature Map的每个元素进行编号,用表示Feature Map的第行第列元素;用表示激活函数(这个例子选择relu函数作为激活函数)。然后,使用下列公式计算卷积: a i , j = f ( ∑ m = 0 2 ∑ n = 0 2 w m , n x i + m , j + n + w b ) ( 式 1 ) a_{i,j}=f(\sum_{m=0}^2\sum_{n=0}^2w_{m,n}x_{i+m,j+n}+w_b) \space\space\space\space\space\space(式1) ai,j=f(m=0∑2n=0∑2wm,nxi+m,j+n+wb) (式1)例如,对于Feature Map左上角元素 a 0 , 0 a_{0,0} a0,0来说,其卷积计算方法为: a 0 , 0 = f ( ∑ m = 0 2 ∑ n = 0 2 w m , n x 0 + m , 0 + n + w b ) a_{0,0}=f(\sum_{m=0}^2\sum_{n=0}^2w_{m,n}x_{0+m,0+n}+w_b)\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space a0,0=f(m=0∑2n=0∑2wm,nx0+m,0+n+wb) = r e l u ( w 0 , 0 x 0 , 0 + w 0 , 1 x 0 , 1 + w 0 , 2 x 0 , 2 + w 1 , 0 x 1 , 0 + w 1 , 1 x 1 , 1 + w 1 , 2 x 1 , 2 + w 2 , 0 x 2 , 0 + w 2 , 1 x 2 , 1 + w 2 , 2 x 2 , 2 ) \space\space\space\space\space\space\space\space\space\space=relu(w_{0,0}x_{0,0} + w_{0,1}x_{0,1} + w_{0,2}x_{0,2} + w_{1,0}x_{1,0} + w_{1,1}x_{1,1} + w_{1,2}x_{1,2} + w_{2,0}x_{2,0} + w_{2,1}x_{2,1} + w_{2,2}x_{2,2}) =relu(w0,0x0,0+w0,1x0,1+w0,2x0,2+w1,0x1,0+w1,1x1,1+w1,2x1,2+w2,0x2,0+w2,1x2,1+w2,2x2,2) = r e l u ( 1 + 0 + 1 + 0 + 1 + 0 + 0 + 0 + 1 + 0 ) =relu(1+0+1+0+1+0+0+0+1+0)\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space =relu(1+0+1+0+1+0+0+0+1+0) = r e l u ( 4 ) = 4 =relu(4)=4\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space =relu(4)=4 计算结果如下图所示:
接下来,Feature Map的元素 a 0 , 1 a_{0,1} a0,1的卷积计算方法为: a 0 , 1 = f ( ∑ m = 0 2 ∑ n = 0 2 w m , n x 0 + m , 1 + n + w b ) a_{0,1}=f(\sum_{m=0}^2\sum_{n=0}^2w_{m,n}x_{0+m,1+n}+w_b)\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space a0,1=f(m=0∑2n=0∑2wm,nx0+m,1+n+wb) = r e l u ( w 0 , 0 x 0 , 1 + w 0 , 1 x 0 , 2 + w 0 , 2 x 0 , 3 + w 1 , 0 x 1 , 1 + w 1 , 1 x 1 , 2 + w 1 , 2 x 1 , 3 + w 2 , 0 x 2 , 1 + w 2 , 1 x 2 , 2 + w 2 , 2 x 2 , 3 ) \space\space\space\space\space\space\space\space\space\space=relu(w_{0,0}x_{0,1} + w_{0,1}x_{0,2} + w_{0,2}x_{0,3} + w_{1,0}x_{1,1} + w_{1,1}x_{1,2} + w_{1,2}x_{1,3} + w_{2,0}x_{2,1} + w_{2,1}x_{2,2} + w_{2,2}x_{2,3}) =relu(w0,0x0,1+w0,1x0,2+w0,2x0,3+w1,0x1,1+w1,1x1,2+w1,2x1,3+w2,0x2,1+w2,1x2,2+w2,2x2,3) = r e l u ( 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 ) =relu(1+0+0+0+1+0+0+0+1+0)\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space =relu(1+0+0+0+1+0+0+0+1+0) = r e l u ( 3 ) = 3 =relu(3)=3\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space =relu(3)=3 计算结果如下图所示:
可以依次计算出Feature Map中所有元素的值。下面的动画显示了整个Feature Map的计算过程:
上面的计算过程中,步幅(stride)为1。步幅可以设为大于1的数。例如,当步幅为2时,Feature Map计算如下:
我们注意到,当步幅设置为2的时候,Feature Map就变成22了。这说明图像大小、步幅和卷积后的Feature Map大小是有关系的。事实上,它们满足下面的关系: W o u t p u t = ( W i n p u t − F + 2 P ) / S + 1 ( 式 2 ) W_{output}=(W_{input}-F+2P)/S+1\space\space\space\space\space\space(式2) Woutput=(Winput−F+2P)/S+1 (式2) H o u t p u t = ( H i n p u t − F + 2 P ) / S + 1 ( 式 3 ) H_{output}=(H_{input}-F+2P)/S+1\space\space\space\space\space\space(式3) Houtput=(Hinput−F+2P)/S+1 (式3)在上面两个公式中, W o u t p u t W_{output} Woutput是卷积后Feature Map的宽度; W i n p u t W_{input} Winput是卷积前图像的宽度; F F F是filter的宽度; P P P是Zero Padding数量,Zero Padding是指在原始图像周围补几圈0,如果的值是1,那么就补1圈0; S S S是步幅; H o u t p u t H_{output} Houtput是卷积后Feature Map的高度; H i n t p u t H_{intput} Hintput是卷积前图像的宽度。式2和式3本质上是一样的。
以前面的例子来说,图像宽度 W i n p u t = 5 W_{input}=5 Winput=5,filter宽度 F = 3 F=3 F=3,Zero Padding P = 0 P=0 P=0,步幅 S = 2 S=2 S=2,则 W o u t p u t = ( W i n p u t − F + 2 P ) / S + 1 W_{output}=(W_{input}-F+2P)/S+1 Woutput=(Winput−F+2P)/S+1 = ( 5 − 3 + 2 ∗ 0 ) / 2 + 1 \space\space\space\space\space=(5-3+2*0)/2+1 =(5−3+2∗0)/2+1 = 2 =2\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space =2 说明Feature Map宽度是2。同样,我们也可以计算出Feature Map高度也是2。
前面我们已经讲了深度为1的卷积层的计算方法,如果深度大于1怎么计算呢?其实也是类似的。如果卷积前的图像深度为D,那么相应的filter的深度也必须为D。我们扩展一下式1,得到了深度大于1的卷积计算公式: a i , j = f ( ∑ d = 0 D − 1 ∑ m = 0 F − 1 ∑ n = 0 F − 1 w d , m , n x d , i + m , j + n + w b ) ( 式 4 ) a_{i,j}=f(\sum_{d=0}^{D-1}\sum_{m=0}^{F-1}\sum_{n=0}^{F-1}w_{d,m,n}x_{d,i+m,j+n}+w_b)\space\space\space\space\space\space(式4) ai,j=f(d=0∑D−1m=0∑F−1n=0∑F−1wd,m,nxd,i+m,j+n+wb) (式4)在式4中,D是深度;F是filter的大小(宽度或高度,两者相同); w d , m , n w_{d,m,n} wd,m,n表示filter的第 d d d层第 m m m行第 n n n列权重; a d , i , j a_{d,i,j} ad,i,j表示图像的第 d d d层第 i i i行第 j j j列像素;其它的符号含义和式1是相同的,不再赘述。
我们前面还曾提到,每个卷积层可以有多个filter。每个filter和原始图像进行卷积后,都可以得到一个Feature Map。因此,卷积后Feature Map的深度(个数)和卷积层的filter个数是相同的。
下面的动画显示了包含两个filter的卷积层的计算。我们可以看到773输入,经过两个333filter的卷积(步幅为2),得到了332的输出。另外我们也会看到下图的Zero padding是1,也就是在输入元素的周围补了一圈0。Zero padding对于图像边缘部分的特征提取是很有帮助的。
以上就是卷积层的计算方法。这里面体现了局部连接和权值共享:每层神经元只和上一层部分神经元相连(卷积计算规则),且filter的权值对于上一层所有神经元都是一样的。对于包含两个333的fitler的卷积层来说,其参数数量仅有(333+1)*2=56个,且参数数量与上一层神经元个数无关。与全连接神经网络相比,其参数数量大大减少了。
不想了解太多数学细节的读者可以跳过这一节,不影响对全文的理解。
下面我们介绍二维卷积公式。
设矩阵 A A A, B B B,其行、列数分别为 m a m_a ma、 n a n_a na、 m b m_b mb、 n b n_b nb,则二维卷积公式如下: C s , t = ∑ 0 m a − 1 ∑ 0 n a − 1 A m , n B s − m , t − n C_{s,t}=\sum_{0}^{m_a-1}\sum_{0}^{n_a-1}A_{m,n}B_{s-m,t-n} Cs,t=0∑ma−10∑na−1Am,nBs−m,t−n且 s , t s,t s,t满足条件 0 ⪕ s < m a + m b − 1 , 0 ⪕ t < n a + n b − 1 0\eqslantless s \lt m_a + m_b-1,0\eqslantless t \lt n_a + n_b-1 0⪕s<ma+mb−1,0⪕t<na+nb−1。
我们可以把上式写成 C = A ∗ B ( 式 5 ) C=A*B\space\space\space\space\space\space(式5) C=A∗B (式5)如果我们按照式5来计算卷积,我们可以发现矩阵A实际上是filter,而矩阵B是待卷积的输入,位置关系也有所不同:
从上图可以看到,A左上角的值 a 0 , 0 a_{0,0} a0,0与B对应区块中右下角的值 b 1 , 1 b_{1,1} b1,1相乘,而不是与左上角的 b 0 , 0 b_{0,0} b0,0相乘。因此,数学中的卷积和卷积神经网络中的『卷积』还是有区别的,为了避免混淆,我们把卷积神经网络中的『卷积』操作叫做互相关(cross-correlation)操作。
卷积和互相关操作是可以转化的。首先,我们把矩阵A翻转180度,然后再交换A和B的位置(即把B放在左边而把A放在右边。卷积满足交换率,这个操作不会导致结果变化),那么卷积就变成了互相关。
如果我们不去考虑两者这么一点点的区别,我们可以把式5代入到式4: A = f ( ∑ d = 0 D − 1 X d ∗ W d + w b ) ( 式 6 ) A=f(\sum_{d=0}^{D-1}X_d*W_d+w_b)\space\space\space\space\space\space(式6) A=f(d=0∑D−1Xd∗Wd+wb) (式6)其中, A A A是卷积层输出的feature map。同式4相比,式6就简单多了。然而,这种简洁写法只适合步长为1的情况。
Pooling层主要的作用是下采样,通过去掉Feature Map中不重要的样本,进一步减少参数数量。Pooling的方法很多,最常用的是Max Pooling。Max Pooling实际上就是在nn的样本中取最大值,作为采样后的样本值。下图是22 max pooling:
除了Max Pooing之外,常用的还有Mean Pooling——取各样本的平均值。
对于深度为D的Feature Map,各层独立做Pooling,因此Pooling后的深度仍然为D。
全连接层输出值的计算和《深度学习之神经网络和反向传播算法》讲过的全连接神经网络是一样的,这里就不再赘述了。
和全连接神经网络相比,卷积神经网络的训练要复杂一些。但训练的原理是一样的:利用链式求导计算损失函数对每个权重的偏导数(梯度),然后根据梯度下降公式更新权重。训练算法依然是反向传播算法。
我们先回忆一下《深度学习之神经网络和反向传播算法》介绍的反向传播算法,整个算法分为三个步骤:
最后,根据梯度下降法则更新每个权重即可。
对于卷积神经网络,由于涉及到局部连接、下采样的等操作,影响到了第二步误差项 δ \delta δ的具体计算方法,而权值共享影响了第三步权重 w w w的梯度的计算方法。接下来,我们分别介绍卷积层和Pooling层的训练算法。
对于卷积层,我们先来看看上面的第二步,即如何将误差项 δ \delta δ传递到上一层;然后再来看看第三步,即如何计算filter每个权值 w w w的梯度。
卷积层误差项的传递
我们先来考虑步长为1、输入的深度为1、filter个数为1的最简单的情况。
假设输入的大小为3*3,filter大小为2*2,按步长为1卷积,我们将得到2*2的feature map。如下图所示:
在上图中,为了描述方便,我们为每个元素都进行了编号。用 δ i , j l − 1 \delta_{i,j}^{l-1} δi,jl−1表示第 l − 1 l-1 l−1层第 i i i行第 j j j列的误差项;用 w m , n w_{m,n} wm,n表示filter第 m m m行第 n n n列权重,用 w b w_b wb表示filter的偏置项;用 a i , j l − 1 a_{i,j}^{l-1} ai,jl−1表示第 l − 1 l-1 l−1层第 i i i行第 j j j列神经元的输出;用 n e t i , j l − 1 net_{i,j}^{l-1} neti,jl−1表示第 l − 1 l-1 l−1行神经元的加权输入;用 δ i , j l \delta_{i,j}^{l} δi,jl表示第 l l l层第 i i i行第 j j j列的误差项;用 f l − 1 f^{l-1} fl−1表示第 l − 1 l-1 l−1层的激活函数。它们之间的关系如下: n e t l = c o n v ( W l , a l − 1 ) + w b net^l=conv(W^l,a^{l-1}) + w_b netl=conv(Wl,al−1)+wb a i , j l − 1 = f l − 1 ( n e t i , j l − 1 ) a_{i,j}^{l-1}=f^{l-1}(net_{i,j}^{l-1})\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space ai,jl−1=fl−1(neti,jl−1) 上式中, n e t l net^l netl、 W l W^l Wl、 a l − 1 a^{l-1} al−1都是数组, W l W^l Wl是由 w m , n w_{m,n} wm,n组成的数组, c o n v conv conv表示卷积操作。
在这里,我们假设第 l l l中的每个 δ l \delta^l δl值都已经算好,我们要做的是计算第 l − 1 l-1 l−1层每个神经元的误差项 δ l − 1 \delta^{l-1} δl−1。
根据链式求导法则: δ i , j l − 1 = ∂ E d ∂ n e t i , j l − 1 \delta_{i,j}^{l-1}=\frac{\partial E_d}{\partial net_{i,j}^{l-1}} δi,jl−1=∂neti,jl−1∂Ed = ∂ E d ∂ a i , j l − 1 ∂ a i , j l − 1 ∂ n e t i , j l − 1 \space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=\frac{\partial E_d}{\partial a_{i,j}^{l-1}}\frac{\partial a_{i,j}^{l-1}}{\partial net_{i,j}^{l-1}} =∂ai,jl−1∂Ed∂neti,jl−1∂ai,jl−1我们先求第一项 ∂ E d ∂ a i , j l − 1 \frac{\partial E_d}{\partial a_{i,j}^{l-1}} ∂ai,jl−1∂Ed。我们先来看几个特例,然后从中总结出一般性的规律。
例1,计算 ∂ E d ∂ a 1 , 1 l − 1 \frac{\partial E_d}{\partial a_{1,1}^{l-1}} ∂a1,1l−1∂Ed, a 1 , 1 l − 1 a_{1,1}^{l-1} a1,1l−1仅与 n e t 1 , 1 l net_{1,1}^{l} net1,1l的计算有关: n e t 1 , 1 j = w 1 , 1 a 1 , 1 l − 1 + w 1 , 2 a 1 , 2 l − 1 + w 2 , 1 a 2 , 1 l − 1 + w 2 , 2 a 2 , 2 l − 1 + w b net_{1,1}^j=w_{1,1}a_{1,1}^{l-1}+w_{1,2}a_{1,2}^{l-1}+w_{2,1}a_{2,1}^{l-1}+w_{2,2}a_{2,2}^{l-1}+w_b net1,1j=w1,1a1,1l−1+w1,2a1,2l−1+w2,1a2,1l−1+w2,2a2,2l−1+wb因此: ∂ E d ∂ a 1 , 1 l − 1 = ∂ E d ∂ n e t 1 , 1 l ∂ n e t 1 , 1 l ∂ a 1 , 1 l − 1 \frac{\partial E_d}{\partial a_{1,1}^{l-1}}=\frac{\partial E_d}{\partial net_{1,1}^l}\frac{\partial net_{1,1}^l}{\partial a_{1,1}^{l-1}} ∂a1,1l−1∂Ed=∂net1,1l∂Ed∂a1,1l−1∂net1,1l = δ 1 , 1 l w 1 , 1 =\delta_{1,1}^lw_{1,1}\space =δ1,1lw1,1 例2,计算 ∂ E d ∂ a 1 , 2 l − 1 \frac{\partial E_d}{\partial a_{1,2}^{l-1}} ∂a1,2l−1∂Ed, a 1 , 2 l − 1 a_{1,2}^{l-1} a1,2l−1与 n e t 1 , 1 l net_{1,1}^{l} net1,1l和 n e t 1 , 2 l net_{1,2}^{l} net1,2l的计算都有关: n e t 1 , 1 j = w 1 , 1 a 1 , 1 l − 1 + w 1 , 2 a 1 , 2 l − 1 + w 2 , 1 a 2 , 1 l − 1 + w 2 , 2 a 2 , 2 l − 1 + w b net_{1,1}^j=w_{1,1}a_{1,1}^{l-1}+w_{1,2}a_{1,2}^{l-1}+w_{2,1}a_{2,1}^{l-1}+w_{2,2}a_{2,2}^{l-1}+w_b net1,1j=w1,1a1,1l−1+w1,2a1,2l−1+w2,1a2,1l−1+w2,2a2,2l−1+wb n e t 1 , 2 j = w 1 , 1 a 1 , 2 l − 1 + w 1 , 2 a 1 , 3 l − 1 + w 2 , 1 a 2 , 2 l − 1 + w 2 , 2 a 2 , 3 l − 1 + w b net_{1,2}^j=w_{1,1}a_{1,2}^{l-1}+w_{1,2}a_{1,3}^{l-1}+w_{2,1}a_{2,2}^{l-1}+w_{2,2}a_{2,3}^{l-1}+w_b net1,2j=w1,1a1,2l−1+w1,2a1,3l−1+w2,1a2,2l−1+w2,2a2,3l−1+wb因此: ∂ E d ∂ a 1 , 2 l − 1 = ∂ E d ∂ n e t 1 , 1 l ∂ n e t 1 , 1 l ∂ a 1 , 2 l − 1 + ∂ E d ∂ n e t 1 , 2 l ∂ n e t 1 , 2 l ∂ a 1 , 2 l − 1 \frac{\partial E_d}{\partial a_{1,2}^{l-1}}=\frac{\partial E_d}{\partial net_{1,1}^l}\frac{\partial net_{1,1}^l}{\partial a_{1,2}^{l-1}}+\frac{\partial E_d}{\partial net_{1,2}^l}\frac{\partial net_{1,2}^l}{\partial a_{1,2}^{l-1}} ∂a1,2l−1∂Ed=∂net1,1l∂Ed∂a1,2l−1∂net1,1l+∂net1,2l∂Ed∂a1,2l−1∂net1,2l = δ 1 , 1 l w 1 , 2 + δ 1 , 2 l w 1 , 1 =\delta_{1,1}^lw_{1,2}+\delta_{1,2}^lw_{1,1}\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space =δ1,1lw1,2+δ1,2lw1,1 例3,计算 ∂ E d ∂ a 2 , 2 l − 1 \frac{\partial E_d}{\partial a_{2,2}^{l-1}} ∂a2,2l−1∂Ed, a 2 , 2 l − 1 a_{2,2}^{l-1} a2,2l−1与 n e t 1 , 1 l net_{1,1}^{l} net1,1l、 n e t 1 , 2 l net_{1,2}^{l} net1,2l、 n e t 2 , 1 l net_{2,1}^{l} net2,1l和 n e t 2 , 2 l net_{2,2}^{l} net2,2l的计算都有关: n e t 1 , 1 j = w 1 , 1 a 1 , 1 l − 1 + w 1 , 2 a 1 , 2 l − 1 + w 2 , 1 a 2 , 1 l − 1 + w 2 , 2 a 2 , 2 l − 1 + w b net_{1,1}^j=w_{1,1}a_{1,1}^{l-1}+w_{1,2}a_{1,2}^{l-1}+w_{2,1}a_{2,1}^{l-1}+w_{2,2}a_{2,2}^{l-1}+w_b net1,1j=w1,1a1,1l−1+w1,2a1,2l−1+w2,1a2,1l−1+w2,2a2,2l−1+wb n e t 1 , 2 j = w 1 , 1 a 1 , 2 l − 1 + w 1 , 2 a 1 , 3 l − 1 + w 2 , 1 a 2 , 2 l − 1 + w 2 , 2 a 2 , 3 l − 1 + w b net_{1,2}^j=w_{1,1}a_{1,2}^{l-1}+w_{1,2}a_{1,3}^{l-1}+w_{2,1}a_{2,2}^{l-1}+w_{2,2}a_{2,3}^{l-1}+w_b net1,2j=w1,1a1,2l−1+w1,2a1,3l−1+w2,1a2,2l−1+w2,2a2,3l−1+wb n e t 2 , 1 j = w 1 , 1 a 2 , 1 l − 1 + w 1 , 2 a 2 , 2 l − 1 + w 2 , 1 a 3 , 1 l − 1 + w 2 , 2 a 3 , 2 l − 1 + w b net_{2,1}^j=w_{1,1}a_{2,1}^{l-1}+w_{1,2}a_{2,2}^{l-1}+w_{2,1}a_{3,1}^{l-1}+w_{2,2}a_{3,2}^{l-1}+w_b net2,1j=w1,1a2,1l−1+w1,2a2,2l−1+w2,1a3,1l−1+w2,2a3,2l−1+wb n e t 2 , 2 j = w 1 , 1 a 2 , 2 l − 1 + w 1 , 2 a 2 , 3 l − 1 + w 2 , 1 a 3 , 2 l − 1 + w 2 , 2 a 3 , 3 l − 1 + w b net_{2,2}^j=w_{1,1}a_{2,2}^{l-1}+w_{1,2}a_{2,3}^{l-1}+w_{2,1}a_{3,2}^{l-1}+w_{2,2}a_{3,3}^{l-1}+w_b net2,2j=w1,1a2,2l−1+w1,2a2,3l−1+w2,1a3,2l−1+w2,2a3,3l−1+wb因此: ∂ E d ∂ a 2 , 2 l − 1 = ∂ E d ∂ n e t 1 , 1 l ∂ n e t 1 , 1 l ∂ a 2 , 2 l − 1 + ∂ E d ∂ n e t 1 , 2 l ∂ n e t 1 , 2 l ∂ a 2 , 2 l − 1 + ∂ E d ∂ n e t 2 , 1 l ∂ n e t 2 , 1 l ∂ a 2 , 2 l − 1 + ∂ E d ∂ n e t 2 , 2 l ∂ n e t 2 , 2 l ∂ a 2 , 2 l − 1 \frac{\partial E_d}{\partial a_{2,2}^{l-1}}=\frac{\partial E_d}{\partial net_{1,1}^l}\frac{\partial net_{1,1}^l}{\partial a_{2,2}^{l-1}}+\frac{\partial E_d}{\partial net_{1,2}^l}\frac{\partial net_{1,2}^l}{\partial a_{2,2}^{l-1}}+\frac{\partial E_d}{\partial net_{2,1}^l}\frac{\partial net_{2,1}^l}{\partial a_{2,2}^{l-1}}+\frac{\partial E_d}{\partial net_{2,2}^l}\frac{\partial net_{2,2}^l}{\partial a_{2,2}^{l-1}} ∂a2,2l−1∂Ed=∂net1,1l∂Ed∂a2,2l−1∂net1,1l+∂net1,2l∂Ed∂a2,2l−1∂net1,2l+∂net2,1l∂Ed∂a2,2l−1∂net2,1l+∂net2,2l∂Ed∂a2,2l−1∂net2,2l = δ 1 , 1 l w 2 , 2 + δ 1 , 2 l w 2 , 1 + δ 2 , 1 l w 1 , 2 + δ 2 , 2 l w 1 , 1 =\delta_{1,1}^lw_{2,2}+\delta_{1,2}^lw_{2,1}+\delta_{2,1}^lw_{1,2}+\delta_{2,2}^lw_{1,1}\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space =δ1,1lw2,2+δ1,2lw2,1+δ2,1lw1,2+δ2,2lw1,1 从上面三个例子,我们发挥一下想象力,不难发现,计算 ∂ E d ∂ a l − 1 \frac{\partial E_d}{\partial a^{l-1}} ∂al−1∂Ed,相当于把第 l l l层的sensitive map周围补一圈0,在与180度翻转后的filter进行cross-correlation,就能得到想要结果,如下图所示:
因为卷积相当于将filter旋转180度的cross-correlation,因此上图的计算可以用卷积公式完美的表达: ∂ E d ∂ a l = δ l ∗ W l \frac{\partial E_d}{\partial a^l}=\delta^l*W^l ∂al∂Ed=δl∗Wl上式中的 W l W^l Wl表示第 l l l层的filter的权重数组。也可以把上式的卷积展开,写成求和的形式: ∂ E d ∂ a i , j l = ∑ m ∑ n w m , n l δ i + m , j + n l \frac{\partial E_d}{\partial a^l_{i,j}}=\sum_m\sum_nw^l_{m,n}\delta^l_{i+m,j+n} ∂ai,jl∂Ed=m∑n∑wm,nlδi+m,j+nl现在,我们再求第二项 ∂ a i , j l − 1 ∂ n e t i , j l − 1 \frac{\partial a_{i,j}^{l-1}}{\partial net_{i,j}^{l-1}} ∂neti,jl−1∂ai,jl−1。因为 a i , j l − 1 = f ( n e t i , j l − 1 ) a_{i,j}^{l-1}=f(net_{i,j}^{l-1}) ai,jl−1=f(neti,jl−1)所以这一项极其简单,仅求激活函数 f f f的导数就行了。 ∂ a i , j l − 1 ∂ n e t i , j l − 1 = f ′ ( n e t i , j l − 1 ) \frac{\partial a_{i,j}^{l-1}}{\partial net_{i,j}^{l-1}}=f'(net_{i,j}^{l-1}) ∂neti,jl−1∂ai,jl−1=f′(neti,jl−1)将第一项和第二项组合起来,我们得到最终的公式: δ i , j l − 1 = ∂ E d ∂ n e t i , j l − 1 \delta_{i,j}^{l-1}=\frac{\partial E_d}{\partial net_{i,j}^{l-1}} δi,jl−1=∂neti,jl−1∂Ed = ∂ E d ∂ a i , j l − 1 ∂ a i , j l − 1 ∂ n e t i , j l − 1 =\frac{\partial E_d}{\partial a_{i,j}^{l-1}}\frac{\partial a_{i,j}^{l-1}}{\partial net_{i,j}^{l-1}} =∂ai,jl−1∂Ed∂neti,jl−1∂ai,jl−1 = ∑ m ∑ n w m , n l δ i + m , j + n l f ′ ( n e t i , j l − 1 ) ( 式 7 ) =\sum_m\sum_nw_{m,n}^l\delta^l_{i+m,j+n}f'(net_{i,j}^{l-1})\space\space\space\space\space\space(式7) =m∑n∑wm,nlδi+m,j+nlf′(neti,jl−1) (式7)也可以将式7写成卷积的形式: δ l − 1 = δ l ∗ W l ∘ f ′ ( n e t l − 1 ) ( 式 8 ) \delta^{l-1}=\delta^l*W^l\circ f'(net^{l-1})\space\space\space\space\space\space(式8) δl−1=δl∗Wl∘f′(netl−1) (式8)其中,符号 ∘ \circ ∘表示element-wise product,即将矩阵中每个对应元素相乘。注意式8中的 δ l − 1 \delta^{l-1} δl−1、 δ l \delta^{l} δl、 n e t l − 1 net^{l-1} netl−1都是矩阵。
以上就是步长为1、输入的深度为1、filter个数为1的最简单的情况,卷积层误差项传递的算法。下面我们来推导一下步长为S的情况。
现在我们考虑步长、深度、filter不是1的情况:
当卷积步长为S时
如上图,上面是步长为1时的卷积结果,下面是步长为2时的卷积结果。我们可以看出,因为步长为2,得到的feature map跳过了步长为1时相应的部分。因此,当我们反向计算误差项时,我们可以对步长为S的sensitivity map相应的位置进行补0,将其『还原』成步长为1时的sensitivity map,再用式8进行求解。
当输入深度为D时
此时filter的深度也必须为D, l − 1 l-1 l−1层的 d i d_i di通道只与filter的 d i d_i di通道的权重进行计算。因此,反向计算误差项时,我们可以使用式8,用filter的第 d i d_i di通道权重对第 l l l层sensitivity map进行卷积,得到第 l − 1 l-1 l−1层 d i d_i di通道的sensitivity map。如下图所示:
当filter数量为N时
filter数量为N时,输出层的深度也为N,第 i i i个filter卷积产生输出层的第 i i i个feature map。由于第 l − 1 l-1 l−1层每个加权输入 n e t d , i , j l − 1 net_{d,i,j}^{l-1} netd,i,jl−1都同时影响了第 l l l层所有feature map的输出值,因此,反向计算误差项时,需要使用全导数公式。也就是,我们先使用第 d d d个filter对第 l l l层相应的第 d d d个sensitivity map进行卷积,得到一组N个 l − 1 l-1 l−1层的偏sensitivity map。依次用每个filter做这种卷积,就得到D组偏sensitivity map。最后在各组之间将N个偏sensitivity map按元素相加,得到最终的N个 l − 1 l-1 l−1层的sensitivity map: δ l − 1 = ∑ d = 0 D δ d l ∗ W d l ∘ f ′ ( n e t l − 1 ) ( 式 9 ) \delta^{l-1}=\sum_{d=0}^D\delta_d^l*W_d^l\circ f'(net^{l-1})\space\space\space\space\space\space(式9) δl−1=d=0∑Dδdl∗Wdl∘f′(netl−1) (式9)以上就是卷积层误差项传递的算法,如果读者还有所困惑,可以参考后面的代码实现来理解。
卷积层filter权重梯度的计算
我们要在得到第 l l l层sensitivity map的情况下,计算filter的权重的梯度,由于卷积层是权重共享的,因此梯度的计算稍有不同。
如上图所示, a i , j l a_{i,j}^l ai,jl是第 l − 1 l-1 l−1层的输出, w i , j w_{i,j} wi,j是第 l l l层filter的权重, δ i , j l \delta_{i,j}^l δi,jl是第 l l l层的sensitivity map。我们的任务是计算 w i , j w_{i,j} wi,j的梯度,即 ∂ E d ∂ w i , j \frac{\partial E_d}{\partial w_{i,j}} ∂wi,j∂Ed。
为了计算偏导数,我们需要考察权重 w i , j w_{i,j} wi,j对 E d E_d Ed的影响。权重项 w i , j w_{i,j} wi,j通过影响 n e t i , j l net_{i,j}^l neti,jl的值,进而影响 E d E_d Ed。我们仍然通过几个具体的例子来看权重项 w i , j w_{i,j} wi,j对 n e t i , j l net_{i,j}^l neti,jl的影响,然后再从中总结出规律。
例1,计算 ∂ E d ∂ w 1 , 1 \frac{\partial E_d}{\partial w_{1,1}} ∂w1,1∂Ed: n e t 1 , 1 j = w 1 , 1 a 1 , 1 l − 1 + w 1 , 2 a 1 , 2 l − 1 + w 2 , 1 a 2 , 1 l − 1 + w 2 , 2 a 2 , 2 l − 1 + w b net_{1,1}^j=w_{1,1}a_{1,1}^{l-1}+w_{1,2}a_{1,2}^{l-1}+w_{2,1}a_{2,1}^{l-1}+w_{2,2}a_{2,2}^{l-1}+w_b net1,1j=w1,1a1,1l−1+w1,2a1,2l−1+w2,1a2,1l−1+w2,2a2,2l−1+wb n e t 1 , 2 j = w 1 , 1 a 1 , 2 l − 1 + w 1 , 2 a 1 , 3 l − 1 + w 2 , 1 a 2 , 2 l − 1 + w 2 , 2 a 2 , 3 l − 1 + w b net_{1,2}^j=w_{1,1}a_{1,2}^{l-1}+w_{1,2}a_{1,3}^{l-1}+w_{2,1}a_{2,2}^{l-1}+w_{2,2}a_{2,3}^{l-1}+w_b net1,2j=w1,1a1,2l−1+w1,2a1,3l−1+w2,1a2,2l−1+w2,2a2,3l−1+wb n e t 2 , 1 j = w 1 , 1 a 2 , 1 l − 1 + w 1 , 2 a 2 , 2 l − 1 + w 2 , 1 a 3 , 1 l − 1 + w 2 , 2 a 3 , 2 l − 1 + w b net_{2,1}^j=w_{1,1}a_{2,1}^{l-1}+w_{1,2}a_{2,2}^{l-1}+w_{2,1}a_{3,1}^{l-1}+w_{2,2}a_{3,2}^{l-1}+w_b net2,1j=w1,1a2,1l−1+w1,2a2,2l−1+w2,1a3,1l−1+w2,2a3,2l−1+wb n e t 2 , 2 j = w 1 , 1 a 2 , 2 l − 1 + w 1 , 2 a 2 , 3 l − 1 + w 2 , 1 a 3 , 2 l − 1 + w 2 , 2 a 3 , 3 l − 1 + w b net_{2,2}^j=w_{1,1}a_{2,2}^{l-1}+w_{1,2}a_{2,3}^{l-1}+w_{2,1}a_{3,2}^{l-1}+w_{2,2}a_{3,3}^{l-1}+w_b net2,2j=w1,1a2,2l−1+w1,2a2,3l−1+w2,1a3,2l−1+w2,2a3,3l−1+wb从上面的公式看出,由于权值共享,权值 w i , j w_{i,j} wi,j对所有的 n e t i , j l net_{i,j}^l neti,jl都有影响。 E d E_d Ed是 n e t 1 , 1 l net_{1,1}^{l} net1,1l、 n e t 1 , 2 l net_{1,2}^{l} net1,2l、 n e t 2 , 1 l net_{2,1}^{l} net2,1l…的函数,而 n e t 1 , 1 l net_{1,1}^{l} net1,1l、 n e t 1 , 2 l net_{1,2}^{l} net1,2l、 n e t 2 , 1 l net_{2,1}^{l} net2,1l…又是 w 1 , 1 w_{1,1} w1,1的函数,根据全导数公式,计算 ∂ E d ∂ w 1 , 1 \frac{\partial E_d}{\partial w_{1,1}} ∂w1,1∂Ed就是要把每个偏导数都加起来: ∂ E d ∂ w 1 , 1 = ∂ E d ∂ n e t 1 , 1 l ∂ n e t 1 , 1 l ∂ w 1 , 1 + ∂ E d ∂ n e t 1 , 2 l ∂ n e t 1 , 2 l ∂ w 1 , 1 + ∂ E d ∂ n e t 2 , 1 l ∂ n e t 2 , 1 l ∂ w 1 , 1 + ∂ E d ∂ n e t 2 , 2 l ∂ n e t 2 , 2 l ∂ w 1 , 1 \frac{\partial E_d}{\partial w_{1,1}}=\frac{\partial E_d}{\partial net_{1,1}^l}\frac{\partial net_{1,1}^l}{\partial w_{1,1}}+\frac{\partial E_d}{\partial net_{1,2}^l}\frac{\partial net_{1,2}^l}{\partial w_{1,1}}+\frac{\partial E_d}{\partial net_{2,1}^l}\frac{\partial net_{2,1}^l}{\partial w_{1,1}}+\frac{\partial E_d}{\partial net_{2,2}^l}\frac{\partial net_{2,2}^l}{\partial w_{1,1}} ∂w1,1∂Ed=∂net1,1l∂Ed∂w1,1∂net1,1l+∂net1,2l∂Ed∂w1,1∂net1,2l+∂net2,1l∂Ed∂w1,1∂net2,1l+∂net2,2l∂Ed∂w1,1∂net2,2l = δ 1 , 1 l a 1 , 1 l − 1 + δ 1 , 2 l a 1 , 2 l − 1 + δ 2 , 1 l a 2 , 1 l − 1 + δ 2 , 2 l a 2 , 2 l − 1 =\delta_{1,1}^la_{1,1}^{l-1}+\delta_{1,2}^la_{1,2}^{l-1}+\delta_{2,1}^la_{2,1}^{l-1}+\delta_{2,2}^la_{2,2}^{l-1}\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space =δ1,1la1,1l−1+δ1,2la1,2l−1+δ2,1la2,1l−1+δ2,2la2,2l−1 例2,计算 ∂ E d ∂ w 1 , 2 \frac{\partial E_d}{\partial w_{1,2}} ∂w1,2∂Ed:
通过查看 w 1 , 2 w_{1,2} w1,2与 n e t i , j l net_{i,j}^l neti,jl的关系,我们很容易得到: ∂ E d ∂ w 1 , 2 = δ 1 , 1 l a 1 , 2 l − 1 + δ 1 , 2 l a 1 , 3 l − 1 + δ 2 , 1 l a 2 , 2 l − 1 + δ 2 , 2 l a 2 , 3 l − 1 \frac{\partial E_d}{\partial w_{1,2}}=\delta_{1,1}^la_{1,2}^{l-1}+\delta_{1,2}^la_{1,3}^{l-1}+\delta_{2,1}^la_{2,2}^{l-1}+\delta_{2,2}^la_{2,3}^{l-1} ∂w1,2∂Ed=δ1,1la1,2l−1+δ1,2la1,3l−1+δ2,1la2,2l−1+δ2,2la2,3l−1实际上,每个权重项都是类似的,我们不一一举例了。现在,是我们再次发挥想象力的时候,我们发现计算 ∂ E d ∂ w i , j \frac{\partial E_d}{\partial w_{i,j}} ∂wi,j∂Ed规律是: ∂ E d ∂ w i , j = ∑ m ∑ n δ m , n a i + m , j + n l − 1 \frac{\partial E_d}{\partial w_{i,j}}=\sum_m\sum_n\delta_{m,n}a_{i+m,j+n}^{l-1} ∂wi,j∂Ed=m∑n∑δm,nai+m,j+nl−1也就是用sensitivity map作为卷积核,在input上进行cross-correlation,如下图所示:
最后,我们来看一看偏置项的梯度 ∂ E d ∂ w b \frac{\partial E_d}{\partial w_{b}} ∂wb∂Ed。通过查看前面的公式,我们很容易发现: ∂ E d ∂ w b = ∂ E d ∂ n e t 1 , 1 l ∂ n e t 1 , 1 l ∂ w b + ∂ E d ∂ n e t 1 , 2 l ∂ n e t 1 , 2 l ∂ w b + ∂ E d ∂ n e t 2 , 1 l ∂ n e t 2 , 1 l ∂ w b + ∂ E d ∂ n e t 2 , 2 l ∂ n e t 2 , 2 l ∂ w b \frac{\partial E_d}{\partial w_{b}}=\frac{\partial E_d}{\partial net_{1,1}^l}\frac{\partial net_{1,1}^l}{\partial w_{b}}+\frac{\partial E_d}{\partial net_{1,2}^l}\frac{\partial net_{1,2}^l}{\partial w_{b}}+\frac{\partial E_d}{\partial net_{2,1}^l}\frac{\partial net_{2,1}^l}{\partial w_{b}}+\frac{\partial E_d}{\partial net_{2,2}^l}\frac{\partial net_{2,2}^l}{\partial w_{b}} ∂wb∂Ed=∂net1,1l∂Ed∂wb∂net1,1l+∂net1,2l∂Ed∂wb∂net1,2l+∂net2,1l∂Ed∂wb∂net2,1l+∂net2,2l∂Ed∂wb∂net2,2l = δ 1 , 1 l + δ 1 , 2 l + δ 2 , 1 l + δ 2 , 2 l =\delta_{1,1}^l+\delta_{1,2}^l+\delta_{2,1}^l+\delta_{2,2}^l\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space =δ1,1l+δ1,2l+δ2,1l+δ2,2l = ∑ i ∑ j δ i , j =\sum_i\sum_j\delta_{i,j}\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space =i∑j∑δi,j 也就是偏置项的梯度就是sensitivity map所有误差项之和。
对于步长为S的卷积层,处理方法与传递误差项是一样的,首先将sensitivity map『还原』成步长为1时的sensitivity map,再用上面的方法进行计算。
获得了所有的梯度之后,就是根据梯度下降算法来更新每个权重。这在前面的文章中已经反复写过,这里就不再重复了。
至此,我们已经解决了卷积层的训练问题,接下来我们看一看Pooling层的训练。
无论max pooling还是mean pooling,都没有需要学习的参数。因此,在卷积神经网络的训练中,Pooling层需要做的仅仅是将误差项传递到上一层,而没有梯度的计算。
Max Pooling误差项的传递
如下图,假设第 l − 1 l-1 l−1层大小为4*4,pooling filter大小为2*2,步长为2,这样,max pooling之后,第 l l l层大小为2*2。假设第 l l l层的 δ \delta δ值都已经计算完毕,我们现在的任务是计算第 l − 1 l-1 l−1层的 δ \delta δ值。
我们用 n e t i , j l − 1 net_{i,j}^{l-1} neti,jl−1表示第 l − 1 l-1 l−1层的加权输入;用 n e t i , j l net_{i,j}^{l} neti,jl表示第 l l l层的加权输入。我们先来考察一个具体的例子,然后再总结一般性的规律。对于max pooling: n e t 1 , 1 l = m a x ( n e t 1 , 1 l − 1 , n e t 1 , 2 l − 1 , n e t 2 , 1 l − 1 , n e t 2 , 2 l − 1 ) net_{1,1}^l=max(net_{1,1}^{l-1},net_{1,2}^{l-1},net_{2,1}^{l-1},net_{2,2}^{l-1}) net1,1l=max(net1,1l−1,net1,2l−1,net2,1l−1,net2,2l−1)也就是说,只有区块中最大的 n e t 1 , 1 l − 1 net_{1,1}^{l-1} net1,1l−1才会对 n e t 1 , 1 l net_{1,1}^{l} net1,1l的值产生影响。我们假设最大的值是 n e t 1 , 1 l − 1 net_{1,1}^{l-1} net1,1l−1,则上式相当于: n e t 1 , 1 l = n e t 1 , 1 l − 1 net_{1,1}^l=net_{1,1}^{l-1} net1,1l=net1,1l−1那么,我们不难求得下面几个偏导数: ∂ n e t 1 , 1 l ∂ n e t 1 , 1 l − 1 = 1 \frac{\partial net_{1,1}^l}{\partial net_{1,1}^{l-1}}=1 ∂net1,1l−1∂net1,1l=1 ∂ n e t 1 , 1 l ∂ n e t 1 , 2 l − 1 = 0 \frac{\partial net_{1,1}^l}{\partial net_{1,2}^{l-1}}=0 ∂net1,2l−1∂net1,1l=0 ∂ n e t 1 , 1 l ∂ n e t 2 , 1 l − 1 = 0 \frac{\partial net_{1,1}^l}{\partial net_{2,1}^{l-1}}=0 ∂net2,1l−1∂net1,1l=0 ∂ n e t 1 , 1 l ∂ n e t 2 , 2 l − 1 = 0 \frac{\partial net_{1,1}^l}{\partial net_{2,2}^{l-1}}=0 ∂net2,2l−1∂net1,1l=0因此: δ 1 , 1 l − 1 = ∂ E d ∂ n e t 1 , 1 l − 1 \delta_{1,1}^{l-1}=\frac{\partial E_d}{\partial net_{1,1}^{l-1}} δ1,1l−1=∂net1,1l−1∂Ed = ∂ E d ∂ n e t 1 , 1 l ∂ n e t 1 , 1 l ∂ n e t 1 , 1 l − 1 \space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=\frac{\partial E_d}{\partial net_{1,1}^{l}}\frac{\partial net_{1,1}^{l}}{\partial net_{1,1}^{l-1}} =∂net1,1l∂Ed∂net1,1l−1∂net1,1l = δ 1 , 1 l =\delta_{1,1}^l =δ1,1l而: δ 1 , 2 l − 1 = ∂ E d ∂ n e t 1 , 2 l − 1 \delta_{1,2}^{l-1}=\frac{\partial E_d}{\partial net_{1,2}^{l-1}} δ1,2l−1=∂net1,2l−1∂Ed = ∂ E d ∂ n e t 1 , 1 l ∂ n e t 1 , 1 l ∂ n e t 1 , 2 l − 1 \space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=\frac{\partial E_d}{\partial net_{1,1}^{l}}\frac{\partial net_{1,1}^{l}}{\partial net_{1,2}^{l-1}} =∂net1,1l∂Ed∂net1,2l−1∂net1,1l = 0 =0\space\space\space\space\space =0 δ 2 , 1 l − 1 = ∂ E d ∂ n e t 2 , 1 l − 1 \delta_{2,1}^{l-1}=\frac{\partial E_d}{\partial net_{2,1}^{l-1}} δ2,1l−1=∂net2,1l−1∂Ed = ∂ E d ∂ n e t 1 , 1 l ∂ n e t 1 , 1 l ∂ n e t 2 , 1 l − 1 \space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=\frac{\partial E_d}{\partial net_{1,1}^{l}}\frac{\partial net_{1,1}^{l}}{\partial net_{2,1}^{l-1}} =∂net1,1l∂Ed∂net2,1l−1∂net1,1l = 0 =0\space\space\space =0 δ 2 , 2 l − 1 = ∂ E d ∂ n e t 2 , 2 l − 1 \delta_{2,2}^{l-1}=\frac{\partial E_d}{\partial net_{2,2}^{l-1}} δ2,2l−1=∂net2,2l−1∂Ed = ∂ E d ∂ n e t 1 , 1 l ∂ n e t 1 , 1 l ∂ n e t 2 , 2 l − 1 \space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=\frac{\partial E_d}{\partial net_{1,1}^{l}}\frac{\partial net_{1,1}^{l}}{\partial net_{2,2}^{l-1}} =∂net1,1l∂Ed∂net2,2l−1∂net1,1l = 0 =0\space\space\space =0 现在,我们发现了规律:对于max pooling,下一层的误差项的值会原封不动的传递到上一层对应区块中的最大值所对应的神经元,而其他神经元的误差项的值都是0。如下图所示(假设 a 1 , 1 l − 1 、 a 1 , 4 l − 1 、 a 4 , 1 l − 1 、 a 4 , 4 l − 1 a_{1,1}^{l-1}、a_{1,4}^{l-1}、a_{4,1}^{l-1}、a_{4,4}^{l-1} a1,1l−1、a1,4l−1、a4,1l−1、a4,4l−1为所在区块中的最大输出值):
Mean Pooling误差项的传递
我们还是用前面屡试不爽的套路,先研究一个特殊的情形,再扩展为一般规律。
如上图,我们先来考虑计算 δ 1 , 1 l − 1 \delta_{1,1}^{l-1} δ1,1l−1。我们先来看看 n e t 1 , 1 l − 1 net_{1,1}^{l-1} net1,1l−1如何影响 n e t 1 , 1 l net_{1,1}^{l} net1,1l。 n e t 1 , 1 l = 1 4 ( n e t 1 , 1 l − 1 + n e t 1 , 2 l − 1 + n e t 2 , 1 l − 1 + n e t 2 , 2 l − 1 ) net_{1,1}^l=\frac{1}{4}(net_{1,1}^{l-1}+net_{1,2}^{l-1}+net_{2,1}^{l-1}+net_{2,2}^{l-1}) net1,1l=41(net1,1l−1+net1,2l−1+net2,1l−1+net2,2l−1)根据上式,我们一眼就能看出来: ∂ n e t 1 , 1 l ∂ n e t 1 , 1 l − 1 = 1 4 \frac{\partial net_{1,1}^l}{\partial net_{1,1}^{l-1}}=\frac{1}{4} ∂net1,1l−1∂net1,1l=41 ∂ n e t 1 , 1 l ∂ n e t 1 , 2 l − 1 = 1 4 \frac{\partial net_{1,1}^l}{\partial net_{1,2}^{l-1}}=\frac{1}{4} ∂net1,2l−1∂net1,1l=41 ∂ n e t 1 , 1 l ∂ n e t 2 , 1 l − 1 = 1 4 \frac{\partial net_{1,1}^l}{\partial net_{2,1}^{l-1}}=\frac{1}{4} ∂net2,1l−1∂net1,1l=41 ∂ n e t 1 , 1 l ∂ n e t 2 , 2 l − 1 = 1 4 \frac{\partial net_{1,1}^l}{\partial net_{2,2}^{l-1}}=\frac{1}{4} ∂net2,2l−1∂net1,1l=41所以,根据链式求导法则,我们不难算出: δ 1 , 1 l − 1 = ∂ E d ∂ n e t 1 , 1 l − 1 \delta_{1,1}^{l-1}=\frac{\partial E_d}{\partial net_{1,1}^{l-1}} δ1,1l−1=∂net1,1l−1∂Ed = ∂ E d ∂ n e t 1 , 1 l ∂ n e t 1 , 1 l ∂ n e t 1 , 1 l − 1 \space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=\frac{\partial E_d}{\partial net_{1,1}^{l}}\frac{\partial net_{1,1}^{l}}{\partial net_{1,1}^{l-1}} =∂net1,1l∂Ed∂net1,1l−1∂net1,1l = 1 4 δ 1 , 1 l \space\space=\frac{1}{4}\delta_{1,1}^l =41δ1,1l同样,我们可以算出 δ 1 , 2 l − 1 、 δ 2 , 1 l − 1 、 δ 2 , 2 l − 1 \delta_{1,2}^{l-1}、\delta_{2,1}^{l-1}、\delta_{2,2}^{l-1} δ1,2l−1、δ2,1l−1、δ2,2l−1: δ 1 , 2 l − 1 = ∂ E d ∂ n e t 1 , 2 l − 1 \delta_{1,2}^{l-1}=\frac{\partial E_d}{\partial net_{1,2}^{l-1}} δ1,2l−1=∂net1,2l−1∂Ed = ∂ E d ∂ n e t 1 , 1 l ∂ n e t 1 , 1 l ∂ n e t 1 , 2 l − 1 \space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=\frac{\partial E_d}{\partial net_{1,1}^{l}}\frac{\partial net_{1,1}^{l}}{\partial net_{1,2}^{l-1}} =∂net1,1l∂Ed∂net1,2l−1