神经网络BP算法

神经网络BP算法

BP神经网络是一种多层的前馈神经网络,其主要的特点是:信号是前向传播的,而误差是反向传播的。BP神经网络的过程主要分为两个阶段,第一阶段是信号的前向传播,从输入层经过隐含层,最后到达输出层;第二阶段是误差的反向传播,从输出层到隐含层,最后到输入层,依次调节隐含层到输出层的权重和偏置,输入层到隐含层的权重和偏置。

  1.  准备

h(x)是要拟合的函数,J(theta)损失函数,theta是参数,要迭代求解的值,theta求解出来了那最终要拟合的函数h(theta)就出来了。其中m是训练集的记录条数,j是参数的个数

https://img-blog.csdn.net/20130525190050025

https://img-blog.csdn.net/20130525190305253

    1. 梯度下降
  1. J(theta)对theta求偏导,得到每个theta对应的的梯度

   https://img-blog.csdn.net/20130525190603437

2)由于是要最小化风险函数,所以按每个参数theta的梯度负方向,来更新每个theta

https://img-blog.csdn.net/20130525190954867

缺点1)很容易陷入局部最优;

2)每迭代一步,都要用到训练集所有的数据,如果m很大,那么可想而知这种方法的迭代速度 ==》随机梯度下降应运而生

1.2 随机梯度下降

https://img-blog.csdn.net/20130525192139662

随机梯度下降是通过每个样本来迭代更新一次,如果样本量很大的情况(例如几十万),那么可能只用其中几万条或者几千条的样本,就已经将theta迭代到最优解了

上面式中的Wij就是相邻两层神经元之间的权值,它们就是深度学习需要学习的参数,也就相当于直线拟合y=k*x+b中的待求参数k和b。

和直线拟合一样,深度学习的训练也有一个目标函数,这个目标函数定义了什么样的参数才算一组“好参数”,不过在机器学习中,一般是采用成本函数(cost function),然后,训练目标就是通过调整每一个权值Wij来使得cost达到最小。cost函数也可以看成是由所有待求权值Wij为自变量的复合函数,而且基本上是非凸的,即含有许多局部最小值。但实际中发现,采用我们常用的梯度下降法就可以有效的求解最小化cost函数的问题。

梯度下降法需要给定一个初始点,并求出该点的梯度向量,然后以负梯度方向为搜索方向,以一定的步长进行搜索,从而确定下一个迭代点,再计算该新的梯度方向,如此重复直到cost收敛。那么如何计算梯度呢?

 BP算法正是用来求解这种多层复合函数的所有变量的偏导数的利器

   

 

 

2.  BP算法

2.1 官方描述

      使用sigmoid函数的感知器来搭建一个多层神经网络,为简单起见,此处我们使用三层网络来分析。假设网络拓补如图2.1所示。

http://images0.cnblogs.com/blog2015/680781/201508/021735264703915.png

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

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

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

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

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

    B)对于输出层的每个单元k,计算它的误差项:http://images0.cnblogs.com/blog2015/680781/201508/021737592049588.png

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

http://images0.cnblogs.com/blog2015/680781/201508/021738362671732.png等号右边写错了,应该是http://images0.cnblogs.com/blog2015/680781/201508/021740435018795.png

D)更新每个权值:

http://images0.cnblogs.com/blog2015/680781/201508/021739305954634.png

符号说明:

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

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

 

 

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

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

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

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

 

 

推导不写了,主要是导数链式法则

 

 

  1. 三层神经网络利用BP 算法进行参数估计举例

假设,你有这样一个网络层:

http://images2015.cnblogs.com/blog/853467/201606/853467-20160630141449671-1058672778.png

 

 

  第一层是输入层,包含两个神经元i1,i2,和截距项b1;第二层是隐含层,包含两个神经元h1,h2和截距项b2,第三层是输出o1,o2,每条线上标的wi是层与层之间连接的权重,激活函数我们默认为sigmoid函数。

 

  现在对他们赋上初值,如下图:

