首页 > 代码库 > 误差逆传播(error BackPropagation, BP)算法推导及向量化表示
误差逆传播(error BackPropagation, BP)算法推导及向量化表示
1、前言
看完讲卷积神经网络基础讲得非常好的cs231后总感觉不过瘾,主要原因在于虽然知道了卷积神经网络的计算过程和基本结构,但还是无法透彻理解卷积神经网络的学习过程。于是找来了进阶的教材Notes on Convolutional Neural Networks,结果刚看到第2章教材对BP算法的回顾就犯难了,不同于之前我学习的对每一个权值分别进行更新的公式推导,通过向量化表示它只用了5个式子就完成了对连接权值更新公式的描述,因此我第一眼看过去对每个向量的内部结构根本不清楚。原因还估计是自己当初学习得不够深入,正好离上次自己推导BP算法已经过去挺长时间了,所以重新拿起教材学习复习了一下并逐个对应起来,最终把Notes on Convolutional Neural Networks中的向量化表示搞清楚了。本篇就是对上面的复习和对应过程的详细记录,如果看完并自己推导一遍的话肯定能清楚BP算法的每个更新公式是怎么来的。
2、符号定义
任何不说明符号含义就开始的推导就是耍流氓,所以此部分对用于推导的网络结构和符号进行说明。基本采用了周志华教授的《机器学习》书中的符号定义,不过自己还是做了些符号变更。
网络结构:
图1. 全连接的网络结构,从上到下依次为输出层、隐含层和输入层
符号说明:
:输出层第j个神经元的输出(j=1,2,…,l);
:输出层第j个神经元的偏置;
:输出层第j个神经元的输入;
:隐含层第h个神经元的输出(h=1,2,…,q);
:隐含层第h个神经元的偏置;
:隐含层第h个神经元的输入;
:输入层第i个神经元的输入;
:隐含层第h个神经元和输出层第j个神经元之间的连接权值;
:输入层第i个神经元和隐含层第h个神经元之间的连接权值;
例如图1中的两条橙色直线即分别代表上述两个权值所在的连接
3、问题目标
对于某一个样例它的输入可以描述成:
已知该输入的期望输出为:
而它的实际输出为:
我们的目标即为利用上述信息更新网络中的参数,从而使误差减小。
4、详细推导
首先采用均方误差公式来衡量误差:
(1)
其中我们有:
(2)
上式的意思是输出层神经元的输出可以由它的输入、偏置再加上激活函数f(*)确定。并且它的输入等于隐含层神经元的输出与连接权值的乘积之和,即:
(3)
-------------------------下面是隐含层和输出层之间连接权值更新公式的推导-----------------------------
BP算法使用梯度下降法调整参数,从而使误差向减小的方向移动。因此连接权值的更新公式可以表示为:
(4)
(5)
其中式(4)中的是学习速率。可以看出我们的任务就是求出式(4),然后就可以通过和旧的连接权值相加完成权值的更新。然而式(4)中的偏导数无法直接求出,需要利用链式法则进行转换。为了进行转换我们首先需要知道隐含层和输出层之间的连接权值是如何影响到最终的均方误差E的。显然它首先会影响到输出层神经元的输入,再影响到输出层神经元的输出,最终影响到均方误差E。所以根据上述描述我们可以构造出链式法则:
(6)
式(6)中的三个偏导数从左到右依次为:输出层神经元j的输出对均方误差的影响,输出层神经元j的输入对它自己的输出的影响,我们所要更新的连接权值对输出层神经元j的输入的影响。
之后问题就可以转化为求解这三个偏导数:
[1] 根据式(1)我们很容易得到第一个偏导数的结果:
(7)
[2] 根据式(2)也可以很容易得得到第二个偏导数的结果:
(8)
[3] 根据式(3)也可以得到第三个偏导数的结果:
(9)
因此综合起来我们就可以得到隐含层和输出层之间连接权值的最终更新公式:
(10)
----------------------------下面是隐含层神经元偏置的更新公式的推导-----------------------------------
隐含层神经元偏置的更新公式可以利用等效思想非常"优雅"地解决。我们常把偏置等效成一个连接权值始终为-1,输出为的隐含层神经元,进一步思考我们还可以等效成连接权值为,而输出始终为-1的隐含层神经元不是么?而隐含层神经元与输出层神经元之间连接权值我们已经推导出来了。
因此事实上我们只需要把式(10)的换成-1就得到隐含层神经元偏置的更新公式:
(11)
-------------------------下面是输入层与隐含层之间连接权值更新公式的推导-----------------------------
首先类似隐含层与输出层之间连接权值的更新公式我们有:
(12)
并且我们有:
(13)
(14)
同样的,需要使用链式法则将式(12)转换成以下形式:
(15)
由式(14)可以发现第一个偏导数无法直接求出,还需要进一步分解。不过为了简化公式我们先将后面两个偏导数求出来放在一边。具体地:
[1] 根据式(14)可以得到第二个偏导数的结果:
(16)
[2] 根据式(13)可以得到第三个偏导数的结果:
(17)
现在我们来求第一个偏导数,它可以根据链式法则分解为:
(18)
参考式(3),(7),(8)就可以得到式(18)的最终结果:
(19)
综合式(16),(17),(19)就可以得到式(15)的最终结果:
(20)
---------------------------------------------------------------------------------------------------------
额外地,隐含层神经元的偏置也可以通过类似上面叙述的等效思想解决。只需要将式(20)的最后一项更改为-1就得到了隐含层神经元偏置的更新公式。
---------------------------------------------------------------------------------------------------------
至此BP算法所有参数的更新公式推导完毕。
五、向量化表示
虽然推导容易理解,但公式还是比较长的。因此可以用向量化的表示方法来重新表示公式。
首先以输出层的计算来说明符号。输出层的计算可以用下面的矩阵乘法进行表示:
(21)
通用地对于第a层(由于第一层是输入层,因此a大于1)的计算过程可以用下式表示:
(22)
其中的每一项的意义和式(21)中的每一项一一对应起来。
接着由式(4)和(12)我们可以整理出连接权值更新的通用公式:
(23)
并且:
(24)
其中的需要分情况考虑:
[1] 第a层是输出层:
(25)
[2] 第a层不是输出层:
(26)
其中的 运算符代表对应元素相乘而不是矩阵乘法,并且注意到式(26)还是一个递归式。
至此向量化表示完毕。
误差逆传播(error BackPropagation, BP)算法推导及向量化表示