BP算法推导

时间:2024-03-23 11:16:47

BP算法推导

BP算法(BackPropagation)反向传播算法又叫误差逆传播算法(error BackPropagation),它是迄今最成功的神经网络学习算法。
现在从神经网络训练的角度推导BP算法。
给定训练集D={(x1,y1),(x2,y2),,(xm,ym)},xiRd,yiRl
输入是d维的向量,输出l维向量(可以看成进行l类分类),这个训练集有m个样本,现在画出一个普通的神经网络来训练这些样本,这个普通的神经网络就是单纯由神经元构成的多层神经网络,不是CNN,RNN之类的高级网络。
BP算法推导
在上图中,bh 是隐层第h个神经元的输出,每个神经元对应的都是一个数字,而不是一个向量或其他。
对训练样本(xk,yk)来说,假定该样本对应的神经网络的输出为y^k=(y^1ky^2ky^lk) ,这个输出用函数表示如下:

y^jk=f(βjθj)
其中函数f表示整个神经网络的所有权重拟合出来的一个复杂函数,也就是由神经网络得到的映射关系,根据上图,βj是输出层第j个神经元的输入,θj是输出层第j个神经元的阈值,一般神经元的**函数是sigmoid函数,当输出神经元的输入βj大于神经元的指定阈值时,该神经元才会被**起作用,所以实际上βjθj就是神经网络输出层每个神经元的输入。
该样本(xk,yk)(第K个样本)的均方误差为:
Ek=12j=1l(y^jkyjk)2
这个多层网络的参数个数为输入层到隐层的参数个数d*q,加上隐层到输出层的参数个数q*l,以及隐层和输出层神经元的阈值q,l,所以一共有d*q+q*l+q+l个参数需要确定。

如何进行学习(也就是权重调整)?
先来看感知机如何进行学习
感知机学习规则非常简单,对于训练样本(x,y),若当前感知机的输出为y^,则感知机的权重将这样调整:
wiwi+Δwi
Δwi=η(yy^)xi
其中η是学习速率,如果预测结果和标签一致,那Δwi就是0,权重完全不调整,标签与预测结果相差越大,调整的程度就越大。

神经网络中的参数调整与感知机类似,对从输入层到隐层的权重进行调整(又叫更新估计)如下:
vv+Δv
下面以从隐层到输出层的权重为例来推导神经网络的BP算法。
BP算法基于梯度下降(gradient descent)策略,以目标的负梯度方向对参数进行调整。
隐层到输出层的权重是whj,根据权重的调整公式:

whj=whj+Δwhj
关键点:Δwhj如何计算?
在上面我们知道了实际值与预测值的均方误差Ek,这是计算调整量Δwhj的根源,根据定义,BP算法是基于梯度下降,以目标的副提督对参数进行调整的方法,所以让误差对自变量whj求偏导,而且已知学习速率:
Δwhj=ηEkwhj
由于whj不是已知的,需要找到whj的依存变量直到某个依存变量是已知的,从而级联完成求偏导的过程。
根据神经网络的图我们知道whjβj的因变量,βj又是神经网络输出层的输入变量,输出层的输出是y^jk,这个输出是均方误差Ek的输入,这样就利用一系列的中间变量将Ekwhj联系起来了,所以Ekwhj又可以写为:
Ekwhj=Eky^jky^jkβjβjwhj
接下来就是一项一项的计算这几个级联项的偏导。
看最后一项,βjwhj的关系,根据前面的两者的公式,显然有
βjwhj=bh

bh是隐层输出,这个隐层输出可以用同样的方法有输入层到隐层的权重计算得出,在输入如曾到隐层的计算过程中,与bh地位相当的是xi,这个是原始数据,是完全一致的,所以从头开始看这个神经网络就可以解出来了。

现在看前面的两项,第一项是对一个二次函数求骗到,这个很简单,根据前面的公式求导杰即可,结果是Eky^jk=y^jkyjk
第二项是对**函数求导,这里的**函数是sigmoid函数,对sigmoid函数的求导公式是f(x)=f(x)(1f(x)),所以y^jkβj=y^jk1y^jk
综上,这个级联的求导公式的最终结果是:

Ekwhj=Eky^jky^jkβjβjwhj=(y^jkyjk)y^jk1y^jkbh

将前两个级联的偏导结果记为gi=Eky^jky^jkβj,总的变化量可表示为Δwhj=ηEkwhj=ηgibh

上面所有的Ek实际上都是Ekj,就是说从输出层到隐层的反向传播的误差都是点对点的,输出层的每个神经元都有一个误差,用该神经元上的误差来训练对应的权重。
这是从输出层到隐层的反向传播推导,基本是链式法则的应用,从隐层到输入层又该如何推导呢?
大体上是一样的,但是有一个关键点需要注意。反向传播的源头是误差,从输出层到隐层的反向传播的误差与训练的权重是一一对应的,但是,对隐层到输入层的反向传播来说,隐层的输出是bh,这个结点接收到的误差是从l个输出层神经元传递过来的误差,是一个误差和,所以在计算梯度中的误差是一个误差和:
Ekbh=j=1lEkjβjβjbh
所以从隐层到输入层的反向传播公式为:

Δvih=Ekvih=Ekbhbhαhαhvih=j=1lEkjβjβjbhbhαhαhvih
其中Ekjβj在上面已经求出来了,就是gj,而βjbh=whj,αhvih=xi,从αhbh是隐层的输入和输出,这一层的**函数是sigmoid函数,所以仍是对sigmoid函数求偏导,不赘述。
到此为止就可以求出从隐层到输入层的反向传播公式,需要注意的是隐层传递过来的误差是所有输出神经元上的误差,而不是一个神经元上的误差,这一点和从输出层到隐层的反向传播不同。

学习速率
学习速率控制着算法每一轮迭代中的更新步长,太大容易震荡,太小收敛速度太慢,有时为了精细调节,可以在不同的层使用不同的学习速率,比如在输入层到隐层使用一个学习速率,在隐层到输出层使用另一个学习速率训练。

注意
BP算法的目标是最小化训练集上所有样本的累积误差
E=1mk=1mEk
Ek是第k个样本的误差,训练集中一共有m个样本,要让这m个样本的总误差最小。但上面介绍的‘标准BP算法’是仅针对一个样本更新连接权值和阈值,只要把上面的k去掉就不是针对一个样本的了,就是多个样本的累积错误完成后在更新参数。

神经网络的过拟合与正则化
由于神经网络的参数很多,其表示能力很强大,正是因为这样,神经网络的训练很容易过拟合,如何避免过拟合,一个是早停法,就是你看训练的差不多了,就把程序关掉,停止训练,另一种是正则化,正则化就是前面的博文中讲的正则化,一般是L2正则。其基本思想是在误差目标函数中增加一个用于描述网络复杂度的部分,例如连接权与阈值的平方和。