一、BP 网络的反向传播算法
i
j
k
BP 网络可以有多层,但为了叙述简洁,以三层为例导出计算公式。设 BP 网络为
三层网络,输入输出层以 i 为编号,隐藏层以 j 为编号,输出层以 h 为编号,示
意图如上。
则隐藏层第 j 个神经元的输入为:
Netj=∑(Wji*Xi)
;
第 j 个神经元的输出为:
Oj=g(netj)
;
输出层第 K 个神经元的输入为:
Netk=∑(Wkj*Oj)
;
相应的输出为:
Ok=g(netk)
;
式中:
g(x)=1/1+exp(-x)
;
BP 网络的学习过程是通过使一个目标函数(实际输出与希望输出之间的误差平
方和)最小化来完成的,设第 k 个神经元的希望输出为 tk,网络的实际输出为 Ok,
如下:
E=1/2*∑(tk-Ok)^2
;
根据梯度下降法有:
; 式(1)
; 式(2)
; 式(3)
这里的“◦”表示每个元素相乘。上面是隐藏层的神经元的灵敏度。输出层
的神经元的灵敏度是不一样的:
;
二、卷积神经网路
卷积神经网络的层结构、层与层之间的连接要比 BP 网路复杂的多,所
以我们分几个问题来讨论:
(1)、如何求输出层的误差敏感值δ
因为通常输出层与上一层是全连接的,所以与 BP 网络的算法是
一样的,这里不再赘述。
(2)、当连接在卷积层的下一层为 pooling 层时,求卷积层的误差敏
感值δ
假设第 l 层为卷积层,第 l+1 层为 pooling 层,且 pooling 层的误
差敏感值为: ,卷积层的误差敏感值为: ,则两者的关系表达式
为:
;
这里符号●表示的是矩阵的点积操作,即对应元素的乘积。卷积层和 unsample()
后的 pooling 层节点是一一对应的,所以下标都是用 j 表示。后面的符号
表示的是第 l 层第 j 个节点处激发函数的导数(对节点输入的导数)。
其中的函数 unsample()为上采样过程,unsample 函数的大概思想是:pooling
层的每个节点是由卷基层中的多个节点(一般为一个矩形区域)共同计算得到的,
所以 pooling 层的每个节点的误差敏感值也会是有卷积层中的多个节点的误差
敏感值共同得到的,只需满足两层各自的误差敏感值相同;下面以图说明:
假设卷积层的矩形大小为 4X4,pooling 卷积核的大小为 2X2,很容易知道,
pooling 后得到的矩形的大小也为 2X2,如果假设此时的pooling 层的一个 map
的误差敏感图为:
则按照 mean-pooing,首先得到的 unsample 为:
因为得满足反向传播时各层的见误差敏感值种鸽不变,所以卷基层对应的每个值
需要均摊,最后得到对应卷积误差敏感值的分布图为:
如果是 max-pooling,则需要记录前向传播过程中的 pooling 区域的最大值的位
置,这里假设 pooling 层值 1、3、2、4 对应的 pooling 区域位置为右下、右上、
左上、坐下。则此时对应的卷积误差敏感值分布为:
最后,上面的 2 中结果还需要点乘卷基层激发函数对应位置的导数值,最终就能
求得卷基层的所有的神经元的误差敏感值δ。
问题三、当接在 pooling 层的下一层为卷基层时,求该 pooling 层的误差敏感
值
假设第 l 层(pooling 层)有 N 个通道,即有 N 张特征图,第 l+1 层(卷积层)
有 M 个特征,l 层中每个通道图都对应有自己的误差敏感值,其计算依据为第 l+1
层所有特征核的贡献之和。下面是第 l+1 层中第 j 个核对第 l 层第 i 个通道的误
差敏感值计算方法:
符号★表示的是矩阵的卷积操作,这是真正意义上的离散卷积,不同于卷积层前
向传播时的相关操作,因为严格意义上来讲,卷积神经网络中的卷积操作本质是
一个相关操作,并不是卷积操作,只不过它可以用卷积的方法去实现才这样叫。
而求第 i 个通道的误差敏感项时需要将 l+1 层的所有核都计算一遍,然后求和。
另外因为这里默认 pooling 层是线性激发函数,所以后面没有乘相应节点的导数。
举个简单的例子,假设拿出第 l 层某个通道图,大小为 3×3,第 l+1 层有 2
个特征核,核大小为 2×2,则在前向传播卷积时第 l+1 层会有 2 个大小为 2×2
的卷积图。如果 2 个特征核分别为:
反向传播求误差敏感项时,假设已经知道第 l+1 层 2 个卷积图的误差敏感值:
离散卷积函数 conv2()的实现相关子操作时需先将核旋转 180 度(即左右翻转
后上下翻转),但这里实现的是严格意义上的卷积,所以在用 conv2()时,对应
的参数核不需要翻转(在有些 toolbox 里面,求这个问题时用了旋转,那是因
为它们已经把所有的卷积核都旋转过,这样在前向传播时的相关操作就不用旋转
了。并不矛盾)。且这时候该函数需要采用'full'模式,所以最终得到的矩阵大小
为 3×3,(其中 3=2+2-1),刚好符第 l 层通道图的大小。采用'full'模式需先将
第 l+1 层 2 个卷积图扩充,周围填 0,padding 后如下:
扩充后的矩阵和对应的核进行卷积的结果如下情况:
因为是离散卷积操作,而离散卷积等价于将核旋转后再进行相关操作。而第 l 层
那个通道的误差敏感项为上面 2 者的和,呼应问题三,最终答案为:
这就是 pooling 层的一个 map 上的所有神经元的误差敏感值图;其他的 map 的
误差敏感值的求法一样。
问题四、求与卷基层相连的那层的权值、偏置值导数
前面 3 个问题分别求得了输出层的误差敏感值、从 pooling 层推断出卷积层
的误差敏感值、从卷积层推断出 pooling 层的误差敏感值。下面需要利用这些
误差敏感值模型中参数的导数。这里没有考虑 pooling 层的非线性激发,因此
pooling 层前面是没有权值的,也就没有所谓的权值的导数了。现在将主要精力
放在卷积层前面权值的求导上(也就是问题四)。
假设现在需要求第 l 层的第 i 个通道,与第 l+1 层的第 j 个通道之间的权值和
偏置的导数,则计算公式如下:
下面以图说明:
例如,如果第 l 层某个通道矩阵 i 大小为 4×4,如下:
第 l+1 层第 j 个特征的误差敏感值矩阵大小为 3X3,如下:
很明显,l+1 层对 l 层的卷积核大小为 2X2 的,且其结果如下:
而 此时 的 偏置 的 导数 bj 的 导数 为 1.2 , 强 j 区 域的 误 差敏 感 值想 家即 可
(0.8+0.1-0.6+0.3+0.5+0.7-0.4-0.2=1.2),因为 b 对 j 中的每个神经元节点都有贡献,
按照多项式的求导规则(和的导数等于导数的和)就很容易得到。
最终,我们求得了每个层的每个神经元的误差敏感值和骑所对应的连接权值的
导数、偏置值的导数。对于权值的更新,我们就可以用公式(1)与公式(2)得
到。