卷积神经网络的训练

卷积神经网络的训练

全连接神经网络相比,卷积神经网络的训练要复杂一些。但训练的原理是一样的:利用链式求导计算损失函数对每个权重的偏导数(梯度),然后根据梯度下降公式更新权重。训练算法依然是反向传播算法。

我们先回忆一下上一篇文章零基础入门深度学习(3) - 神经网络和反向传播算法介绍的反向传播算法,整个算法分为三个步骤:

  1. 前向计算每个神经元的输出值 aj j 表示网络的第 j 个神经元,以下同);
  2. 反向计算每个神经元的误差项 δj δj 在有的文献中也叫做敏感度(sensitivity)。它实际上是网络的损失函数 Ed 对神经元加权输入 netj 的偏导数,即 δj=Ednetj
  3. 计算每个神经元连接权重 wji 梯度 wji 表示从神经元 i 连接到神经元 j 的权重),公式为 Edwji=aiδj ,其中, ai 表示神经元 i 的输出。

最后,根据梯度下降法则更新每个权重即可。

对于卷积神经网络,由于涉及到局部连接下采样的等操作,影响到了第二步误差项 δ 的具体计算方法,而权值共享影响了第三步权重 w 梯度的计算方法。接下来,我们分别介绍卷积层和Pooling层的训练算法。

卷积层的训练

对于卷积层,我们先来看看上面的第二步,即如何将误差项 δ 传递到上一层;然后再来看看第三步,即如何计算filter每个权值 w 梯度

卷积层误差项的传递

最简单情况下误差项的传递

我们先来考虑步长为1、输入的深度为1、filter个数为1的最简单的情况。

假设输入的大小为3*3,filter大小为2*2,按步长为1卷积,我们将得到2*2的feature map。如下图所示:

在上图中,为了描述方便,我们为每个元素都进行了编号。用 δl1i,j 表示第 l1 层第 j 行第 j 列的误差项;用 wm,n 表示filter第 m 行第 n 列权重,用 wb 表示filter的偏置项;用 al1i,j 表示第 l1 层第 i 行第 j 列神经元的输出;用 netl1i,j 表示第 l1 行神经元的加权输入;用 δli,j 表示第 l 层第 j 行第 j 列的误差项;用 fl1 表示第 l1 层的激活函数。它们之间的关系如下:

netlal1i,j=conv(Wl,al1)+wb=fl1(netl1i,j)(17)(18)

上式中, netl Wl al1 都是数组, Wl 是由 wm,n 组成的数组, conv 表示卷积操作。

在这里,我们假设第 l 中的每个 δl 值都已经算好,我们要做的是计算第 l1 层每个神经元的误差项 δl1

根据链式求导法则:

δl1i,j=Ednetl1i,j=Edal1i,jal1i,jnetl1i,j(19)(20)

我们先求第一项 Edal1i,j 。我们先来看几个特例,然后从中总结出一般性的规律。

例1,计算 Edal11,1 al11,1 仅与 netl1,1 的计算有关:

netj1,1=w1,1al11,1+w1,2al11,2+w2,1al12,1+w2,2al12,2+wb

因此:

Edal11,1=Ednetl1,1netl1,1al11,1=δl1,1w1,1(21)(22)

例2,计算 Edal11,2 al11,2 netl1,1 netl1,2 的计算都有关:

netj1,1=w1,1al11,1+w1,2al11,2+w2,1al12,1+w2,2al12,2+wbnetj1,2=w1,1al11,2+w1,2al11,3+w2,1al12,2+w2,2al12,3+wb

因此:

Edal11,2=Ednetl1,1netl1,1al11,2+Ednetl1,2netl1,2al11,2=δl1,1w1,2+δl1,2w1,1(23)(24)

例3,计算 Edal12,2 al12,2 netl1,1 netl1,2 netl2,1 netl2,2 的计算都有关:

netj1,1=w1,1al11,1+w1,2al11,2+w2,1al12,1+w2,2al12,2+wbnetj1,2=w1,1al11,2+w1,2al11,3+w2,1al12,2+w2,2al12,3+wbnetj2,1=w1,1al12,1+w1,2al12,2+w2,1al13,1+w2,2al13,2+wbnetj2,2=w1,1al12,2+w1,2al12,3+w2,1al13,2+w2,2al13,3+wb

因此:

Edal12,2=Ednetl1,1netl1,1al12,2+Ednetl1,2netl1,2al12,2+Ednetl2,1netl2,1al12,2+Ednetl2,2netl2,2al12,2=δl1,1w2,2+δl1,2w2,1+δl2,1w1,2+δl2,2w1,1(25)(26)

从上面三个例子,我们发挥一下想象力,不难发现,计算 Edal1 ,相当于把第 l 层的sensitive map周围补一圈0,在与180度翻转后的filter进行cross-correlation,就能得到想要结果,如下图所示:

因为卷积相当于将filter旋转180度的cross-correlation,因此上图的计算可以用卷积公式完美的表达:

Edal=δlWl

上式中的 Wl 表示第 l 层的filter的权重数组。也可以把上式的卷积展开,写成求和的形式:

Edali,j=mnwlm,nδli+m,j+n

现在,我们再求第二项 al1i,jnetl1i,j 。因为

al1i,j=f(netl1i,j)

所以这一项极其简单,仅求激活函数 f 的导数就行了。

al1i,jnetl1i,j=f(netl1i,j)

将第一项和第二项组合起来,我们得到最终的公式:

δl1i,j=Ednetl1i,j=Edal1i,jal1i,jnetl1i,j=mnwlm,nδli+m,j+nf(netl1i,j)(7)(27)(28)(29)

也可以将式7写成卷积的形式:

δl1=δlWlf(netl1)(8)

其中,符号 表示element-wise product,即将矩阵中每个对应元素相乘。注意式8中的 δl1 δl netl1 都是矩阵

以上就是步长为1、输入的深度为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, l1 层的 di 通道只与filter的 di 通道的权重进行计算。因此,反向计算误差项时,我们可以使用式8,用filter的第 di 通道权重对第 l 层sensitivity map进行卷积,得到第 l1 di 通道的sensitivity map。如下图所示:

filter数量为N时的误差传递

filter数量为N时,输出层的深度也为N,第 i 个filter卷积产生输出层的第 i 个feature map。由于第 l1 每个加权输入 netl1d,i,j 都同时影响了第 l 层所有feature map的输出值,因此,反向计算误差项时,需要使用全导数公式。也就是,我们先使用第 d 个filter对第 l 层相应的第 d 个sensitivity map进行卷积,得到一组N个 l1 层的偏sensitivity map。依次用每个filter做这种卷积,就得到D组偏sensitivity map。最后在各组之间将N个偏sensitivity map 按元素相加,得到最终的N个 l1 层的sensitivity map:

δl1=d=0DδldWldf(netl1)(9)

以上就是卷积层误差项传递的算法,如果读者还有所困惑,可以参考后面的代码实现来理解。

卷积层filter权重梯度的计算

我们要在得到第 l 层sensitivity map的情况下,计算filter的权重的梯度,由于卷积层是权重共享的,因此梯度的计算稍有不同。

如上图所示, ali,j 是第 l1 层的输出, wi,j 是第 l 层filter的权重, δli,j 是第 l 层的sensitivity map。我们的任务是计算 wi,j 的梯度,即 Edwi,j

为了计算偏导数,我们需要考察权重 wi,j Ed 的影响。权重项 wi,j 通过影响