误差逆传播算法(BP神经网络)
BP神经网络是一种按误差反向传播(简称误差反传)训练的多层前馈网络,其算法称为BP算法,它的基本思想是梯度下降法,利用梯度搜索技术,以期使网络的实际输出值和期望输出值的误差均方差为最小。
基本BP算法包括信号的前向传播和误差的反向传播两个过程。即计算误差输出时按从输入到输出的方向进行,而调整权值和阈值则从输出到输入的方向进行。
下面让我们从数学原理上来看一下BP算法是怎样工作的。
我们给定训练集,输入示例有d个属性,输出是一个l维的实值向量,转换成如下图所示的前馈神经网络的输入输出的形式,该神经网络拥有d个输入神经元、l个输出神经元以及q个隐藏神经元。
对于输出层第j个神经元的阈值我们用来表示,隐层中第h个神经元的阈值用来表示,输入层第i个神经元与隐层第h个神经元之间的连接权为,隐层第h个神经元与输出层第j个神经元之间的连接权为。对于隐层和输出层的神经元假设我们都使用sigmoid函数。对于训练样本,假定神经网络的输出为
即对于第j个输出来说有(参考前馈神经网络):
则我们可以得到相应的均方误差为:
对于上图中的神经网络我们需要确定输入层到隐层的d*q个权值、隐层到输出层的q*l个权值、q个隐层神经元的阈值、l个输出层神经元的阈值,一共则是(d+l+1)*q+l个参数需要确定。
和之前的参数更新方式一样,我们对于任意参数v的更新方式可以表示为如下的形式:
我们用隐层到输出层的连接权为例来进行推导,BP算法基于梯度下降的策略,以目标的负梯度方向对参数进行调整,对上文中的误差,给定学习率,有:
我们根据上图中的网络关系可以知道先影响到第j个输出层神经元的输入值,再影响到其输出值,然后影响到,则有:
根据图中的定义可以得到:
我们在前面假设神经元内都是sigmoid函数,并且sigmoid函数有一个很重要的导数性质如下:
因此我们可以根据式(1)(2)得到如下的式子(抛去的部分):
我们把式子(5)(6)带入(4)式再带入(3)式可以得到如下的参数更新公式:
类似的我们也可以得到其他参数的更新公式:
以上便是我们BP算法的推导过程,在整个过程中我们先通过输出层得到误差,再从误差入手进行反向传播更新参数就OK了。
注:通常我们把学习率设置为0.1,学习率控制着算法的每一轮迭代时的更新步长,若太大则容易震荡,太小则收敛速度又会过慢,有时我们会在不同的网络层之间设定不同的学习率。
下面给出BP神经算法的简单代码实现(带有隐层的神经网络):