神经网络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所示。

https://i-blog.csdnimg.cn/blog_migrate/3d7466307dee4b6ca77060a4f7e22535.png

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

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

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

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

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

    B)对于输出层的每个单元k,计算它的误差项:https://i-blog.csdnimg.cn/blog_migrate/73a8bb4232d8e38096ea650aae79f1cb.png

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

https://i-blog.csdnimg.cn/blog_migrate/7aa8c7d5ad2ea1faa79f2ecb988c05c6.png等号右边写错了,应该是https://i-blog.csdnimg.cn/blog_migrate/2d2a3155de1e8c20fe8bd8e786799c78.png

D)更新每个权值:

https://i-blog.csdnimg.cn/blog_migrate/7532d0f5db5732b782c671e5f53e4999.png

符号说明:

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

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

 

 

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

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

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

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

 

 

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

 

 

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

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

https://i-blog.csdnimg.cn/blog_migrate/25570155d9c83e8564b9d6b9b1b287ae.png

 

 

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

 

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

https://i-blog.csdnimg.cn/blog_migrate/e2c7bcd68060120af7e15f31c20f436c.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的输入加权和:

https://i-blog.csdnimg.cn/blog_migrate/bf24712f76788f3469c77e58494cc8b4.png

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

 

https://i-blog.csdnimg.cn/blog_migrate/9e46fe9ecc89d34ac73b8592b60d7224.png

 

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

https://i-blog.csdnimg.cn/blog_migrate/707cbccf23042a9dc09300b79ee0b01e.png

 

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

 

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

 https://i-blog.csdnimg.cn/blog_migrate/5151edd76cbe22889e29241b88049c4a.png

 

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

 

  3.2 反向传播

3.2.1 计算总误差

总误差:(square error)

 

https://i-blog.csdnimg.cn/blog_migrate/40e32ddc1a3396f379b712906d2df6ed.png

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

https://i-blog.csdnimg.cn/blog_migrate/14991ae2fc9d3de95cfb4075f921f0f2.png

https://i-blog.csdnimg.cn/blog_migrate/398c9b9841f44c8c10ccfd09793dd572.png

https://i-blog.csdnimg.cn/blog_migrate/d90ad8acc825efe2185c2cd8135ac853.png

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

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

https://i-blog.csdnimg.cn/blog_migrate/09b608ee151e78565b030e2ee3536c69.png

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

https://i-blog.csdnimg.cn/blog_migrate/04c536976f7817f0eb6c8fd127453775.png

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

 

计算https://i-blog.csdnimg.cn/blog_migrate/6e9f3a4f32cf37ae34238b16b5dd61e7.png

https://i-blog.csdnimg.cn/blog_migrate/df619a4ea39acb5d0f6c01784528d6b2.png

计算https://i-blog.csdnimg.cn/blog_migrate/4a1187658306750ea098638819bfd58e.png

https://i-blog.csdnimg.cn/blog_migrate/64675457a45d10a0afefa8b933537d71.png

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

 

计算https://i-blog.csdnimg.cn/blog_migrate/856ac73c11b1d5eded9e3d88a6be216e.png

https://i-blog.csdnimg.cn/blog_migrate/2f13d59772394b3d1c936406346c3a16.png

 

 

最后三者相乘:

https://i-blog.csdnimg.cn/blog_migrate/006aa03f97ad2eaa7986344194c88c0d.png

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

 

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

https://i-blog.csdnimg.cn/blog_migrate/ca0a27d85a47fa37f3a5d660ee56e536.png

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

https://i-blog.csdnimg.cn/blog_migrate/73a8bb4232d8e38096ea650aae79f1cb.png

 

最后我们来更新w5的值:

https://i-blog.csdnimg.cn/blog_migrate/7f97724777e4dda6f99e4792ea46db0f.png

(其中,https://i-blog.csdnimg.cn/blog_migrate/de03ac303d2653762f314f9efda03952.png是学习速率,这里我们取0.5)。同理,可更新w6,w7,w8:

https://i-blog.csdnimg.cn/blog_migrate/423e9c54dcf7e82b0f3cc1b2ddbd03d2.png

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

 

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

 

 https://i-blog.csdnimg.cn/blog_migrate/633b117ebcdd74076fb830a29e579cda.png

 

 

计算https://i-blog.csdnimg.cn/blog_migrate/ed146ab0b76157494ffe67b3f587d854.png

https://i-blog.csdnimg.cn/blog_migrate/8be5f2902e2d482619ed0add0d577089.png

先计算https://i-blog.csdnimg.cn/blog_migrate/69cc44d7952f92ea862843b31cb31cba.png

 

https://i-blog.csdnimg.cn/blog_migrate/0f4f0f503654b882d1b4182975d177f1.png

https://i-blog.csdnimg.cn/blog_migrate/e1121ea6150ee80c78327dacf6b23c78.png(前向传播已经算过)

https://i-blog.csdnimg.cn/blog_migrate/ad5a133ee27889f65374c48947d0952a.png

https://i-blog.csdnimg.cn/blog_migrate/c4ee73e4c41dfbade20040446f760d73.png

同理,计算出:

https://i-blog.csdnimg.cn/blog_migrate/0aecaa509a147fe6084dfa6d28370a90.png

          

两者相加得到总值:

https://i-blog.csdnimg.cn/blog_migrate/a9f8079fb6ea3b02722ce917e4d3b89c.png

 

再计算https://i-blog.csdnimg.cn/blog_migrate/abf45a78df17fc6124e2c5c5f637c8f2.png

https://i-blog.csdnimg.cn/blog_migrate/a9f8079fb6ea3b02722ce917e4d3b89c.png

再计算https://i-blog.csdnimg.cn/blog_migrate/8fc16cc1781805f1878ff08bf05f3e95.png

https://i-blog.csdnimg.cn/blog_migrate/909fc733587952c58b59062e0c99eafa.png

最后,三者相乘:

https://i-blog.csdnimg.cn/blog_migrate/5a4cee65f9875112991f3fb90f8d611b.png

 

 

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

https://i-blog.csdnimg.cn/blog_migrate/eeaf34122b999daae05aae2613edb86c.png

https://i-blog.csdnimg.cn/blog_migrate/354d86be2ec3fc602546e83669c8d466.png

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

https://i-blog.csdnimg.cn/blog_migrate/7aa8c7d5ad2ea1faa79f2ecb988c05c6.png等号右边写错了,应该是https://i-blog.csdnimg.cn/blog_migrate/2d2a3155de1e8c20fe8bd8e786799c78.png

 

最后,更新w1的权值:

https://i-blog.csdnimg.cn/blog_migrate/d5beae5b4c265e864397720a90b598aa.png

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

https://i-blog.csdnimg.cn/blog_migrate/e6a6bb4826cc9a3e62bb4263790b5131.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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值