论基于MATLAB语言的BP神经网络的改进算法苏高利1 邓芳萍2(1浙江省气象科学研究所,浙江杭州 310004;2杭州市气象局,浙江杭州 310008)摘 要:针对标准BP算法存在的缺陷,本文给出了基于MATLAB语言的BP神经网络几种改进的算法.阐述了各种BP算法的优化技术原理、优缺点,并就它们的训练速度和内存消耗情况作了比较.建议在多数BP神经网络训练时,先尝试使用Levenberg-Marquardt算法,其次是BFGS算法或共轭梯度法以及RPROP算法.关键词:MATLAB语言;BP神经网络;BP优化算法中图分类号:TP183 文献标识码:A 文章编号:1001-7119(2002)02-0130-06OntheImprovingBackpropagationAlgorithmsoftheNeuralNetworksBasedonMATLABLanguage:AReviewSUGao-li1 DENGFang-ping2(1.ZhejiangInstituteofMeterology,Hangzhou310004,China;2.HangzhouMeterologicalAdministration,Hangzhou310008,China)Abstract:Toeliminatetheshortcomingofstandardbackpropagationalgorithm,somemodifiedBPalgorithmsintheMATLAB'sneuralnetworkstoolboxaregiveninthepaper.Thesehighperformancealgorithmsarediscussedintheoptimizationtechniquesandcomparedwithspeedandmemory.Formostsituations,theLevenberg-Marquardtalgorithmisadvisedtousefirst,thentheBFGSalgorithm,oroneoftheconjugategradientmethods,orRPROPalgorithmisconsidered.Keywords:MATLABlanguage;BPneuralnetwork;Bpoptimizationalgorithms1 引 言人工神经网络(ArtificialNeuralNetwork,ANN),自从20世纪50年代Rosenblatt首次将单层感知器应用于模式分类学习以来,已经有了几十年的研究历史.但是,由于Minsky和Papert指出单层系统的局限性,并表达了对多层系统的悲观看法,在20世纪70年代对ANN的研究兴趣减弱.直至80年代中期Rumelhart等重新阐述了反传训练方法1,使得在ANN领域的理论和应用研究开始在世界范围内重新兴起.ANN是一种按照人脑的组织和活动原理而构造的一种数据驱动型非线性映射模型,它具有并行处理、自适应自组织、联想记忆、容错鲁棒以及逼近任意非线性等特性,在预测评估、模式识别、信号处理、组合优化及知识工程等领域具有广泛的应用[2~5].近年来,已有多种ANN模型被提出并得以深入研究.其中,80%~90%的人工神经网络模型是采用前馈反向传播网络(Back-PropagationNet-work简称BP网络)或它的改进形式[6~10],它是前向网络的核心部分,体现了网络最精华的部分.标准的BP网络是根据Widrow-Hoff规则,采用梯度下降算法,在非线性多层网络中,反向传播计算梯度.但BP网络存在自身的限制与不足,如需要较长的训练时间、会收敛于局部极小值等,使得BP算法在实际应用中不是处处能胜任[5]. Vol.19 No.2 Mar.2003 科 技 通 报BULLETINOFSCIENCEANDTECHNOLOGY第19卷第2期2003年3月收稿日期:2000-12-25作者简介:苏高利,男,1973年生,广东湛江人,工程师,硕士.因此近十几年来,许多研究人员对其做了深入的研究,提出了许多改进的算法[2,5,11],如使用动量项的加快离线训练速度的方法[1]、归一化权值更新技术方法[11]、快速传播算法[12]、δ-δ方法[13]、扩展卡尔曼滤波法[14]、二阶优化[15]以及最优滤波法[16]等.本文讨论BP网络的改进算法有两类,一类是采用启发式技术,如附加动量法、自适应学习速率法、RPROP方法;另一类是采用数字优化技术,如共轭梯度法、拟牛顿法、Levenberg-Marquardt方法.这些算法集成在MATLAB语言神经网络工具箱中[2].MATLAB是MathWorks公司研制的一套高性能的数值计算和可视化软件,得到了各个领域专家学者的广泛关注,因为利用MATLAB及其工具箱所得结果是相当令人满意的,并且其强大的扩展功能为各个领域的应用提供了手段[3].其中神经网络工具箱是用MATLAB语言开发出来的许多工具箱之一,网络的设计者可以根据自己的需要去调用工具箱中有关神经网络的设计与训练函数,使自己能够从繁琐的编程解脱出来,集中精力去思考问题和解决问题,从而提高效率和解题质量.本文通过基于MAT-LAB语言的BP神经网络的不同改进算法的评论,有助于了解BP网络改进的算法及其优缺点,从而达到正确、合理、充分应用不同的BP算法训练前馈反向传播网络.在MATLAB神经网络工具箱中改进的BP算法及其相应的训练函数有:附加动量法(traingdm.m)、自适应学习速率法(traingda.m,traingdx.m)、RPROP方法(trainrp.m)、共轭梯度法(traincgf.m,traincgp.m,traincgb.m,trainscg.m)、拟牛顿法(trainbfg.m,trainoss)以及Levenberg-Marquardt方法(trainlm.m).1 附加动量法附加动量法使BP神经网络在修正其权重和阈值时,不仅考虑误差在梯度上的作用,而且考虑在误差曲面上变化趋势的影响,它允许忽略网络上的微小变化特性.该方法是在反向传播法的基础上,在每一个权重和阈值的变化上加上一项正比于前次权重和阈值变化量的值,并根据反向传播法来产生新的权重和阈值的变化,带有附加动量因子的权重和阈值(X)调节公式为[4]:ΔX(k+1)=mc×ΔX(k)+lr×mc×EX 0lr≤1(1)其中k为训练次数,mc为动量因子,一般取0.95左右,lr为学习速率,是常数,E为误差函数.这种方法所加入的动量项实质上相当于阻尼项,它减小了学习过程的振荡趋势,从而改善了收敛性,找到更优的解.但是这种方法的缺点也是明显的,参数的选取只能通过实验来确定,而且它的学习速度还不能满足实时的工作需要.在MATLAB工具箱中附加动量法是通过训练函数traingdm.m来实现的,其参数有:训练次数epochs、误差函数指标goal、学习速率lr、动量因子mc、训练步长show、最小梯度min_grad以及训练时间time.一旦训练达到了最大的训练次数,或者低于最小梯度,或者网络函数指标降低到期望误差之下,都会使网络停止学习.2 自适应学习速率法自适应调整学习速率有利于缩短学习时间.标准BP算法收敛速度慢的重要原因是学习速率选择不当.学习速率选得太小,收敛太慢;学习速率选取得太大,则有可能修正过头,导致发散.因此出现了自适应调整的改进算法,其权重和阈值(X)更新公式为[2]:ΔX=lr×EX(2)ΔX(k+1)=mc×ΔX(k)+lr×mc×EX(3)其中,lr为学习速率,是变量,而公式(1)中lr是常数.通常调节学习速率lr的准则是:检查权重的修正值是否真正降低了误差函数,如果确实如此,则说明所选取的学习速率值小了,可以对其增加一个量;若不是这样,而产生了过调,那么就应减小学习速率的值.在MATLAB工具箱中,给出了一种自适应学习速率lr的调整公式:lr(k+1)=1.05lr(K)0.7lr(K)lr(k)(4)mse(k+1)mse(k)mse(k+1)1.04mse(k)其它 第2期苏高利等.论基于MATLAB语言的BP神经网络的改进算法131 其中,mse为均方差,初始学习速率η(0)的选取范围可以有很大的随意性.在MATLAB工具箱中自适应学习速率法通过训练函数traingda.m(对应公式2)和traingdx.m(对应公式3)来实现的.其训练参数有:训练次数epochs、误差函数指标goal、初始学习速率lr、学习速率增加系数lr_inc(1.05)、学习速率减少系数lr_dec(0.7)、误差比率max_perf_inc、动量因子mc、最小梯度min_grad、训练步长show以及训练时间time.一旦训练达到了最大的训练次数,或者网络函数指标小于期望误差,或超出规定计算的时间,都会使网络停止学习.3 弹性BP(Resilient Backpropagation,RPROP)方法 一般来说,BP网络的隐含层激活函数采用S形的(Sigmoid)函数.Sigmoid函数用于将神经元的输入范围(-∞,+∞)映射到(0,1),当输入变量很大时,Sigmoid函数的斜率将接近于0.这可能导致在利用Sigmoid函数训练BP网络中梯度下降的问题,由于即使梯度有很小的变化,也会引起权重和阈值的微小变化,使权重和阈值远离最乐观的值.有鉴于此,1993年德国MartinRiedmiller和HeinrichBraun在他们的论文中提出有弹性的BP(ResilientBackpropagation)方法[17].这种方法的原理是打算消除偏导数的大小有害的影响权步,因此,唯有导数的符号被认为表示权更新的方向,而导数的大小对权更新没有影响[5].权改变的大小仅仅由权专门的“更新值”Δ(t)ij来确定:ΔX(t)ij=-Δ(t)ij 如果E(t)Xij0+Δ(t)ij 如果E(t)Xij00 其他(5)其中E(t)Xij表示在模式集的所有模式(批学习)上求和的梯度信息.(t)表示t时刻.对每个权重和阈值的更新值得到修改,权更新本身遵循一个很简单的规则:如果导数是正(增加误差),这个权重和阈值由它的更新值降低,如果导数是负,更新值提高:X(t+1)ti=X(t)ti+ΔX(t)ij(6)RPROP的基本原理是权重和阈值更新值的直接修改,它和以学习速率为基础的算法相反(正如梯度下降一样).RPROP引入Resilient(有弹性的)更新值的概念直接地修改权步的大小.因此,修改结果不会被不可预见的梯度性能变模糊.由于学习规律的清楚和简单,和最初的反传算法比较,在计算上仅有少量的耗费.除了快速外,RPROP的主要优点之一在于对许多问题一点也不需要参数的选择以得到最优或者至少接近最优收敛时间.在MATLAB工具箱中RPROP算法通过训练函数trainrp.m来实现的,它的训练参数有:训练次数epochs、训练步长show、误差函数指标godl、训练时间time、最小梯度min-grad、“更新值”增量delt-inc、“更新值”减量delt-dec、初始“更新值”delta0以及最大“更新值”deltamax.4 共轭梯度法当使用共轭梯度向量来确定共轭方向时,称此算法为共轭梯度法.1990年J.Leonard和M.A.Kramer将共轭梯度法和行搜索策略结合在一起.在共轭梯度法中,沿着共轭方向进行行搜索,收敛速度将比一般的梯度下降法要快得多.在一般的训练算法中,是利用学习速率决定权重和阈值更新的步长,而在多数共轭梯度算法中权值步长各自反复地调整,沿着共轭梯度用行搜索来决定权值步长以减少在行中的完成功能.共轭梯度法可以不必计算或存储二阶导数信息就具有二阶方法的功能,它与拟牛顿法相比,它的计算代价很低,因此在较大规模问题中十分有用.在MATLAB工具箱中,有4种不同的共轭梯度算法:Fletcher-Reeves、Polak-Ribiere、Pwell-Bea