第 06讲 反向传播网络
zoujiang@public.wh.hb.cn
邹江反向传播网络 (Back— Propagation Network,简称
BP网络 )是将 W— H学习规则一般化,对非线性可微分函数进行权值训练的多层网络。
BP网络是一种多层前向反馈神经网络,其神经元的变换函数是 S型函数,因此输出量为 0到 1之间的连续量,它可以实现从输入到输出的任意的非线性映射。
由于其权值的调整采用反向传播
( Backpropagation) 的学习算法,因此被称为
BP网络。
BP网络主要用于:
1)函数逼近:用输入矢量和相应的输出矢量训练一个网络逼近 — 个函数;
2)模式识别:用一个特定的输出矢量将它与输入矢量联系起来;
3)分类:把输入矢量以所定义的合适方式进行分类;
4)数据压缩:减少输出矢量维数以便于传输或存储。
6,1 BP网络模型与结构一个具有 r个输入和一个隐含层的神经网络模型结构感知器和自适应线性元件的主要差别在激活函数上:前者是二值型的,后者是线性的。
BP网络具有一层或多层隐含层,除了在多层网络上与前面已介绍过的模型有不同外,其主要差别也表现在激活函数上。
BP网络的激活函数必须是处处可微的,所以它就不能采用二值型的阀值函数 {0,1}或符号函数
{— 1,1},BP网络经常使用的是 S型的对数或正切激活函数和线性函数。
图 6,2 BP网络 S型激活函数因为 S型函数具有非线性放大系数功能,它可以把输入从负无穷大到正无穷大的信号,变换成 -1到 l之间输出,
对较大的输入信号,放大系数较小;而对较小的输入信号,放大系数则较大,所以采用 S型激活函数可以去处理和逼近非线性的输入 /输出关系。
只有当希望对网络的输出进行限制,如限制在 0
和 1之间,那么在输出层应当包含 S型激活函数,在一般情况下,均是在隐含层采用 S型激活函数,而输出层采用线性激活函数。
BP网络的特点:
1,输入和输出是并行的模拟量;
2,网络的输入输出关系是各层连接的权因子决定,没有固定的算法;
3,权因子是通过学习信号调节的,这样学习越多,网络越聪明;
4,隐含层越多,网络输出精度越高,且个别权因子的损坏不会对网络输出产生大的影响
6,2 BP学习规则
BP算法属于 δ算法,是一种监督式的学习算法。
其主要思想为:对于 q个输入学习样本,P1,
P2,……P q,已知与其对应的输出样本为,T1,
T2,……T q。
学习的目的是用网络的实际输出 A1,A2,……A q,
与目标矢量 T1,T2,……T q,之间的误差来修改其权值,使 Al,(l= l,2…,q)与期望的 Tl尽可能地接近;即:使网络输出层的误差平方和达到最小。
BP算法是由两部分组成:信息的正向传递与误差的反向传播。
在正向传播过程中,输入信息从输入经隐含层逐层计算传向输出层,每一层神经元的状态只影响下一层神经元的状态。
如果在输出层没有得到期望的输出,则计算输出层的误差变化值,然后转向反向传播,通过网络将误差信号沿原来的连接通路反传回来修改各层神经元的权值直至达到期望目标。
图 6,3 具有一个隐含层的简化网络图设输入为 P,输入神经元有 r个,隐含层内有 s1个神经元,
激活函数为 F1,输出层内有 s2个神经元,对应的激活函数为 F2,输出为 A,目标矢量为 T。
6,2,1信息的正向传递
1)隐含层中第 i个神经元的输出为:
2)输出层第 k个神经元的输出为:
3)定义误差函数为:
(6.1)
( 6.2)
( 6.3)
6,2,2利用梯度下降法求权值变化及误差的反向传播
(1)输出层的权值变化对从第 i个输入到第 k个输出的权值有:
其中:
同理可得:
( 6.4)
( 6.5)( 6.6)
( 6.7)
(2)隐含层权值变化对从第 j个输入到第 i个输出的权值,有:
其中:
同理可得:
( 6.8)
( 6.9)
( 6.10)
通过 MATLAB的实现过程:
1)对于 (6,1)式所表示的隐含层输出,若采用对数 S型激活函数,则用函数 logsig.m; 若采用双曲正切 S型激活函数,则用函数 tansig.m;
2)对于 (6,2)式所表示的输出层输出,若采用线性激活函数有 purelin.m与之对应;
3)对于 (6,3)式所表示的误差函数,可用函数 sumsqr.m求之;
4)有 learnbp.m函数专门求 (6,4),(6,7),(6,8)和 (6,10)
式所表示的输出层以及隐含层中权值与偏差的变化量;
5)由 (6.5)和 (6.9)式所表示的误差的变化有函数 deltalin.m、
deltatan.m,deltalog.m来解决。它们分别用于线性层、
双曲正切层和对数层。
6,2,3 误差反向传播的流程图与图形解释误差反向传播过程实际上是通过计算输出层的误差 ek,
然后将其与输出层激活函数的一阶导数 f2’相乘来求得
δki。
由于隐含层中没有直接给出目标矢量,所以利用输出层的 δki反向传递来求出隐含层权值的变化量 Δw2ki。 然后计算并同样通过将 ei与该层激活函数的一阶导数 f1’相乘,
而求得 δij,以此求出前层权值的变化量 Δw1ij。 如果前面还有隐含层,沿用上述同样方法依此类推,一直将输出误差 ek一层一层的反推算到第一层为止。
图 6,4 误差反向传播法的图形解释
6.3 BP网络的训练过程为了训练一个 BP网络,需要计算网络加权输入矢量以及网络输出和误差矢量,然后求得误差平方和。
当所训练矢量的误差平方和小于误差目标,训练则停止,否则在输出层计算误差变化,且采用反向传播学习规则来调整权值,并重复此过程。
当网络完成训练后,对网络输入一个不是训练集合中的矢量,网络将以泛化方式给出输出结果。
为了能够较好地掌握 BP网络的训练过程,我们用两层网络为例来叙述 BP网络的训练步骤。
1)用小的随机数对每一层的权值 W和偏差 B初始化,以保证网络不被大的加权输入饱和;并进行以下参数的设定或初始化:
a)期望误差最小值 error_goal;
b)最大循环次数 max_epoch;
c)修正权值的学习速率 1r,一般情况下 k=
0,0l~0,7;
d) 从 1 开 始 的 循 环 训 练,for epoch= 1:
max_epoch;
2)计算网络各层输出矢量 A1和 A2以及网络误差 E:
A1= tansig(W1*P,B1);
A2= purelin(W2*A1,B2);
E= T-A;
3)计算各层反传的误差变化 D2和 D1并计算各层权值的修正值以及新权值:
D2= deltalin(A2,E);
D1= deltatan(A1,D2,W2);
[dlWl,dBl]= learnbp(P,D1,lr);
[dW2,dB2]= 1earnbp(A1,D2,1r);
W1= W1十 dW1; B1= B1十 dBl;
W2= W2十 dW2; B2= B2十 dB2;
4)再次计算权值修正后误差平方和:
SSE= sumsqr(T-purelin(W2*tansig(W1*P,B1),
B2));
5)检查 SSE是否小于 err_goal,若是,训练结束;
否则继续 。
以上所有的学习规则与训练的全过程,仍然可以用函数 trainbp.m来完成。它的使用同样只需要定义有关参数:显示间隔次数,最大循环次数,
目标误差,以及学习速率,而调用后返回训练后权值,循环总数和最终误差:
TP= [disp_freq max_epoch err_goal 1r];
[W,B,epochs,errors]= trainbp(W,B,’F’,P,
T,TP);
[例 6,1]用于函数逼近的 BP网络的设计。
P=-1:0.1:1;
T=[-0.96 0.577 -0.0729 0.377 0.641 0.66
0.461 0.1336 -0.201 -0.434 -0.5 -0.393
-0.1647 0.0988 0.3072 0.396 0.3449
0.1816 -0.0312 -0.2183 -0.3201];
比较 trainbpx和 trainbp的速度差别。
exc4.m
泛化性能:使网络平滑地学习函数,使网络能够合理地响应被训练以外的输入。
要注意的是,泛化性能只对被训练的输入/输出对最大值范围内的数据有效,即网络具有内插值特性,不具有外插值性。超出最大训练值的输入必将产生大的输出误差。
6,4 BP网络的设计
6,4,1网络的层数理论上已经证明:具有偏差和至少一个 S型隐含层加上一个线性输出层的网络,能够逼近任何有理函数。
增加层数主要可以更进一步的降低误差,提高精度,但同时也使网络复杂化,从而增加了网络权值的训练时间。
一般情况下,应优先考虑增加隐含层中的神经元数。
能不能仅用具有非线性激活函数的单层网络来解决问题呢?结论是:没有必要或效果不好。
6,4,2 隐含层的神经元数网络训练精度的提高,可以通过采用一个隐含层,
而增加其神经元数的方法来获得。这在结构实现上,要比增加更多的隐含层要简单得多。
在具体设计时,比较实际的做法是通过对不同神经元数进行训练对比,然后适当地加上一点余量。
6,4,3初始权值的选取一般取初始权值在 (— 1,1)之间的随机数。
威得罗等人在分析了两层网络是如何对一个函数进行训练后,提出一种选定初始权值的策略。
在 MATLAB工具箱中可采用函数 nwlog.m或
nwtan.m来初始化隐含层权值 W1和 B1。
其方法仅需要使用在第一隐含层的初始值的选取上,后面层的初始值仍然采用随机取数。
6,4,4 学习速率学习速率决定每一次循环训练中所产生的权值变化量。
大的学习速率可能导致系统的不稳定。
小的学习速率导致较长的训练时间,可能收敛很慢,不过能保证网络的误差值不跳出误差表面的低谷而最终趋于最小误差值。
所以在一般情况下,倾向于选取较小的学习速率以保证系统的稳定性。学习速率的选取范围在
0,01— 0,8之间。
6,4,5 期望误差的选取在设计网络的训练过程中,期望误差值也应当通过对比训练后确定一个合适的值。
这个所谓的“合适”,是相对于所需要的隐含层的节点数来确定,因为较小的期望误差值是要靠增加隐含层的节点,以及训练时间来获得的。
一般情况下,作为对比,可以同时对两个不同期望误差值的网络进行训练,最后通过综合因素的考虑来确定采用其中一个网络。
6,5 限制与不足
(1)需要较长的训练时间
(2)完全不能训练通常为了避免这种现象的发生,一是选取较小的初始权值,二是采用较小的学习速率,但这又增加了训练时间。
(3)局部极小值
BP算法可以使网络权值收敛到一个解,但它并不能保证所求为误差超平面的全局最小解,很可能是一个局部极小解。
6,6 反向传播法的改进方法主要目标是为了加快训练速度,避免陷入局部极小值。
6,6,1 附加动量法附加动量法使网络在修正其权值时,不仅考虑误差在梯度上的作用,而且考虑在误差曲面上变化趋势的影响,其作用如同一个低通滤波器,
它允许网络忽略网络上的微小变化特性。
利用附加动量的作用则有可能滑过局部极小值。
该方法是在反向传播法的基础上在每一个权值的变化上加上一项正比于前次权值变化量的值,并根据反向传播法来产生新的权值变化。
带有附加动量因子的权值调节公式为:
其中 k为训练次数,mc为动量因子,一般取 0,95左右。
附加动量法的实质是将最后一次权值变化的影响,通过一个动量因子来传递。当动量因子取值为零时,权值的变化仅是根据梯度下降法产生;当动量因子取值为 1时,
新的权值变化则是设置为最后一次权值的变化,而依梯度法产生的变化部分则被忽略掉了。
在 MATLAB工具箱中,带有动量因子的权值修正法是用函数 learnbpm.m来实现的。
trainbpm.m可以训练一层直至三层的带有附加动量因子的反向传播网络。
下面是对单层网络使用函数 trainbpm.m的情形:
[W,B,epochs,errors]= trainbpm(W,B,’F’,P,
T,TP);
6,6,2 误差函数的改进包穆 (Baum)等人于 1988年提出一种误差函数为:
不会产生不能完全训练的麻痹现象。
6,6,3 自适应学习速率通常调节学习速率的准则是:检查权值的修正值是否真正降低了误差函数,如果确实如此,则说明所选取的学习速率值小了,可以对其增加一个量;若不是这样,而产生了过调,那么就应该减小学习速率的值。
下式给出了一种自适应学习速率的调整公式:
MATLAB工具箱中带有自适应学习速率进行反向传播训练的函数为,trainbpa.m。 它可以训练直至三层网络。
使用方法为:
[W,B,epochs,TE]= trainbpa(W,B,’F’,P,T,
TP)
可以将动量法和自适应学习速率结合起来以利用两方面的优点。这个技术已编入了函数 trainbpx.m之中。
这个函数的调用和其他函数一样,只是需要更多的初始参数而已:
TP= [disp_freq max_epoch error_goal lr 1r_inc
1r_dec mom_const err_ratio];
[W,B,epochs,[error; lr]]= trainbpx(W,B,F,P,
T,TP)
4,7 本章小结
1)反向传播法可以用来训练具有可微激活函数的多层前向网络以进行函数逼近,模式分类等工作;
2)反向传播网络的结构不完全受所要解决的问题所限制 。
网络的输入神经元数目及输出层神经元的数目是由问题的要求所决定的,而输入和输出层之间的隐含层数以及每层的神经元数是由设计者来决定的;
3)已证明,两层 S型线性网络,如果 S型层有足够的神经元,则能够训练出任意输入和输出之间的有理函数关系;
4)反向传播法沿着误差表面的梯度下降,使网络误差最小,
网络有可能陷入局部极小值;
5)附加动量法使反向传播减少了网络在误差表面陷入低谷的可能性并有助于减少训练时间;
6)太大的学习速率导致学习的不稳定,太小值又导致极长的训练时间 。 自适应学习速率通过在保证稳定训练的前提下,达到了合理的高速率,可以减少训练时间;
7)80% — 90% 的实际应用都是采用反向传播网络的 。 改进技术可以用来使反向传播法更加容易实现并需要更少的训练时间 。
4,8作业用 BP神经网络对一个简单的非线性神经元进行训练 。
输入矢量 p=[-3 2]
目标矢量 t=[0.4 0.8]