卷积神经网络的训练
和全链接神经网络相比,卷积神经网络的训练要复杂一些。但训练的原理是同样的:利用链式求导计算损失函数对每一个权重的偏导数(梯度),而后根据梯度降低公式更新权重。训练算法依然是反向传播算法。算法
咱们先回忆一下上一篇文章零基础入门深度学习(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