BP算法推导

BP算法推导

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

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

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

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

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

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

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

Ekwhj=Eky^kjy^kjβjβjwhj=(y^kjykj)y^kj1y^kjbh ∂ E k ∂ w h j = ∂ E k ∂ y ^ j k ⋅ ∂ y ^ j k ∂ β j ⋅ ∂ β j ∂ w h j = ( y ^ j k − y j k ) y ^ j k ( 1 − y ^ j k ) b h

将前两个级联的偏导结果记为 gi=Eky^kjy^kjβj g i = − ∂ E k ∂ y ^ j k ⋅ ∂ y ^ j k ∂ β j ,总的变化量可表示为 Δwhj=ηEkwhj=ηgibh Δ w h j = − η ∂ E k ∂ w h j = η g i b h

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

Δvih=Ekvih=Ekbhbhαhαhvih=lj=1Ejkβjβjbhbhαhαhvih Δ v i h = ∂ E k ∂ v i h = ∂ E k ∂ b h ⋅ ∂ b h ∂ α h ⋅ ∂ α h ∂ v i h = ∑ j = 1 l ∂ E k j ∂ β j ⋅ ∂ β j ∂ b h ⋅ ∂ b h ∂ α h ⋅ ∂ α h ∂ v i h
其中 Ejkβj ∂ E k j ∂ β j 在上面已经求出来了,就是 gj g j ,而 βjbh=whj ∂ β j ∂ b h = w h j , αhvih=xi ∂ α h ∂ v i h = x i ,从 αh α h bh b h 是隐层的输入和输出,这一层的激活函数是sigmoid函数,所以仍是对sigmoid函数求偏导,不赘述。
到此为止就可以求出从隐层到输入层的反向传播公式,需要注意的是隐层传递过来的误差是所有输出神经元上的误差,而不是一个神经元上的误差,这一点和从输出层到隐层的反向传播不同。

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

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

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

你可能感兴趣的:(BP算法推导)