基于BP算法的异或运算的实现刘政宇摘要:在人工神经网络理论的基础上,利用多层感知器对异或问题进行解决。分析了BP算法的学习过程,采取BP算法编制一个C++语言的程序,实现基于BP算法的异或运算,并描述了使用BP算法实现异或问题的具体学习过程,给出了程序运行后的结果,验证了BP网络通过若干简单非线性处理单元的复合映射,可获得复杂的非线性处理能力。关键词:人工神经网络多层感知器BP算法异或运算作为一门活跃的边缘性交叉学科,神经网络的研究与应用正成为人工智能、认识科学、神经生理学、非线性动力学等相关专业的热点。近十几年来,针对神经网络的学术研究大量涌现,上百种神经网络模型被提出,其应用涉及模式识别、联想记忆、信号处理、自动控制、组合优化、故障诊断及计算机视觉等众多方面,取得了令人瞩目的进展。经过近半个世纪的发展,神经网络理论在模式识别、自动控制、信号处理、辅助决策、人工智能等众多研究领域取得了广泛的成功。关于学习、联想和记忆等具有智能特点过程的机理及其模拟方面的研究正受到越来越多的重视。学习功能是神经网络最主要的特征之一。各种学习算法的研究,在人工神经网络理论与实践发展过程中起着重要作用。当前,人工神经网络研究的许多课题都致力于学习算法的改进、更新和应用。1958年,美国学者FrankRosenblatt首次定义了一个具有单层计算单元的神经网络结构,取名为感知器(Perceptron)。经过论证,单层感知器只能进行线性分类,对非线性样本的划分无法实现,例如异或问题在二维空间中就是一个非线性的样本空间分类的问题,就需要用到多层感知器,即网络应具有隐层,但对隐层神经元的学习规则尚无所知。就感知器学习规则来说,其权值的调整取决于网络期望输出与实际输出之差,而对各隐层节点来说,不存在期望输出,因而该学习规则对隐层权值调整不适用。此时需要用到误差反向传播的BP学习规则。BP(BackPropagation)网络是1986年由Rumelhart和McCelland为首的科学家小组提出,是一种按误差逆传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一。BP网络能学习和存贮大量的输入-输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。它的学习规则是使用最速下降法,通过反向传播来不断调整网络的权值和阈值,使网络的误差平方和最小。BP神经网络模型拓扑结构包括输入层(input)、隐层(hidelayer)和输出层(outputlayer)。BP算法由数据流的前向计算(正向传播)和误差信号的反向传播两个过程构成。正向传播时,传播方向为输入层→隐层→输出层,每层神经元的状态只影响下一层神经元。若在输出层得不到期望的输出,则转向误差信号的反向传播流程。通过这两个过程的交替进行,在权向量空间执行误差函数梯度下降策略,动态迭代搜索一组权向量,使网络误差函数达到最小值,从而完成信息提取和记忆过程。BP算法的学习目的是对网络的连接权值进行调整,使得调整后的网络对任一输入都能达到所期望的输出。学习过程由正向传播与反向传播组成。正向传播用于对前向网络进行计算,即对某一输入信息,经过网络计算后得出它的输出结果;反向传播用于逐层传递误差,修改神经元间的连接权值,以使网络对于输入信息经过计算后得到的输出能达到期望的误差要求。学习的方法是使用一组训练样例对网络的连接权值进行训练,每一个样例中,都包括输入及期望的输出两部分。在正向传播算法中,首先将训练样例的输入信息输入到网络中,输入信息从输入层经过隐层节点逐层计算处理后,传至输出层。在计算处理过程中,每一层神经元的状态只影响下一层神经元的状态,如果在输出层得到的结果不是所期望的输出,那么就转为反向传播。反向传播把误差信号沿路径方向传回,并按一定的原则对各层神经元的权值进行修正,直到第一个隐层,这时再开始进行正向传播,利用刚才的输入信息进行正向网络计算,如果网络的输出达到了误差要求,则学习过程结束,如果达不到要求,则再进行反向传播的连接权值调整。这一过程不断反复,直到网络正向计算的输出结果达到误差要求的结果为止,这时学习过程结束。具体算法过程见右图。一旦网络进行训练后,在用于求解实际问题时就只需要使用正向传播,而不需要使用反向传播了。使用BP算法实现异或问题的具体学习过程按以下步骤顺序进行:(1)网络状态初始化:用较小的随机数对网络的权值(Wji)和(Vkj)以及偏置值(θj)和(γk)赋初值。(2)输入第一个模式。(3)把学习模式的值作为输入层单元i的输出(Ii),用输入层到中间层的权值(Wji)和中间层单元的偏置值(θj),求出对中间单元j的输入Uj以及相应的输出Hj:Uj=ijiW·Ii+θj,Hj=f(Uj)。上式中的f(·)是Sigmoid函数。(4)用中间层的输出(Hj),中间层到输入层的连接权值(Vkj)以及输出层单元的偏置值(γk)求出对输出层单元k的输入Sk以及相应的输出Ok:Sk=jkjV·Hj+γk,Ok=f(Sk)。(5)根据学习模式的教师信号Tk和输出层的输出Ok的差,求出有关输入层单元k的偏置值以及连接到其上权值的误差(δk):δk=(Ok-Tk)·Ok·(1-Ok)。(6)根据误差δk,从中间层到输入层的权值(Wkj)以及中间层的输出(Hj),求出有关中间层j的偏置值以及连接到其上的权值的误差(σj):σj=kkδ·Vkj·Hj·(1-Hj)。(7)根据由第(5)步求出的δk以及Hj和常数α,对从中间层单元j到输出层单元k的权值(Vkj)加以调整。另外,根据δk和常数ß对输出层单元k的偏置值γk加以调整:Vkj=Vkj+αδkHj,γk=γk+ßδk。(8)根据误差σj,输入单元i的输出(Ii)以及常数α对从输入单元i到中间层单元j的连接权值(Wji)加以调整。根据误差(σj)和常数ß对中间层单元j的偏置值(θj)加以调整:Wji=Wji+ασjIi,θj=θj+ßσj。(9)输入下一个模式。(10)若有学习模式,则返回(3)。(11)更新学习次数。(12)若学习次数小于规定的次数,则返回(2)。程序运行过程及结果:程序运行后,在提示下输入“学习率”为0.999,输入“误差控制精度”为0.0001,输入“循环的最大次数”为20000,程序执行后,可以看到在result.txt中结果如下:通过这个程序实例,使用多层感知器解决了单层感知器不能解决的异或问题,也从侧面验证了BP网络通过若干简单非线性处理单元的复合映射,可获得复杂的非线性处理能力。但是从给入不同的学习率、误差控制精度和学习次数得到了不同的结果,从中也暴露了BP算法的一些局限性。第一,该学习算法的收敛速度慢,常常需要成千上万次的迭代,而且随着训练样例的增多,网络性能会变差;第二,网络中隐节点个数的选取上无理论上的指导;第三,从数学角度上看,BP算法是一种梯度最速下降法,这就有可能出现局部最小的问题。当出现局部最小时,从表面上看,符合误差的要求,但这时所得到的解并不一网络学习20000次结束,误差为:0.000117806,各层的权值如下:隐藏层到输出层权值:W[0][0]=10.9247,W[1][0]=10.8454,输入层到隐藏层权值:V[0][0]=6.2442,V[0][1]=-6.7187,V[1][0]=-6.46219,V[1][1]=6.56169,对应着样本实际输出为:000.00845659010.992727100.992708110.00761795定是问题的真正解。所以BP算法是不完备的。参考文献[1]徐丽娜.神经网络控制(第三版).电子工业出版社.2009.7[2]王伟.人工神经网络原理——入门与应用.北京航空航天大学出版社.1995.10[3]杨建刚.人工神经网络实用教程.浙江大学出版社.2001.1[4]朱大奇.人工神经网络研究现状及其展望.江南大学学报,2004,3(1):103~110[5]宋宜斌,王培进.多层前馈神经网络改进算法及其应用.计算机工程.2003.8[6]BulsariA.SomeAnalyticalSolutionstotheGeneralApproximationProblemforFeedbackNeuralNetworks.Neuralnetworks,1993,28(6):991~996[7]AibaraK.ChaoticNeuralNetworks.PhysicalletterA,1991,158(8):373~376[8]InoueM,NagayoshiA.AChaosNeural-computer.PhysicalLetterA,1991,158(8):373~376[9]InoueM,NakamotoK.EpilepsyinaChaosNeural-computerModel,ChaosinBiologyandMedicine,SPIE1993,236:77~84[10]KoskoB.BidirectionalAssociativeMemories.IEEETransactionsOnMan,SystemandCybernetics.1988,26(18):49~59附件一:程序流程图开始输入学习率附件二:源程序清单#includeiostream#includefstream#includectime#includecmathusingnamespacestd;#definen2#defineH2#definem1#defineT4//样本个数doubleW[H][m];//输出层的权矩阵doublesita_h[H];//隐藏层阈值doublesita_o[m];//输出层阈值doubleV[n][H];//输出(隐藏)层的权矩阵doubledelta_o[m];//输出层各连接权的修改量组成的向量doubledelta_h[H];//隐藏层各连接权的修改量组成的向量doublehide_s[H];//隐藏层的输入值doublehide_o[H];//隐藏层的输出值doubleoutput_s[m];//输出层的输入值doubleoutput_o[m];//输出层的输出值doubleinput[T][n];//输入层的输入向量doubleoutput[T][m];//期望的输出值doubleE;//误差doublejingdu;//精度控制参数doublexuexilv;//学习率intM;//循环最大次数//****初始化函数****//voidinitialize(){inti,j;for(i=0;iH;i++){hide_s[i]=0;hide_o[i]=0;delta_h[i]=0;sita_h[i]=rand()/(RAND_MAX+1.0);}for(i=0;im;i++){sita_o[i]=rand()/(RAND_MAX+1.0);output_s[i]=0;output_o[i]=0;delta_o[i]=0;}for(i=0;iH;i++)for(j=0;jm;j++)W[i][j]=rand()/(RAND_MAX+1.0);for(i=0;in;i++)for(j=0;jH;j++)V[i][j]=rand()/(RAND_MAX+1.0);}intmain(){inti,j,t,N;doubleerror;ofstreamfout(result.txt);if(!fout)coutcan'tcreatebp.txt\n;cout计算机科学与技术学院2009级工程硕士,学号:S709060022,刘政宇endl;cout请输入学习率:;cinxuexilv;coutendl请输入误差控制精度:;cinjingdu;coutendl请输入循环的最大次数:;cinM;ifstreamfin(sample.txt);if(!fin)coutcan'topensample.txt\n;for(i=0;iT;i++)fininput