BP神经网络

来源:互联网 发布:全国高校网络培训中心 编辑:程序博客网 时间:2024/06/11 16:56

反向传播算法又称BP算法(Back Propagation)

      使用sigmoid函数(这是一个激励函数,对于不同的情况可以使用不同的激励函数,为了讲解方便,这里就采用这个激励函数来说明问题,其他的激励函数可以参考:http://blog.csdn.net/uestc_c2_403/article/details/73431428)的感知器来搭建一个多层神经网络,为简单起见,此处我们使用三层网络来分析。假设网络拓补如图1.1所示。

图1.1 BP网络拓补结构

  网络的运行流程为:当输入一个样例后,获得该样例的特征向量,再根据权向量得到感知器的输入值,然后使用sigmoid函数计算出每个感知器的输出,再将此输出作为下一层感知器的输入,依次类推,直到输出层。

  那么如何确定每个感知器的权向量呢?这时我们需要使用反向传播算法来逐步进行优化。后面在介绍

  在上一篇介绍感知器的文章中,为了得到权向量,我们通过最小化损失函数来不断调整权向量。此方法也适用于此处求解权向量,首先我们需要定义损失函数(损失函数根据不同的情况需要使用不同的损失函数,为了方便这里使用平方误差的损失函数,这个函数适用于拟合数据,如果是分类,就用交叉熵损失函数),由于网络的输出层有多个输出结点,我们需要将输出层每个输出结点的差值平方求和。于是得到每一个训练样例的损失函数为:(前面加个0.5方便后面求导使用)

  在多层的神经网络中,误差曲面可能有多个局部极小值,这意味着使用梯度下降算法找到的可能是局部极小值,而不是全局最小值,不过虽然不是全局最优,但是也是一个可行解(梯度下降有批梯度下降,随机梯度下降,小批次梯度下降等)。

  现在我们有了损失函数,这时可以根据损失函数来调整输出结点中的输入权向量,这类似感知器中的随机梯度下降算法,然后从后向前逐层调整权重,这就是反向传播算法的思想。

 

具有两层sigmoid单元的前馈网络的反向传播算法:

1)将网络中的所有权值随机初始化。

2)对每一个训练样例,执行如下操作:

  A)根据实例的输入,从前向后依次计算,得到输出层每个单元的输出。然后从输出层开始反向计算每一层的每个单元的误差项。

  B)对于输出层的每个单元k,计算它的误差项:

  C)对于网络中每个隐藏单元h,计算它的误差项:

  D)更新每个权值:

符号说明:

xji:结点i到结点j的输入,wji表示对应的权值。

outputs:表示输出层结点集合。

整个算法与delta法则的随机梯度下降算法类似,算法分析如下:

  1)权值的更新方面,和delta法则类似,主要依靠学习速率,该权值对应的输入,以及单元的误差项。

  2)对输出层单元,它的误差项是(t-o)乘以sigmoid函数的导数ok(1-ok),这与delta法则的误差项有所不同,delta法则的误差项为(t-o)。

  3)对于隐藏层单元,因为缺少直接的目标值来计算隐藏单元的误差,因此需要以间接的方式来计算隐藏层的误差项对受隐藏单元h影响的每一个单元的误差进行加权求和,每个误差权值为wkh, wkh就是隐藏单元h到输出单元k的权值。

 

3、反向传播算法的推导

  算法的推导过程主要是利用梯度下降算法最小化损失函数的过程,现在损失函数为:

  对于网络中的每个权值wji,计算其导数:

  1)若j是网络的输出层单元

  对netj的求导:

  其中:

  

  

  所以有:

  为了使表达式简洁,我们使用:

  权值的改变朝着损失函数的负梯度方向,于是有权值改变量:

 

2)若j是网络中的隐藏单元

  由于隐藏单元中w的值通过下一层来间接影响输入,故使用逐层剥离的方式来进行求导:

  因为:

  所以:

  同样,我们使用:

  所以权值变化量:

 

