上一节我们详细推倒了BP算法的来龙去脉,请把原理一定要搞懂,不懂的请好好理解BP算法详解,我们下面就直接把上一节推导出的权值调整公式拿过来,然后给出程序流程图,该流程图是严格按照上一节的权值更新过程写出的,因此称为标准的BP算法,标准的BP算法中,每输入一个样本,都要回传误差并调整权值,这种对每个样本轮回训练权值的调整方法称为单样本训练,下面先给出权值调整公式,然后给出流程图:
程序流程图
对于一般多层感知器,设有h个隐层,按照前行顺序,各隐层的节点数分别为记为
各隐层的输出分别为计为
,各层权值矩阵分别记为
,则各层的权值调整公式为:
输出层:
![\left ( 27 \right )](https://private.codecogs.com/gif.latex?%5Cdpi%7B120%7D%20%5Cfn_jvn%20%5Cleft%20%28%2027%20%5Cright%20%29)
![k = 0,1,2,3,...,l](https://private.codecogs.com/gif.latex?%5Cdpi%7B120%7D%20k%20%3D%200%2C1%2C2%2C3%2C...%2Cl)
第h隐层:
![\left ( 28 \right )](https://private.codecogs.com/gif.latex?%5Cdpi%7B120%7D%20%5Cfn_jvn%20%5Cleft%20%28%2028%20%5Cright%20%29)
; ![j = 1,2,3,...,m_{h}](https://private.codecogs.com/gif.latex?%5Cdpi%7B120%7D%20j%20%3D%201%2C2%2C3%2C...%2Cm_%7Bh%7D)
按照上面的规律,第一层的隐藏层的权值调整为:
![\left ( 29 \right )](https://private.codecogs.com/gif.latex?%5Cdpi%7B120%7D%20%5Cfn_jvn%20%5Cleft%20%28%2029%20%5Cright%20%29)
![j = 1,2,3,...,m_1](https://private.codecogs.com/gif.latex?%5Cdpi%7B120%7D%20j%20%3D%201%2C2%2C3%2C...%2Cm_1)
在这里在此提醒,不理解的请好好理解,搞明白公式的符号代表什么意义,刚开始确实挺难的,但是一定要这样训练自己,到后面再去看比这里更复杂的公式你才能看出门道,强化学习和自然语言处理的数学公式比这里的复杂多了,所以请大家一定要培养自己阅读数学公式的素养,数学能说明一切。废话不多说,下面给出标准BP算法的流程图:
说明一下,因为是标准的BP流程图,因此属于单样本训练,假设总共有样本个数为P,其中第i个样本为p,训练次数用q表示,训练完成来源是设置的误差阈值和实际误差对比,达到要求时结束。具体过程就不细讲了,如深入理解了更新过程,一看就会明白。
![](https://img-blog.csdnimg.cn/20181110145409565.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM5ODY1OA==,size_16,color_FFFFFF,t_70)
上面是标准BP的算法流程,权值调整方法是是基于单样本训练的,但是单样本训练遵循的是只顾眼前的这个数据产生的误差进行调节权值调整,这样的后果是当训练数据很多时,计算量就会急剧增加,导致收敛速度过慢。为了改变这些缺点,我们采用另外一种方法就是在所有样本输入以后,计算网络的总误差
:
![](https://img-blog.csdnimg.cn/20181110174940717.png)
然后根据总误差计算各层的误差信号并调整权值,这种累积的误差的批处理方式称为批(batch)训练或者(epoch)训练。由于批训练遵循了以减小全局误差为目标的“集体主义”原则也就是所有的训练样本。在保证总误差向减小方向变化时,即使训练样本很多,训练时的收敛速度也是很快的,具体流程如如下:
![](https://img-blog.csdnimg.cn/20181110180705228.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM5ODY1OA==,size_16,color_FFFFFF,t_70)
BP网络的能力:
(1)非线性的映射能力。
该能力主要表现在复杂的权值上,而权值的变化就是BP的学习过程,因此可以存储大量的输入输出模式映射关系 ,而无需给出给出具体的映射方程,现实中我们经常遇到这一类问题就是,有大量的输入输出的数据,去无法得到一个闭合的数学表达式来表达他们,此时BP神经网络就很有用处了,通过大量数据的训练,最后会拟合出数据输入输出的非线性关系,这一类问题有共同的特点:1.无法得到解析解,2.缺乏专家经验 3.能够表示和转化模式识别或非线性问题,对于这样性质的问题,BP具有很大的优势。
(2) 泛化能力
BP网络训练过程(学习过程)就是权值调整过程 ,他从数据中提取非线性映射关系存储在权值矩阵中,在其后的工作阶段,当向网络输入训练时未曾见过的非样本数据时,网络也能完成由输入空间到输出空间的正确映射,这种能力称为多层感知器的泛化能力。
(3)容错能力
BP网络的魅力还在于,允许输入样本中带有较大误差甚至个别错误。因为输入输出是通过大量的权值进行决定的,反映正确规律的知识来自全样本,个别样本的误差对整体影响不大,因此具有很好的容错能力。
BP算法的局限性
BP网络的误差是各层权值和输入样本对的函数,因此我们可写为如下表达式:
![E = F(X^p,W,V,d^p)](https://private.codecogs.com/gif.latex?%5Cdpi%7B120%7D%20%5Cfn_jvn%20E%20%3D%20F%28X%5Ep%2CW%2CV%2Cd%5Ep%29)
根据下式我么可以看到,误差函数可调整参数的个数
等于各权值数加上阈值数,即![n_w = m\times (n+1)+l\times (m+1)](https://private.codecogs.com/gif.latex?%5Cdpi%7B120%7D%20n_w%20%3D%20m%5Ctimes%20%28n+1%29+l%5Ctimes%20%28m+1%29)
![E= \frac{1}{2}\sum_{k=1}^{l}\left \{ \right.d_k-f[\sum_{j=0}^{m}w_{jk}f(ne)]\left. \right \}^2](https://private.codecogs.com/gif.latex?%5Cdpi%7B120%7D%20E%3D%20%5Cfrac%7B1%7D%7B2%7D%5Csum_%7Bk%3D1%7D%5E%7Bl%7D%5Cleft%20%5C%7B%20%5Cright.d_k-f%5B%5Csum_%7Bj%3D0%7D%5E%7Bm%7Dw_%7Bjk%7Df%28ne%29%5D%5Cleft.%20%5Cright%20%5C%7D%5E2)
所以,误差E是
维空间的一个形状极为复杂的曲面,该曲面的每个点的高度对应一个误差值,每个点的坐标向量对应着
个权值,因此这里的空间称为误差的权空间,如下图所示:
![](https://img-blog.csdnimg.cn/20181110184218318.png)
以二维的权值向量为例,我们看看误差权值的特点:
(1)存在平坦区
从上图我们可以看到,误差曲面有些区域是比较平坦的,在这些区域中,误差的梯度变化很小,即使权值调整很大,误差任然下降很慢,造成这种情况的原因和各节点的净输入有关,
![\frac{\partial E}{\partial x} = -err _k^oy_j](https://private.codecogs.com/gif.latex?%5Cdpi%7B120%7D%20%5Cfrac%7B%5Cpartial%20E%7D%7B%5Cpartial%20x%7D%20%3D%20-err%20_k%5Eoy_j)
根据上式,我们知道梯度小意味着
接近0,而
的表达式为:
![err_k^o= -\frac{\partial E}{\partial o_k}f'(net_k) = (d_k-o_k)o_k(1-o_k)](https://private.codecogs.com/gif.latex?%5Cdpi%7B120%7D%20err_k%5Eo%3D%20-%5Cfrac%7B%5Cpartial%20E%7D%7B%5Cpartial%20o_k%7Df%27%28net_k%29%20%3D%20%28d_k-o_k%29o_k%281-o_k%29)
从上式可以看出,
接近0有三种可能情况:
1. 输出值
和期望值
很接近,也就是说此时,已经达到谷底了。
2. 输出值
始终接近0
3. 输出值
始终接近于1
我们知道后两种情况误差E可以是任意值,但梯度很小就是上图的平坦区了。然而
接近0和1的原因在于Sigmoid转移函数具有饱和性,我们来详细看看Sigmoid函数:
![\large f(x)=\frac{1}{1+e^{-x}}](https://private.codecogs.com/gif.latex?%5Cdpi%7B120%7D%20%5Cfn_phv%20%5Clarge%20f%28x%29%3D%5Cfrac%7B1%7D%7B1+e%5E%7B-x%7D%7D)
![](https://img-blog.csdn.net/20181013212302309?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM5ODY1OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
从上图我们发现,当输入|x|> 3时就趋近1或者0了,也就是饱和区。因此这就是平坦的原因,在平坦区即使
很大,但是由于误差梯度小,训练只能以缓慢的速度进行,只要调整方向正确,训练时间足够长,总会到达谷底的,然而这样的做法效率低,下节我们将介绍如何提高训练速度。
(2)存在多个极小点
![](https://img-blog.csdnimg.cn/20181110191932422.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM5ODY1OA==,size_16,color_FFFFFF,t_70)
在权值空间图我们可以看到,存在平坦区,也存在谷底区,但是谷底并不是一个,而是多个,因此这些谷底就是局部最优点,不是全局最优的,如上图w1a、w1b、w1c都是解,但前两个是局部最优解,第三个才是全局最优解,因此梯度下降所有这样的情况,局部最优点当然不是我们想要的,因此怎么解决呢?下一篇将详细解决两个问题,一是训练缓慢,而是如何跳出局部最优点。
(3)梯度消失问题
梯度消失问题在神经网络层数相对较多的时会遇到,,梯度消失原因是链式求导,导致梯度逐层递减,我们BP第一节推倒公式时就是通过链式求导把各层连接起来的,但是因为激活函数是sigmod函数,取值在1和-1之间,因此每次求导都会比原来小,当层次较多时,就会导致求导结果也就是梯度接近于0。具体如下所示:
![](https://img-blog.csdnimg.cn/20181112121210761.png)
上图对应的神经网络的定义为
,且
,则表达式可为:
![](https://img-blog.csdnimg.cn/20181112121417125.png)
又因为
,因此最大值才为0.25,随着网络的加深,,总体的值越小,因此会发生梯度消失问题,一般解决方法是需要从激活函数或者网络层次着手,如激活函数考虑ReLU函数代替sigmod函数。
与梯度消失相反的现象称为梯度爆炸,即反向传播中,每层都是大于1,导致最后累乘会很大,梯度爆炸容易解决,一般设定阈值就可以解决,但是梯度消失不好解决,在后面的神经网络就是在考虑如何解决梯度消失问题,因此会引出玻尔兹曼机和受限玻尔兹曼机,进而引入深度信念网络,紧接着就是CNN和RNN了,因此后面我们会详细探讨,好,本节到这里结束,下一节我们说说改进的BP网络。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)