异或运算的BP算法解决解析.docx
《异或运算的BP算法解决解析.docx》由会员分享,可在线阅读,更多相关《异或运算的BP算法解决解析.docx(14页珍藏版)》请在冰豆网上搜索。
异或运算的BP算法解决解析
《智能优化方法》
技术报告
题目:
基于BP算法的异或运算的解决
班级:
信科13-01班
学号:
08133367
姓名:
张谊坤
任课教师:
姚睿
一、摘要------------------------------------------------------3
二、技术路线及实现方法
2.1输入层和输出层神经元数目的选择----------------------3
2.2隐层层数和神经元数目选择--------------------------------3
2.3BP算法学习的四个阶段-------------------------------------4
三、实验结果及分析--------------------------------------------5
四、总结------------------------------------------------------5
五、参考文献------------------------------------------------------5
六、附录
附录1:
代码---------------------------------------------------6
附录2:
个人工作---------------------------------------------------8
《摘要》利用BP函数训练计算机使其可以输出满足精度的逻辑异或运算结果。
结合本课题的特点和网络训练的思想,通过深入分析选择合适的参数;接着构建BP网络,产生训练样本;选取最优结果作为本文的最终结果,并对输出结果和仿真结果进行分析。
一、问题描述
异或问题本质上是分类问题,要求将输入的样本组分为两类,一类样本经异或运算后结果为1,另一类经异或运算后结果为0。
研究表明,BP网络特别是具有单隐层的BP网络具有较强的分类能力,能够解异或问题。
二、技术路线及实现方法
2.1输入层和输出层神经元数目的选择
输入层神经元个数与输入样本维数相同,本实验输入样本为2维向量,所以输入层包含2个神经元。
输出层神经元个数设计可根据设计者的需求设计,由于本文要解决的异或问题是单输出的0或1,所以输出层选择1个神经元。
2.2隐层层数和神经元数目选择
参考其他专家和学者的经验,了解到含有单隐层的BP网路能很好的解决异或问题。
对于隐层神经元数目的选择前人总结出了一些经验规则,本文在借鉴前人经验的基础上,依靠测试得出较适合本课题的隐层神经元数是1至3个。
由于隐层神经元越多,网络越复杂,每一步训练的计算量增大,时间增长,经测试发现1至3个隐层神经元都可以达到较高精度,为简化网络,最终确定隐层神经元数为2。
根据以上分析,建立出的BP网络的结构示意图如图2-1所示:
图2-1中, 输入层神经元编号A、B,隐藏层神经元编号P、Q,输出层神经元编号为C 。
对异或问题进行非线性划分的BP神经网络采用3层网络结构,其中输入层和隐藏层各有2个处理单元,输出层有一个处理单元。
对表2-1中的4个学习模式对轮流提供给网络,按照BP算法进行学习和训练,直至BP神经网络输出的全局误差满足要求为止。
学习速率为0.6。
首先给BP神经网络的各个连接权值及阈值赋予[-0.1,0.1]之间的随机值(具体如图2-1所示),此时,BP神经网络对应的4个输出模式产生的实际输出均为0.5左右,网络全局误差约为0.5。
表2-1学习模式对
输入
期望输出
实际输出
全局误差
AB
00
0
0.5
0
01
1
0.5
0.5
10
1
0.5
0
11
0
0.5
0
2.3BP算法学习的四个阶段
BP神经网络采用BP算法进行学习,其学习过程分为四个阶段:
1.输入模式是由输入层经过隐藏层向输出层逐层传播的“模式顺传播”过程;
2.网络的期望输出与实际输出之差,即误差信号,是由输出层经隐藏层向输入层逐层修正连接权值的“误差逆传播”过程。
3.由“模式顺传播”过程和“误差逆传播”过称反复交替进行的网络“记忆训练”过成。
4.网络趋向收敛,即网络的全局误差趋向极小值的“学习收敛”过程。
调整隐含层到输出层之间的连接权值及输出层各个单元的阈调整隐含层到输出层之间的连接权值及输出层各个单元的阈调整隐含层到输出层之间的连接权值及输出层各个单元的阈值。
三、实验结果与分析
输出实际输出层c学写了15000次后,结果如图3-1运行结果所示:
图3-1运行结果
表3-1输出结果对比
输入
期望输出
实际输出
AB
00
0
0.0118708
01
1
0.987451
10
1
0.987435
11
0
0.015573
在精度满足之后,实际输出十分逼近期望输出,可以看到BP算法解决异或问题是成功的。
四、总结
BP网络具有很强的自学习、自组织、自适应能力,分类能力较强,收敛速度快,能较好的解决2个变量的异或问题,得到的结果较为理想。
BP网络隐层和输出层激活函数(特别是输出层激活函数)的选择对具有规律性期望输出数据的问题的结果有显著影响,应结合网络训练思想对具体问题进行分析。
本文在充分学习了解神经网络训练思想的基础上构建适合本课题的BP网络,通过大量次的训练,并在实验中修改参数,得到较为理想的结果。
五、参考文献
[1] 韦巍,何衍,智能控制基础,北京:
清华大学出版社,2008.11.
[2] 张良军,曹晶,蒋世忠,神经网络实用教程,机械工业出版社,2008.2.
[3] 陈晓波.仿生态神经网络算法研究及其在声信号车型识别中的应用[D].长春:
东北师范大学,2008.5.
[4]马锐,人工神经网络原理,机械工业出版社,2009.10
附录1:
代码
#include
#include
usingnamespacestd;//用bp解决异或的问题
classBP{
private:
doublea[4]={0,0,1,1};//表中的A数据
doubleb[4]={0,1,0,1};//表中的B数据
doublep[4]={0};//用来存储p的值
doubleq[4]={0};//用来存储q的值
doubleSp[4];//f函数处理之前的p节点的值
doubleSq[4];//f函数处理之前的q节点的值
doublel[4];//f函数处理之前的c节点的值
doubled[4];//全局误差
doubleep[4];//隐藏层的误差
doubleeq[4];//隐藏层的误差
doubley[4]={0,1,1,0};//期望输出
//权值[-0.1-0.1]之间的值
doubleWap=0.0543;//节点a到节点p的权值
doubleWaq=0.0579;//节点a到节点q的权值
doubleWbp=-0.0291;//节点b到节点p的权值
doubleWbq=0.0999;//节点b到节点q的权值
doubleVpc=0.0801;//节点p到节点c的权值
doubleVqc=0.0605;//节点q到节点c的权值
//阈值
doubleRp=-0.0703;//p节点的阈值
doubleRq=-0.0939;//q节点的阈值
doubleRc=-0.0109;//c节点的阈值
doublem=0.6,n=0.6;//mn为学习速率
public:
doublec[4]={0};//用来存储c节点的值
BP(){};
doublef(doublea);//函数f,数学上是1/(1+e(-x));
doublefl(doublea);//fl是f的微分函数
voidbp();//bp算法函数
};
intmain(){
BPb;
b.bp();
cout<cout<cout<cout<return0;
}
voidBP:
:
bp(){
for(intj=0;j<15000;j++){//运行多次之后才能训练完成
for(inti=0;i<4;i++){//4组数据
Sp[i]=a[i]*Wap+b[i]*Wbp+Rp;//节点p的净输入
Sq[i]=a[i]*Waq+b[i]*Wbq+Rq;//节点q的经输入
p[i]=f(Sp[i]);//节点p的输出
q[i]=f(Sq[i]);//节点q的输出
l[i]=p[i]*Vpc+q[i]*Vqc+Rc;//节点c的净输入
c[i]=f(l[i]);//j节点c的输出,即bp的实际输出
d[i]=(y[i]-c[i])*fl(l[i]);//输出层节点即c节点的校正误差
ep[i]=(Vpc*d[i])*fl(Sp[i]);//隐藏层的p节点的校正误差
eq[i]=(Vqc*d[i])*fl(Sq[i]);//隐藏层的q节点的校正误差
Vpc=Vpc+m*d[i]*p[i];//修正隐藏层至输出层的连接权值
Vqc=Vqc+m*d[i]*q[i]//修正隐藏层至输出层的连接权值;
Rc=Rc+m*d[i];//修正输出层的阈值
Wap=Wap+n*ep[i]*a[i];Waq=Waq+n*eq[i]*a[i];//修正输入层至隐藏层的连接权值
Wbp=Wbp+n*ep[i]*b[i];Wbq=Wbq+n*eq[i]*b[i];//修正输入层至隐藏层的连接权值
Rp=Rp+n*ep[i];//修正隐藏层的阈值
Rq=Rq+n*eq[i];}}//修正隐藏层的阈值
}
doubleBP:
:
f(doublea){
return1/(1+exp(-a));
}
doubleBP:
:
fl(doublea){
returnf(a)-f(a)*f(a);
}
附录2:
个人工作
一、我个人的主要工作是负责技术报告的撰写,技术报告中共有摘要、技术路线和实现方法、实验结果与分析、总结和参考文献五个部分,其中摘要、技术路线和实现方法、总结和参考文献等四个部分主要由我撰写。
二、负责一小部分代码,BP类中一些初始化的工作,参照图2-1,根据BP神经网络的初始状态,对各节点的阈值,各节点之间的权值进行初始化。
classBP{
private:
doublea[4]={0,0,1,1};//表中的A数据
doubleb[4]={0,1,0,1};//表中的B数据
doublep[4]={0};//用来存储p的值
doubleq[4]={0};//用来存储q的值
doubleSp[4];//f函数处理之前的p节点的值
doubleSq[4];//f函数处理之前的q节点的值
doublel[4];//f函数处理之前的c节点的值
doubled[4];//全局误差
doubleep[4];//隐藏层的误差
doubleeq[4];//隐藏层的误差
doubley[4]={0,1,1,0};//期望输出
//权值[-0.10.1]之间的值
doubleWap=0.0543;//节点a到节点p的权值
doubleWaq=0.0579;//节点a到节点q的权值
doubleWbp=-0.0291;//节点b到节点p的权值
doubleWbq=0.0999;//节点b到节点q的权值
doubleVpc=0.0801;//节点p到节点c的权值
doubleVqc=0.0605;//节点q到节点c的权值
//阈值
doubleRp=-0.0703;//p节点的阈值
doubleRq=-0.0939;//q节点的阈值
doubleRc=-0.0109;//c节点的阈值
doublem=0.6,n=0.6;//mn为学习速率
public:
doublec[4]={0};//用来存储c节点的值
BP(){};
doublef(doublea);//函数f,数学上是1/(1+e(-x));
doublefl(doublea);//fl是f的微分函数
voidbp();//bp算法函数
};
三、根据老师在课堂上的点评,对程序做了一步改进,使其对学习后的权值和阈值也有一个输出。
对程序的改进如下,首先把权值和阈值的变量改为公有,以便输出:
classBP{
private:
doublea[4]={0,0,1,1};//表中的A数据
doubleb[4]={0,1,0,1};//表中的B数据
doublep[4]={0};//用来存储p的值
doubleq[4]={0};//用来存储q的值
doubleSp[4];//f函数处理之前的p节点的值
doubleSq[4];//f函数处理之前的q节点的值
doublel[4];//f函数处理之前的c节点的值
doubled[4];//全局误差
doubleep[4];//隐藏层的误差
doubleeq[4];//隐藏层的误差
doubley[4]={0,1,1,0};//期望输出
doublem=0.6,n=0.6;//mn为学习速率
doublec[4]={0};//用来存储c节点的值
public:
//权值[-0.10.1]之间的值
doubleWap=0.0543;//节点a到节点p的权值
doubleWaq=0.0579;//节点a到节点q的权值
doubleWbp=-0.0291;//节点b到节点p的权值
doubleWbq=0.0999;//节点b到节点q的权值
doubleVpc=0.0801;//节点p到节点c的权值
doubleVqc=0.0605;//节点q到节点c的权值
//阈值
doubleRp=-0.0703;//p节点的阈值
doubleRq=-0.0939;//q节点的阈值
doubleRc=-0.0109;//c节点的阈值
BP(){};
doublef(doublea);//函数f,数学上是1/(1+e(-x));
doublefl(doublea);//fl是f的微分函数
voidbp();//bp算法函数
};
然后,主函数的输出增加:
intmain(){
BPb;
b.bp();
cout<<”实际输出”<cout<cout<cout<cout<cout<<”权值”<cout<<”ap:
”<cout<<”aq:
”<cout<<”bp:
”<cout<<”bq:
”<cout<<”pc:
”<cout<<”qc:
”<cout<<”阈值”<cout<<”p:
”<cout<<”q:
”<cout<<”c:
”<return0;
}
改进后的输出结果如图6-1所示:
图6-1改进后运行结果:
即可得到学习1500次后的BP神经网络的结构如图6-2所示: