卷积神经网络的训练

2019年12月05日 阅读数:91
这篇文章主要向大家介绍卷积神经网络的训练,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

卷积神经网络的训练

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

咱们先回忆一下上一篇文章零基础入门深度学习(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层的训练算法。ide

卷积层的训练

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

卷积层偏差项的传递

最简单状况下偏差项的传递

咱们先来考虑步长为一、输入的深度为一、filter个数为1的最简单的状况。学习

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

在上图中,为了描述方便,咱们为每一个元素都进行了编号。用 δ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 层的激活函数。它们之间的关系以下:spa

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

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

在这里,咱们假设第 l 中的每一个 δl 值都已经算好,咱们要作的是计算第 l1 层每一个神经元的偏差项 δl1 orm

根据链式求导法则:

δ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 都是矩阵

以上就是步长为一、输入的深度为一、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