4、算法的改进

  反向传播算法的应用非常的广泛,为了满足各种不同的需求,产生了很多不同的变体,下面介绍两种变体:

  1)增加冲量项

  此方法主要是修改权值更新法则。他的主要思想在于让第n次迭代时的权值的更新部分依赖于第n-1次的权值。

  其中0<=a<1:称为冲量的系数(0.1~0.8)。加入冲量项在一定程度上起到加大搜索步长的效果,从而能更快的进行收敛。另一方面,由于多层网络易导致损失函数收敛到局部极小值,但通过冲量项在某种程度上可以越过某些狭窄的局部极小值,达到更小的地方。

  2)学习任意的深度的无环网络

  在上述介绍的反向传播算法实际只有三层,即只有一层隐藏层的情况,要是有很多隐藏层应当如何进行处理?

  现假设神经网络共有m+2层,即有m层的隐藏层。这时,只需要变化一个地方即可得到具有m个隐藏层的反向传播算法。第k层的单元r的误差 的值由更深的第k+1层的误差项计算得到:

隐含层的选取

 

   在BP神经网络中,输入层和输出层的节点个数都是确定的,而隐含层节点个数不确定,那么应该设置为多少

   才合适呢?实际上,隐含层节点个数的多少对神经网络的性能是有影响的,有一个经验公式可以确定隐含层

   节点数目,如下

 

                

 

   其中为隐含层节点数目,为输入层节点数目,为输出层节点数目,之间的调节常数。


5、总结

  对于反向传播算法主要从以下几个方面进行总结:

1)局部极小值

  对于多层网络,误差曲面可能含有多个不同的局部极小值,梯度下降可能导致陷入局部极小值。缓解局部极小值的方法主要有增加冲量项,使用随机梯度下降,多次使用不同的初始权值训练网络等。

2)权值过多

  当隐藏节点越多,层数越多时,权值成倍的增长。权值的增长意味着对应的空间的维数越高,过高的维数易导致训练后期的过拟合。

4)算法终止策略

  当迭代次数达到设定的阀值时,或者损失函数小于设定的阀值时,或者两次迭代的损失值几乎相等,或者就是选择迭代次数

3)过拟合

  当网络的训练次数过多时,可能会出现过拟合的情况。解决过拟合主要两种方法:一种是使用权值衰减的方式,即每次迭代过程中以某个较小的因子降低每个权值;另一种方法就是使用验证集的方式来找出使得验证集误差最小的权值,对训练集较小时可以使用交叉验证等。

  另外,神经网络中还有非常多的问题可以讨论,比如隐藏节点数量的多少,步长是否固定等,在此不展开讨论。


标准BP神经网络的缺陷:

 

   (1)容易形成局部极小值而得不到全局最优值。

       BP神经网络中极小值比较多,所以很容易陷入局部极小值,这就要求对初始权值和阀值有要求,要使

       得初始权值和阀值随机性足够好,可以多次随机来实现。

   (2)训练次数多使得学习效率低,收敛速度慢。

   (3)隐含层的选取缺乏理论的指导。

   (4)训练时学习新样本有遗忘旧样本的趋势


如果神经网络权重初始化可以相同吗?

神经网络参数全部初始化为一样的比较省事情(比如全部都是0),但是这样往往会导致模型失效,无法收敛

原因分析:如果参数都一样,那么根据神经网络前向计算公式,每层神经元的输出都是一样的。

更行权重的时候,采用公式

第一次跟新权重,因为初始化权重相同,一样,这样利用梯度下降方法得到的权重都是一样,第二次更新,直到最后的结果都是如此。然后不管进行多少轮正向传播以及反向传播,每俩层之间的参数都是一样的。换句话说,本来我们希望不同的结点学习到不同的参数,但是由于参数相同以及输出值都一样,不同的结点根本无法学到不同的特征!这样就失去了网络学习特征的意义了。

模型失效分析:神经网络是可以学习数据不同的特征,如果初始化参数一样,输出一样,那就相当于整个神经网络就只有一个神经元有效果,也就是只可以学习的数据的一种特征,而我们的初衷是希望神经网学习不同的特征。比如,我们需要拟合一个很复杂的非线性函数,如果这个神经网初始化参数一样,只能学习到一种关系,比如线性,这永远也无法实现我们的目的,所以这个模型就失效了。



参考:

http://www.cnblogs.com/liuwu265/p/4696388.html

http://blog.csdn.net/acdreamers/article/details/44657439

http://mp.weixin.qq.com/s/fXlbB7KmiX0iIv6xwSxNIA