BP网络的设计《智能控制》课程第二次实验姓名:学号:班级:2011-4-13一、实验任务设计BP网络,实现函数逼近y=sinx,x∈[0,π]y=x12+x22+x1*x2,x∈[0,1]要求:(1)选取合适的输入、隐层、输出接点,训练网络(2)对训练过的BP网络进行泛化能力的检测(3)说明所使用的BP算法、公式,调整权向量的步数,误差,输出二、实验原理1、人工神经网络人工神经网络(以下简称神经网络)是在人脑结构的启发下构建的计算模型,它既是高度非线性动力学系统,又是自适应组织系统。神经网络的最重要特征是它的学习、组织和容错能力。不像常规的算法,神经网络可以通过被训练去完成特定的任务。为系统提供一系列具有代表性的描述问题的样本,即成组的输入、输出样本,神经网络可以推断出输入和输出数据间的映射关系。训练完成后,神经网络可以被用来识别与训练阶段任意样本相似的新数据。神经网络甚至还可以识别不完整的或有噪声的数据,这个重要特征被广泛地应用于预测、诊断和控制方面。另外,神经网络还有自组织能力。在最抽象的层次上,神经网络可以被当作是一个黑箱,数据从一边输入,经过神经网络处理后产生相应的输出。输出与目标值比较后,产生的误差用于调整神经网络内部的连接权重。图#显示了神经网络的功能图。更仔细地研究该黑箱,发现它与外界的接口由输入层和输出层的神经元组成。神经元是组成神经网络的基本处理单元,通常被组织成层状。除了输入层和输出层外,还可能有中间的神经元层,通常被称为隐层。隐层神经元收集上层所有神经元的信息,经过相应处理后将其输出传递给下层神经元,由此完成了信息在层与层之间地传递,这种传递通常是单向的,在神经元与神经元之间的连接构成了信息传递的通道。在每个神经元中会采用一种传递函数,又称之为激活函数。图!显示了一个简单神经网络的架构:2、神经网络的逼近能力分析神经网络最强大的应用之一是函数逼近,神经网络函数逼近即从样本出发,对未知函数的非线性逼近。神经网络可以被用来计算复杂的输入与输出结果集之间的关系,因此神经网络可以完成非线性函数的逼近。应用神经网络进行函数逼近不仅在纯和应用数学领域有意义,而且在工程和物理学领域也非常有用,因为这种逼近方式已被广泛地应用于系统辨识与建模,信号处理及模式识别等多个方面。3、BP网络及其函数逼近能力BP神经网络是一种单向传播的多层前馈网络,网络除了有输入输出节点外,还有一层或多层的隐含层节点,同层节点中没有任何连接,层间节点中实行全连接。输入信号从输入层节点依次传过各隐含层节点,最后传到输出层节点。每屈节点的输出只影响下层节点的输出。各层节点的传递函数通常为双曲正切S型(sigmoid)函数,但输出层节点的传递函数有时为线性函数。BP神经网络可必看作是一个从输入到输出的高度非线性映射,即F:Rn→Rm,f(X)=Y,对于样本集合:输人xi(∈Rn)和输出yi(∈Rm),可认为存在某一映射g使得g(xi)=yi(i=1,2,…,n)成立。现要求出一个映射f,使得在某种意义下(通常是最小二乘意义下),f是g的最佳逼近。BP神经网络通过对简单的非线性函数进行数次复合,可以近似复杂的函数。Kohnogorov定理(即映射网络存在定理)保证任一连续函数可由一个三层前向网络实现,但它没有提供任何构造这样一个网络的可行方法。通过BP定理可知,只要用一个三层BP神经网络就可在任意希望的精度上实现任意的连续函数。但实际上.还要使用更多层的BP神经网络,其原因是用三层BP神经网络来实现往往需要大量的隐含层节点,而使用更多层的BP神经网络来实现可减少隐含层节点的数目。如何选取隐含层的层数和节点数,至今还没有确切的方法和理论.通常是凭借对学习样本和测斌样本的误差交叉评价的试错法选取。BP神经网络的学习过程由正向和反向传播二部分组成。在止向传播过程中,每一层神经元的状念只影响到下一层神经元网格。如果输出层不能得到期望输出,就是实际输出值和期望输出值之问存在误差,从而转入反向传播过程,将误差信号沿原来的连接通路返回。通过修改各层神经元的权值,逐次地向输入层传播并进行计算,再进行正向传播。这二个过程的反复运用,使得误差信号最小。实际上,误差达到人们所希单的要求时,网络的学习过程就结束。4、BP算法的实现过程基于BP算法的多层前馈网络模型o1…ok…olW1○Wk○Wl○y1○y2○…○yj…○ymV1Vm○○○○○x1x2…xi…xn-1xn(1)模型的数学表达输入向量:X=(x1,x2,…,xi,…,xn)T隐层输出向量:Y=(y1,y2,…,yj,…,ym)T输出层输出向量:O=(o1,o2,…,ok,…,ol)T期望输出向量:d=(d1,d2,…,dk,…,dl)T输入层到隐层之间的权值矩阵:V=(V1,V2,…,Vj,…,Vm)隐层到输出层之间的权值矩阵:W=(W1,W2,…,Wk,…,Wl)(2)对于输出层:,k=1,2,…,l,k=1,2,…,l对于隐层:,j=1,2,…,m,j=1,2,…,m单极性Sigmoid函数:(3)网络误差与权值调整输出误差E定义:将以上误差定义式展开至隐层:进一步展开至输入层:,对输出层和隐层各定义一个误差信号,令得到三层前馈网的BP学习算法权值调整计算公式为:(4)误差曲面与BP算法的局限性存在平坦区域--------误差下降缓慢,影响收敛速度存在多个极小点------易陷入局部最小点标准BP算法的改进改进1:增加动量项α为动量系数,一般有α∈(0,1)作用:动量项反映了以前积累的调整经验,对于t时刻的调整起阻尼作用。当误差曲面出现骤然起伏时,可减小振荡趋势,提高训练速度。改进2:自适应调节学习率设一初始学习率,若经过一批次权值调整后使总误差↑,则本次调整无效,且=β(β1);若经过一批次权值调整后使总误差↓,则本次调整有效,且=θ(θ1)。改进3:引入陡度因子在原转移函数中引入一个陡度因子λ当发现ΔE接近零而d-o仍较大时,可判断已进入平坦区,此时令λ1;当退出平坦区后,再令λ=1。(5)BP算法的程序实现采用基本的BP算法初始化,网络输入层到隐层权值W1、隐层到输出层权值W2赋[-0.1,0.1]的随机数;确定期望的误差限e输入训练样本50对XX[k]、dd[k],确定步长Study_step计算各层输出;计算网络输出误差计算各层误差信号;调整各层权值;检查是否对所有样本完成一次轮训练;选出最大误差e_max是否达到精度要求e_maxe说明:(1)算法有三层循环。每输入第k个样本,计算误差,调整网络权值,直至误差满足要求,以count[k]计数。将第k样本的输出网络权值作为第k+1样本的输入网络权值进行训练。当50组样本都训练完成后,用最终的网络权值对50个样本进行验证,计算每个样本的误差,累计总循环次数计入𝐜𝐨𝐮𝐧𝐭_𝐬𝐮𝐦[𝐧𝐮𝐦]=∑𝐜𝐨𝐮𝐧𝐭[𝐤]𝟒𝟗𝐤=𝟎。若最大误差不满精度要求,则重新开始下一次调整以num计数。(2)最终的调整次数为𝐧𝐮𝐦_𝐬𝐮𝐦=∑𝐜𝐨𝐮𝐧𝐭_𝐬𝐮𝐦[𝐢]𝐧𝐮𝐦𝐢=𝟎程序流程图:count++num++开始初始化W1,W2确定Study_step,e误差限总循环num=0输入第一对样本k=0计算各层输出计算误差e2[k]e2e且count20000计数count=0k++NY计算各层误差信号调整各层权值计算e_maxe_maxe且num20000输出最终的网络权值YN输入测试数据验证泛化能力结束K50?YN三、实验内容及结果1、y=sinx,x∈[0,π]说明:网络为单输入单输出,隐层接点设置为8,选取[0,π]之间等间隔的50组数组作为训练样本,X[j]=j*2*(Pi/100)。验证泛化能力是选取数据为X1[j]=(2*j+1)*(Pi/100)。实验结果如下:结果分析:实验结果证明,在进行了1272071次学习之后,网络的输出误差已降至0.00999692。验证泛化能力时,标准输出与网络输出的差值有的达到0.14,误差较大,网络有待进一步学习与提高。2、y=x12+x22+x1*x2,x∈[0,1]说明:网络为单输入单输出,隐层接点设置为8,选取[0,1]之间等间隔的50组数组作为训练样本,X1[j]=j/50,X2[j]=1-j^2/50^2验证泛化能力是选取数据为XT1[j]=(2*j+1)/100,XT2[j]=1-(j+1)^2/50^2。实验结果如下:结果分析:实验结果证明,在进行了201346次学习之后,网络的输出误差已降至0.00099971。验证泛化能力时,标准输出与网络输出的差值不超过0.05,网络具有较好的泛化能力。四、程序代码说明:本程序采用VisualC++编写1、y=sinx,x∈[0,π]/*用一个三层的神经网络来实现y=sinx,每层神经元分别为1,8,1函数关系为:OUT=F(W*IN),F=1.0/1+exp(-x)*//*----------------------头文件-----------------------------------------------*/#includeiostream.h#includemath.h#includestdlib.h#includetime.h#includeiomanip.h#includewindows.h/*----------------------全局变量-----------------------------------------------*/inti=0,j=0;//循环变量intk;//当前正在运行的是哪个样本constintNeural_Max=50;//样本数目constdoublePi=3.1415926535898;//圆周率/*----------------------三角函数模拟类-------------------------------------------*/classBP_YH//三角函数模拟器类{public:BP_YH();//构造函数;voidBP_YH_Print();//打印权值系数voidBP_YH_test_Print();//打印测试结果doubleF(doublex);//激活函数voidNet_work_In(doublex1);//计算各个神经元的输入voidNet_work_Out(doublex1);//计算各个神经元的输出voidAll_Net_D(doublem);//计算各个神经元的输出微分误差voidChange_W(doublex1);//权值修改函数voidTrain();//训练函数doubleerror(doublex1);//测试误差doubleX[Neural_Max];//输入样本doubleX1[50];//测试数据doubled[Neural_Max];//样本标准输出doubled1[50];//测试标准输出private:doubleW1[8],W2[8];//权值矩阵doubleStudy_step;//学习步长doubleIN1,IN2[8],IN3;//保存各个神经元的输入doubleOUT1,OUT2[8],OUT3;//保存各个神经元的输出doubleD1,D2[8],D3;//各个神经元的微分误差doublee;//允许误差doublee1[Neural_Max];//实际误差doublee2[Neural_Max];//实际误差的绝对值doublee_max;//50组样本输出最大误差doublee_test;//测试误差intnum;//总循环系数intcount1[50];//每个样本循环次数doubletemp;//中间量inttemp1;//中间量intcount_sum[20000];//记录调整次数的数组intnum_sum;//计算总调整次数};/*-----------