http://images2015.cnblogs.com/blog/853467/201606/853467-20160630142019140-402363317.png

 

 

  其中,输入数据  i1=0.05,i2=0.10;

 

     输出数据 o1=0.01,o2=0.99;

 

     初始权重  w1=0.15,w2=0.20,w3=0.25,w4=0.30;

 

           w5=0.40,w6=0.45,w7=0.50,w8=0.88

 

 

 

  目标:给出输入数据i1,i2(0.05和0.10),使输出尽可能与原始输出o1,o2(0.01和0.99)接近。

 

 

 

  3.1 前向传播

 

  3.1.1 输入层---->隐含层:

 

计算神经元h1的输入加权和:

http://images2015.cnblogs.com/blog/853467/201606/853467-20160630142915359-294460310.png

神经元h1的输出o1:(此处用到激活函数为sigmoid函数):

 

http://images2015.cnblogs.com/blog/853467/201606/853467-20160630150115390-1035378028.png

 

同理,可计算出神经元h2的输出o2:

http://images2015.cnblogs.com/blog/853467/201606/853467-20160630150244265-1128303244.png

 

  3.1.2 隐含层---->输出层:

 

  计算输出层神经元o1和o2的值:

 http://images2015.cnblogs.com/blog/853467/201606/853467-20160630150517109-389457135.png

 

这样前向传播的过程就结束了,我们得到输出值为[0.75136079 , 0.772928465],与实际值[0.01 , 0.99]相差还很远,现在我们对误差进行反向传播,更新权值,重新计算输出。

 

  3.2 反向传播

3.2.1 计算总误差

总误差:(square error)

 

http://images2015.cnblogs.com/blog/853467/201606/853467-20160630151201812-1014280864.png

但是有两个输出,所以分别计算o1和o2的误差,总误差为两者之和:

http://images2015.cnblogs.com/blog/853467/201606/853467-20160630151457593-1250510503.png

http://images2015.cnblogs.com/blog/853467/201606/853467-20160630151508999-1967746600.png

http://images2015.cnblogs.com/blog/853467/201606/853467-20160630151516093-1257166735.png

3.2.2 隐含层---->输出层的权值更新:

以权重参数w5为例,如果我们想知道w5对整体误差产生了多少影响,可以用整体误差对w5求偏导求出:(链式法则

http://images2015.cnblogs.com/blog/853467/201606/853467-20160630151916796-1001638091.png

下面的图可以更直观的看清楚误差是怎样反向传播的:

http://images2015.cnblogs.com/blog/853467/201606/853467-20160630152018906-1524325812.png

现在我们来分别计算每个式子的值:

 

计算http://images2015.cnblogs.com/blog/853467/201606/853467-20160630152206781-7976168.png

http://images2015.cnblogs.com/blog/853467/201606/853467-20160630152258437-1960839452.png

计算http://images2015.cnblogs.com/blog/853467/201606/853467-20160630152417109-711077078.png

http://images2015.cnblogs.com/blog/853467/201606/853467-20160630152511937-1667481051.png

(这一步实际上就是对sigmoid函数求导,比较简单,可以自己推导一下)

 

计算http://images2015.cnblogs.com/blog/853467/201606/853467-20160630152625593-2083321635.png

http://images2015.cnblogs.com/blog/853467/201606/853467-20160630152658109-214239362.png

 

 

最后三者相乘:

http://images2015.cnblogs.com/blog/853467/201606/853467-20160630152811640-888140287.png

这样我们就计算出整体误差E(total)对w5的偏导值。

 

回过头来再看看上面的公式,我们发现:

http://images2015.cnblogs.com/blog/853467/201606/853467-20160630153103187-515052589.png

与2.1的官方描述对比,确实是这样,间接得到了证明

http://images0.cnblogs.com/blog2015/680781/201508/021737592049588.png

 

最后我们来更新w5的值:

http://images2015.cnblogs.com/blog/853467/201606/853467-20160630153614374-1624035276.png

(其中,http://images2015.cnblogs.com/blog/853467/201606/853467-20160630153700093-743859667.png是学习速率,这里我们取0.5)。同理,可更新w6,w7,w8:

http://images2015.cnblogs.com/blog/853467/201606/853467-20160630153807624-1231975059.png

3.2.3 输入层---->隐含层的权值更新:

 

 方法其实与上面说的差不多,但是有个地方需要变一下,在上文计算总误差对w5的偏导时,是从out(o1)---->net(o1)---->w5,但是在隐含层之间的权值更新时,是out(h1)---->net(h1)---->w1,而out(h1)会接受E(o1)和E(o2)两个地方传来的误差,所以这个地方两个都要计算。

 

 http://images2015.cnblogs.com/blog/853467/201606/853467-20160630154317562-311369571.png

 

 

计算http://images2015.cnblogs.com/blog/853467/201606/853467-20160630154712202-1906007645.png

http://images2015.cnblogs.com/blog/853467/201606/853467-20160630154758531-934861299.png

先计算http://images2015.cnblogs.com/blog/853467/201606/853467-20160630154958296-1922097086.png

 

http://images2015.cnblogs.com/blog/853467/201606/853467-20160630155015546-1106216279.png

http://images2015.cnblogs.com/blog/853467/201606/853467-20160630155036406-964647962.png(前向传播已经算过)

http://images2015.cnblogs.com/blog/853467/201606/853467-20160630155117656-1905928379.png

http://images2015.cnblogs.com/blog/853467/201606/853467-20160630155158468-157032005.png

同理,计算出:

http://images2015.cnblogs.com/blog/853467/201606/853467-20160630155310937-2103938446.png

          

两者相加得到总值:

http://images2015.cnblogs.com/blog/853467/201606/853467-20160630155628046-229505495.png

 

再计算http://images2015.cnblogs.com/blog/853467/201606/853467-20160630155555562-1422254830.png

http://images2015.cnblogs.com/blog/853467/201606/853467-20160630155628046-229505495.png

再计算http://images2015.cnblogs.com/blog/853467/201606/853467-20160630155731421-239852713.png

http://images2015.cnblogs.com/blog/853467/201606/853467-20160630155706437-964861747.png

最后,三者相乘:

http://images2015.cnblogs.com/blog/853467/201606/853467-20160630155827718-189457408.png

 

 

 为了简化公式,用sigma(h1)表示隐含层单元h1的误差:

http://images2015.cnblogs.com/blog/853467/201606/853467-20160630160345281-679307550.png

http://images2015.cnblogs.com/blog/853467/201606/853467-20160630153251234-1144531293.png

通过对比,可以发现与2.1的官方描述等价

http://images0.cnblogs.com/blog2015/680781/201508/021738362671732.png等号右边写错了,应该是http://images0.cnblogs.com/blog2015/680781/201508/021740435018795.png

 

最后,更新w1的权值:

http://images2015.cnblogs.com/blog/853467/201606/853467-20160630160523437-1906004593.png

同理,可更新w2,w3,w4的权值:

http://images2015.cnblogs.com/blog/853467/201606/853467-20160630160603484-1471434475.png

这样误差反向传播法就完成了,最后我们再把更新的权值重新计算,不停地迭代,在这个例子中第一次迭代之后,总误差E(total)由0.298371109下降至0.291027924。迭代10000次后,总误差为0.000035085,输出为[0.015912196,0.984065734](原输入为[0.01,0.99]),证明效果还是不错的。

 

 

 

 

  1.  在线演示http://www.emergentmind.com/neural-network

 

发布了59 篇原创文章 · 获赞 11 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/u013385018/article/details/93981527