1、基于 BP神经网络的 MIMO函数逼近Subject:Function approximation: design a neural network to fit the following MIMO functions:1) y1=2+x11.5-1.5sin(3x2); y2=x2sin(x1)+x1cos(x2); 1 x1, x25Generate 200 data, 100 points for training and the other 100 for model testing.1 绪论1.1 人工智能技术概述人工智能也称机器智能,它是计算机科学、控制论、信息论、神经生理学、心
2、理学、语言学等多种学科互相渗透而发展起来的一门综合性学科。从计算机应用系统的角度出发,人工智能是研究如何制造出人造的智能机器或智能系统,来模拟人类智能活动的能力,以延伸人们智能的科学。传统人工智能的研究开始于 1956 年,致力于以语言或符号规则的形式来表达和模拟人类的智能行为,主要目标是应用符号逻辑的方法模拟人的问题求解、推理和学校等方面的能力。由于知识获取和表示是复杂而艰巨的任务,符号运算限制了传统人工智能理论的应用领域,更多的研究开始转向模仿产生自然智能的生物机制,从而也弥补了符号机制的缺点。20 世纪 80 年代在传统人工智能理论发展出现停顿而人工神经网络理论出现新的突破时,基于结构演
3、化的人工智能理论计算智能理论迅速成为人工智能研究的主流。计算智能以连接主义的思想为主,并与模糊数学和迭代函数系统等数学方法相交叉,形成了众多的发展方向。它的主要方法有模糊逻辑、神经网络、遗传算法、遗传程序、演化程序、人工免疫系统、人工生命、生态计算、DNA 软计算、局部搜索等。计算智能的这些方法具有自学习、自组织、自适应的特征,以及简单、通用、鲁棒性强、适于并行处理的优点,在并行搜索、联想记忆、模式识别、知识自动获取等方面得到了广泛的应用。1.2 常用的神经网络模型神经网络是由大量人工神经元广泛互联而成的网络。它是在现代神经生物学和认识科学对人类信息处理研究的基础上提出来的,具有很强的自适应性
4、、自学习能力、非线性映射能力、鲁棒性和容错能力等。随着神经网络应用研究的不断深入,新的神经网络模型也不断地推出,现有的神经网络模型已达近百种。在智能控制领域中,基于神经网络的控制系统被越来越多地应用于控制领域的各个方面。不同的神经网络有不同的特点和适用范围。实践中常用的基本神经网络模型有:感知器神经网络、线性神经网络、自组织神经网络、反馈网络、BP 神经网络、径向基神经网络等。感知器模型简单易于实现,缺点是仅能解决线性可分问题。线性神经网络只能反应输入和输出样本向量空间的线性映射关系,目前线性神经网络在函数拟合、信号滤波、预测、控制等方面有广泛的应用。但本题中的函数是一个非线性函数,所以这两种
5、网络结构不能使用。自组织神经网络的映射过程是通过竞争学习完成的。所谓竞争学习是指同一层神经元之间相互竞争,竞争胜利的神经元修改与其连接的连接权值的过程。竞争学习是一种无监督学习方法,网络根据输入样本的特性进行自组织映射,从而对样本进行自动排序和分类。反馈网络中,信息在前向传递的同时还要进行反向传递,这种信息的反馈可以发生在不同网络层的神经元之间,也可以只局限于某一层神经元上。由于反馈网络属于动态网络,只有满足了稳定条件,网络才能在工作了一段时间之后达到稳定状态。BP 神经网络通常指的是基于误差反向传播算法的多层前向神经网络,其学习过程分为两个阶段:第一阶段(正向计算过程)由样本选取信息从输入层
6、经隐含层逐层计算各单元的输出值;第二阶段(误差反向传播过程)由输出层计算误差并逐层向前算出隐含层各单元的误差,并以此修正前一层权值。它一般具有一个或者多个隐层,隐层神经元一般采用 sigmoid 型的传递函数,而输出层一般采用 pureline 型的传递函数。理论已经证明,当隐层神经元数目足够多时,可以以任意精度逼近任何一个具有有限个断点的非线性函数。这一特点使得 BP 神经网络在函数逼近、模式识别、数据压缩等领域有着更为广泛的应用,事实上,目前实际应用的 90的神经网络系统都是基于 BP 算法的。径向基函数网络与 BP 网络相比学习速度比较快,网络的函数逼近能力、模式识别能力以及分类能力都大
7、大优于 BP 网络,但是径向基网络的缺点是当输入样本很多的时候,网络十分庞大,计算复杂,因此不适合用于训练样本过多的情况。2 BP神经网络设计2.1 基于 BP神经网络的函数逼近设计思路本题要求设计一个能很好逼近给定的多输入多输出函数的神经网络,要求输入值在区间(1,5)内。作为一种传统的表达方式,神经网络可用来建立系统的输入输出模型。它们或者作为被控对象的正向或逆动力模型,或者建立控制器的逼近模型,或者用以描述性能评价估计器。对于一个系统的输入输出模型,神经网络具有很好的逼近能力。本题采用 BP 神经网络编写程序以实现题中给出函数的逼近。程序的设计步骤为:(1) 随机生成 100 组数据作为
8、神经网络训练数据,并得到相应的目标向量;(2) 建立 BP 神经网络并初始化;(3) 训练神经网络;(4) 分析产生的神经网络,评价不同网络的综合性能,并采用最优方案;(5) 随机生成测试数据,用训练好的网络求出测试结果;(6) 分析仿真结果2.2 神经网络的建立及训练根据题目要求,生成 100 组位于区间(1,5)的数据用于神经网络的训练,参考输出则由题目给定的函数确定,采用数组的形式表示。训练数据:Ptrain=rand(2,100)*4.0+1.0; x1=Ptrain(1,:); x2=Ptrain(2,:); 目标函数:Ytarget=2+x1.1.5-1.5*sin(3*x2);
9、x2.*sin(x1)+x1.*cos(x2);在MATLAB中作图如图2.1所示:图 2.1 对应随机训练数据的目标函数值首先,调用 MATLAB 的 newff 函数建立一个隐含层神经元数(可改变)为150,输出层神经元数为 2 的神经网络。神经网络各个参数的设定将会影响网络的性能。神经网络的层数及各网络层神经元的个数将影响网络的逼近精度,同时也在很大程度上影响网络的训练时间。隐含层神经元个数过少则输出精度达不到要求,而隐含层神经元个数过多将会增加计算的复杂度,影响训练速度。本文设定网络层数固定为一层隐含层和一层输出层,隐含层神经元数将通过多次试验比较确定,输出层为双输出。隐含层神经元的传
10、递函数为 tansig 函数,输出层神经元的传递函数为 purelin 函数,网络的训练函数为trainlm ;网络的权值学习函数默认为learngdm ;性能数默认为mse。建立神经网络及初始化的程序为:net=newff(minmax(Ptrain),150,2,tansig purelin,trainlm); %神经网络建立net.trainParam.epochs=20; %最大迭代次数net.trainParam.lr = 0.01; %学习速率net.trainParam.goal = 0.001; %期望误差net,tr = train(net,Ptrain,Ytarget);
11、%神经网络训练学习速率决定每一次循环训练中所产生的权值变化量。大的学习速率可能导致系统不稳定;但小的学习速率将导致较长训练时间,可能收敛很慢,但能保证网络的误差值不跳出误差表面的低谷而最终趋于最小误差值。学习速率应当是通过对比试验后选取,由于本文对训练时间要求不高,所以选择较低学习速率 0.01。在其它对训练时间要求较高的系统中最好是采取自适应变化的学习速率,在训练的不同阶段采用不同的学习速率,可以平衡精度和速度的要求。期望误差要根据实际要求来选择,如果精度要求高,对时间要求不高的就可以选择较高的期望误差。对时间要求较高的就要牺牲误差精度,特别是在一些复杂的系统中就要注意两者的权衡。本网络中对
12、精度要求较高,时间要求不高,所以依据前面寻找隐含层神经元数目所作的比较选取 0.001 作为期望误差。MATLAB 使用函数 newff 建立 BP 网络,其中隐含层的神经元数目可以改变,我们在这里分别取其数目为 150、200、250,来比较隐含层不同神经元数目对神经网络综合性能的影响。当网络隐含层的个数为 150,训练最大迭代次数为 20,学习率为 0.01,误差精度为 0.001 时得到仿真结果如下:图 2.2 网络隐含层神经元数为 150 的仿真结果当网络隐含层的个数为200,训练最大迭代次数为20,学习率为0.01,误差精度为0.001时得到迭代次数为仿真结果如下:图 2.3 网络隐
13、含层神经元数为 200 的仿真结果当网络隐含层的个数为250,训练最大迭代次数为20,学习率为0.01,误差精度为0.001时得到迭代次数为仿真结果如下:图 2.4 网络隐含层神经元数为 250 的仿真结果通过对以上三种网络结构的训练结果进行分析可知,采用隐含层神经元数为 200 时,达到同样的精度时,所需的迭代次数最少,所花费的计算时间也最短。因此,此时的神经网络综合性能最优。故本文将采用隐含层神经元数为200 的网络结构对测试数据进行计算,得到相应输出。3 BP 神经网络分析根据题目要求,在 MATLAB 中用 rand 函数随机生成位于区间( 1,5)的100 组测试数据,目标向量由被逼
14、近函数求得。测试数据:Ptest=rand(2,100)*4.0+1.0;Ptest1=Ptest(1,:);Ptest2=Ptest(2,:);目标函数: Ytestar=2+Ptest1.1.5-1.5*sin(3*Ptest2);Ptest2.*sin(Ptest1)+Ptest1.*cos(Ptest2);仿真输出:Ytest=sim(net,Ptest);采用产生的随机数据计算目标函数值及神经网络仿真,两者的结果对比如图 3.1 所示:图 3.1 测试目标向量值与神经网络仿真输出值对比图从上图中可以看出,本题设计的 BP 网络对被逼近的对象函数有很好的逼近程度。在测试数据间线性插入网
15、格,在原来的目标向量图上绘制三维网格图。两者的对比如图 3.2 所示:图 3.2 目标向量值在测试数据间线性插入网格,在原来的神经网络仿真数据图上绘制三维网格图。两者的对比如图 3.3 所示:图 3.2 目标向量值4 BP 网络在函数逼近中的不足BP 算法中,网络的权值和阈值是沿着网络误差变化的负梯度方向进行调节,最终使得网络的误差达到极小值或者最小值,也就是说,在这一刻,误差梯度是零。由于梯度下降算法的固有缺陷,标准的 BP 算法收敛速度慢,容易陷入局部最小值,所以后来又有许多的改进算法:动量因子学习算法、变速率学习算法、弹性学习算法、共扼梯度学习算法等等。对于不同的具体问题,选择学习算法对
16、网络进行训练时,不仅要考虑算法本身大额性能,还要考虑问题的复杂度、样本集的大小、网络规模、网络误差目标以及要解决问题的类型。如果待解决的问题属于模式分类,常用弹性学习算法(收敛快,占用存贮空间小) 、共扼梯度法(收敛快,性能稳定,占用存贮空间一般,尤其适合较大规模的网络) 。BP 网络克服了感知器、线性神经网络的局限性,可以实现任意线性或者非线性的函数映射,然而在实际的设计过程中往往需要反复试凑隐层神经元的个数,分析隐层神经元的作用机理,不断进行训练才可能得到比较满意的结果。这正是现在 BP 网络研究的一个难点。5 总结由以上的分析可知,本文所设计的 BP 神经网络对所求函数有较好的逼近效果,
17、所用时间也较短,为 2.2344s(隐含层神经元数为 200)。另外,程序中所用的训练网络数据及测试数据均为随机获得,因此更具有普遍意义。由于刚刚接触人工智能技术这门课程,所掌握的知识有限,对各种人工智能计算方法没有很通透的认识,在神经网络设计中难免会存在一些或大或小的问题。在以后的科研中,将会更多的应用人工智能的各种算法,对其会有更多的认识。附录:MATLAB程序clear,clcclf resetfigure(gcf)Ptrain=rand(2,100)*4.0+1.0; x1=Ptrain(1,:); x2=Ptrain(2,:); Ytarget =2+x1.1.5-1.5*sin(3
18、*x2);x2.*sin(x1)+x1.*cos(x2);figure(1)subplot(1,2,1);plot3(x1,x2,Ytarget(1,:),r.);title(训练神经网络的参考输入输出 );xlabel(x1);ylabel(x2);zlabel (Ytarget(1)subplot(1,2,2)plot3(x1,x2,Ytarget(2,:),r.);title(训练神经网络的参考输入输出 );xlabel(x1);ylabel(x2);zlabel (Ytarget(2)time_init=cputime;net=newff(minmax(Ptrain),200,2,ta
19、nsig purelin,trainlm); net.trainParam.epochs=20;net.trainParam.lr = 0.01; net.trainParam.goal = 0.001; net,tr = train(net,Ptrain,Ytarget);time=cputime-time_initPtest=rand(2,100)*4.0+1.0;Ptest1=Ptest(1,:);Ptest2=Ptest(2,:);Ytestar=2+Ptest1.1.5-1.5*sin(3*Ptest2);Ptest2.*sin(Ptest1)+Ptest1.*cos(Ptest2)
20、; Ytest=sim(net,Ptest); figure(2)subplot(1,2,1)plot3(Ptest1, Ptest2, Ytestar(1,:),go, Ptest1, Ptest2, Ytest(1,:),r.);title(测试目标向量(绿)和神经网络输出(红)对比);xlabel(Ptest1);ylabel(Ptest2);zlabel(Ytestar(1) subplot(1,2,2)plot3(Ptest1, Ptest2, Ytestar(2,:),go, Ptest1, Ptest2, Ytest(2,:),r.);title(测试目标向量(绿)和神经网络输出
21、(红)对比);xlabel(Ptest1);ylabel(Ptest2);zlabel(Ytestar(2) tlin1=linspace(min(Ptest1),max(Ptest1),30);tlin2=linspace(min(Ptest2),max(Ptest2),30);T1,T2=meshgrid(tlin1,tlin2);figure(3)subplot(1,2,1)Yttgrid=griddata(Ptest1,Ptest2,Ytestar(1,:),T1,T2,cubic);mesh(T1,T2,Yttgrid);axis tight;title(测试数据及其目标向量 );x
22、label(Ptest1);ylabel(Ptest2);zlabel(Ytestar(1)* hold onplot3(Ptest1, Ptest2, Ytestar(1,:),*)subplot(1,2,2)Yttgrid=griddata(Ptest1,Ptest2,Ytestar(2,:),T1,T2,cubic);mesh(T1,T2,Yttgrid);axis tight;title(测试数据及其目标向量 );xlabel(Ptest1);ylabel(Ptest2);zlabel(Ytestar(2)* hold onplot3(Ptest1, Ptest2, Ytestar(2
23、,:),*)figure(4)subplot(1,2,1)Ytgrid=griddata(Ptest1,Ptest2,Ytest(1,:),T1,T2,cubic);mesh(T1,T2,Ytgrid);axis tight;title(测试数据及其网络仿真输出 );xlabel(Ptest1);ylabel(Ptest2);zlabel(Ytest(1)* hold onplot3(Ptest1, Ptest2, Ytest(1,:),*);subplot(1,2,2)Ytgrid=griddata(Ptest1,Ptest2,Ytest(2,:),T1,T2,cubic);mesh(T1,T2,Ytgrid);axis tight;title(测试数据及其网络仿真输出 );xlabel(Ptest1);ylabel(Ptest2);zlabel(Ytest(2)* hold onplot3(Ptest1, Ptest2, Ytest(2,:),*);