卷积神经网络的训练
和全连接神经网络相比,卷积神经网络的训练要复杂一些。但训练的原理是一样的:利用链式求导计算损失函数对每个权重的偏导数(梯度),然后根据梯度下降公式更新权重。训练算法依然是反向传播算法。
我们先回忆一下上一篇文章零基础入门深度学习(3) - 神经网络和反向传播算法介绍的反向传播算法,整个算法分为三个步骤:
- 前向计算每个神经元的输出值 aj ( j 表示网络的第 j 个神经元,以下同);
- 反向计算每个神经元的误差项 δj , δj 在有的文献中也叫做敏感度(sensitivity)。它实际上是网络的损失函数 Ed 对神经元加权输入 netj 的偏导数,即 δj=∂Ed∂netj ;
- 计算每个神经元连接权重 wji 的梯度( wji 表示从神经元 i 连接到神经元 j 的权重),公式为 ∂Ed∂wji=aiδj ,其中, ai 表示神经元 i 的输出。
最后,根据梯度下降法则更新每个权重即可。
对于卷积神经网络,由于涉及到局部连接、下采样的等操作,影响到了第二步误差项 δ 的具体计算方法,而权值共享影响了第三步权重 w 的梯度的计算方法。接下来,我们分别介绍卷积层和Pooling层的训练算法。
卷积层的训练
对于卷积层,我们先来看看上面的第二步,即如何将误差项 δ 传递到上一层;然后再来看看第三步,即如何计算filter每个权值 w 的梯度。
卷积层误差项的传递
最简单情况下误差项的传递
我们先来考虑步长为1、输入的深度为1、filter个数为1的最简单的情况。
假设输入的大小为3*3,filter大小为2*2,按步长为1卷积,我们将得到2*2的feature map。如下图所示:
在上图中,为了描述方便,我们为每个元素都进行了编号。用 δ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 层的激活函数。它们之间的关系如下:
上式中, netl 、 Wl 、 al−1 都是数组, Wl 是由 wm,n 组成的数组, conv 表示卷积操作。
在这里,我们假设第 l 中的每个 δl 值都已经算好,我们要做的是计算第 l−1 层每个神经元的误差项 δl−1 。
根据链式求导法则:
我们先求第一项 ∂Ed∂al−1i,j 。我们先来看几个特例,然后从中总结出一般性的规律。
例1,计算 ∂Ed∂al−11,1 , al−11,1 仅与 netl1,1 的计算有关:
因此:
例2,计算 ∂Ed∂al−11,2 , al−11,2 与 netl1,1 和 netl1,2 的计算都有关:
因此: