《智能计算》课程设计报告BP网络解决XOR分类问题姓名:班级:学号:指导老师:完成时间:2011/12/261设计目的:本实验课程是与《智能优化算法及其应用》理论课程配套的实践性课程,用实验的方法帮助学生更好地熟悉和掌握智能优化算法的基本原理和方法;通过综合应用所学知识,实现一些智能优化算法的经典方法,以及智能优化算法的基本应用;同时提高学生编写实验报告、总结实验结果的能力;使学生对智能优化算法的相关理论和方法有更深刻的认识。完成的主要任务:BP网络是目前前馈式神经网络中应用最广泛的网络之一,实现BP算法训练神经网络完成XOR的分类问题。设计要求:(1)能够设置网络的输入节点数、隐节点数、网络层数、学习常数等各项参数;(2)能够输入训练样本;(3)实现BP算法的训练过程;(4)实现训练过程的动态演示;(5)训练完成后可输入测试数据进行测试。解决的主要问题:根据感知器的的相关理论易知感知器善于解决线性可分问题,而不能解决XOR问题,所以引进了BP网络,并通过相关知识来解决分类问题。反向传播网络(Back-PropagationNetwork,简称BP网络)是将W-H学习规则一般化,对非线性可微分函数进行权值训练的多层网络。BP网络主要用于函数逼近,模式识别,分类,数据压缩。在人工神经网络的实际应用中,80%~90%的人工神经网络模型是采用BP网络或它的变化形式,也是前行网络的核心部分,体现了人工神经网络最精华的部分。2一个具有r个输入和一个隐含层的神经网络模型结构如图所示下图所示是S型激活函数的图型,可以看到f()是一个连续可微的函数,一阶导数存在。对于多层网络,这种激活函数所划分的区域不再是线性划分,而是有一个非线性的超平面组成的区域。它还可以严格利用梯度算法进行推算,他的权值修正的解析式十分明确,其算法被称为误差反向传播法,简称SP算法。BP算法是有两部分组成:信息的正向传递与误差的反向传播。在正向传播过程中,输入信息从输入经隐含层逐层计算传向输出层,每一层神经元的状态值影响下一层神经元的状态。如果在输出层没有得到期望的输出,则计算输出层的误差变化值,然后转向反向传播,通过网络将误差信号沿原来的连接通路反传回来修改各层神经元的权值直至达到期望的目标。设计的基本概念和原理:XOR问题就是如何用神经网络实现异或逻辑关系,即Y=AXORB。对于这个问题用单个神经元模型无法解决,因为该问题是线性不可分的,对于两维输入空间,神经元的作用可以理解为对输入空间进行一条直线划分。多层神经网络可以解决这个问题,因为多层网络引入了中间隐含层,每个隐含神经元可以按不同的方法来划分输入空间抽取输入空间中包含的某些特征,从3而形成更为复杂的分类区域。理论上已经证明三层神经网络足以解决任意复杂的分类问题。XOR问题的样本只有4个样本,它们的输入分别是{(0,0),(0,1),(1,0),(1,1)},对应的输出是{0,1,1,0}。输入是2维向量,故输入层用2个神经元,由于输入层神经元的输入与输出相同,其单元不需要进行数学处理,可直接将输入神经元的输入接到隐含层神经元的输入。网络输出是1维向量,故输出层用1个神经元。对于这个简单问题,隐含层神经元的个数确定为2个。经过简单的训练后即可得到网络结构总体设计:在进行BP网络设计前,一般应从网络的层数、每层中的神经元个数、初始值以及学习方法等方面来进行考虑。1、网络的层数理论上早已证明:具有偏差和至少一个S型隐含层加上一个线性输出层的网络,能够逼近任何有理函数。增加层数主要可以更进一步的降低误差,提高精度,但同时也使网络复杂化,从而增加了网络权值的训练时间。而误差精度的提高实际上也可以通过增加隐含层中的神经元数目来获得,其训练效果也比增加层数更容易观察和调整,所以一般情况下,应优先考虑增加隐含层中的神经元数。2、隐含层的神经元数网络的层数网络训练精度的提高,可以通过采用一个隐含层,而增加其神经元个数的方法来获得,这在结构实现上要比增加更多的隐含层要简单得多。那么究竟选取多少个隐含节点才合适?这在理论上并没有一个明确的规定。在具体设计时,比较实际的做法是通过对不同神经元数进行训练比较对比,然后适当的加上一个余量。3、初始权值的选取由于系统是非线性的,初始值对于学习是否达到局部最小、是否能够收敛以及训练时间的长短关系很大。如果初始值太大,使得加权后的输入落在激活函数的饱和区,从而导致其导数非常小,而在加权值修正公式中,调节过程几乎停顿下来。所以一般总是希望经过初始加权后的每个神经元的输出值都接近于零,这样可以保证每个神经元的权值都能够在他们的S型激活函数变化最大之处进行调节。所以一般取初始权值在(-1,1)之间的随机数。另外,为了防止上述现4象的发生,已有学者在分析了两层网络是如何对一个函数进行训练以后,提出一种选定初始权值的策略:选择权值的量级为S1开T次方,其中S1为第一层神经元数目,利用这种方法可以在较少的训练次数下得到满意的训练结果。4、学习速率学习速率决定每一次循环训练中所产生的权值变化量。大的学习速率可能导致系统的不稳定,但小的学习速率将会导致训练较长,收敛速度较慢,不过能保证网络的误差值不跳出误差表面的低谷而最终趋于最小误差值。所以在一般情况下,倾向于选取较小的学习速率以保证系统的稳定性,学习速率选取范围在0.01~0.8之间。对于一个具体的网络都存在一个合适的学习速率,但对于较复杂的网络,在误差曲面的不同部位可能需要不同的学习速率。为了减少寻找学习速率的训练次数以及训练时间,比较合适的方法是采用变化的自适应学习速率,是网络的训练在不同的阶段自动设置不同学习速率的大小。5、期望误差的选取在设计网络的训练过程中,期望误差值也应当通过对比训练后确定一个合适的值,这个所谓的“合适”,是相对于所需要的隐含层的节点数来确定。因为较小的期望误差值是要靠增加隐含层的节点,以及训练时间来完成的。一般情况下,作为对比,可以同时对两个不同期望误差值的网络进行训练,最后通过综合因素的考虑来确定采用其中一个网络。运行结果:1、开始界面:52、选择1,设置网络参数3、按回车,选择2输入训练样本:64、回车,运行:5、仿真结果误差:76、进行测试:8总结:多层前向BP网络的优点:①网络实质上实现了一个从输入到输出的映射功能,而数学理论已证明它具有实现任何复杂非线性映射的功能。这使得它特别适合于求解内部机制复杂的问题;②网络能通过学习带正确答案的实例集自动提取“合理的”求解规则,即具有自学习能力;③网络具有一定的推广、概括能力。多层前向BP网络的问题:①BP算法的学习速度很慢,其原因主要有:a、由于BP算法本质上为梯度下降法,而它所要优化的目标函数又非常复杂,因此,必然会出现“锯齿形现象”,这使得BP算法低效;b、存在麻痹现象,由于优化的目标函数很复杂,它必然会在神经元输出接近0或1的情况下,出现一些平坦区,在这些区域内,权值误差改变很小,使训练过程几乎停顿;c、为了使网络执行BP算法,不能用传统的一维搜索法求每次迭代的步长,而必须把步长的更新规则预先赋予网络,这种方法将引起算法低效。②网络训练失败的可能性较大,其原因有:a、从数学角度看,BP算法为一种局部搜索的优化方法,但它要解决的问题为求解复杂非线性函数的全局极值,因此,算法很有可能陷入局部极值,使训练失败;b、网络的逼近、推广能力同学习样本的典型性密切相关,而从问题中选取典型9样本实例组成训练集是一个很困难的问题。③难以解决应用问题的实例规模和网络规模间的矛盾。这涉及到网络容量的可能性与可行性的关系问题,即学习复杂性问题;④网络结构的选择尚无一种统一而完整的理论指导,一般只能由经验选定。为此,有人称神经网络的结构选择为一种艺术。而网络的结构直接影响网络的逼近能力及推广性质。因此,应用中如何选择合适的网络结构是一个重要的问题;⑤新加入的样本要影响已学习成功的网络,而且刻画每个输入样本的特征的数目也必须相同;⑥网络的预测能力(也称泛化能力、推广能力)与训练能力(也称逼近能力、学习能力)的矛盾。一般情况下,训练能力差时,预测能力也差,并且一定程度上,随训练能力地提高,预测能力也提高。但这种趋势有一个极限,当达到此极限时,随训练能力的提高,预测能力反而下降,即出现所谓“过拟合”现象。此时,网络学习了过多的样本细节,而不能反映样本内含的规律。bp网络最大的缺点就是收敛慢,训练时间长,而且常常陷入局部极小点,经常算一个程序要算很久,而且还算不出结果,cpu被完全占用了,又不能做其他的事,简直就是一种折磨!神经网络现在就是拟合非常好,但预测却很差。这主要是因为神经网络是对局部的优化,因此其推广性受到制约,同时又对训练样本极为依赖。而支撑向量机由于其采用的是对多维空间的超平面的寻找,而使她的推广性非常优越。我觉得bp没有有些人说的那么糟糕,先将数据处理好,再对网络的不足做一些改进,结果还是不错的.我现在用bp做工业预测,我觉得效果还不错,不过个人认为数据的筛选与样本处理是很重要的.适合用的时候才能得到较好的预测结果,神经网络就是寻找规律性(尽管我们不知道是什么样的规律性),如果样本根本就没有规律可以,那么预测效果肯定很差。在工程应用领域中,应用BP网络的好坏最关键的仍然是输入特征选择和训练样本集的准备,若样本集代表性差、矛盾样本多、数据归一化存在问题,那么,使用多复杂的综合算法、多精致的网络结构,建立起来的模型预测效果不会多好。若想取得实际有价值的应用效果,从最基础的数据整理工作做起吧,会少走弯路的。10参考文献:《MATLAB神经网络应用设计》闻新周露王丹力熊晓英编著《人工智能及其应用》蔡自兴徐光佑附录:%NEWFF——生成一个新的前向神经网络%TRAIN——对BP神经网络进行训练%SIM——对BP神经网络进行仿真clear;clc;while1disp('BP网络解决XOR分类问题')x=input('请选择以下操作:\n1.设置网络参数:\n2.输入训练样本\n3.数据测试\n');ifx==1N=input('请输入隐含层和输出层神经元的个数(N*1矩阵):');S=input('请输入隐含层和输出层的传输函数:');epochs=input('请输入网络训练时间:');net.trainParam.show=50;net.trainParam.lr=0.05;%设置网络训练时间net.trainParam.epochs=epochs;goal=input('请输入网络训练精度:');%设置网络训练精度net.trainParam.goal=goal;elseifx==2P=input('请输入网络输入矢量P:');T=input('请输入网络目标矢量T:');%利用minmax函数求输入样本范围PR=minmax(P);%创建一个新的前向神经网络net1=newff(PR,N,S,'trainrp');%进行网络训练11[net1,tr]=train(net1,P,T);%设置隐层权值net1.iw{1,1};%隐层阈值net1.b{1};%输出层权值net1.lw{2,1};%输出层阈值net1.b{2};%对BP网络进行仿真sim1=sim(net1,P);disp(sim1)%计算仿真误差E1=T-sim1;disp(E1)%MSE=mse(E1);elseifx==3Q=input('请输入要测试的输入矢量(2*1矩阵):');fori=1:4ifQ==P(:,i);A=i;endendTT=input('请输入要测试的输出矢量(2*1矩阵):');E=TT-sim1(A);disp('测试误差E:');disp(E)elseerror('输入有误,请重新运行程序')endend