1、BP神经网络的讲解神经网络的讲解BPBP神经网络神经网络 1986年Rumelhart等提出了多层前馈网络误差反向传播(Error Back Propagation,简称BP)算法,通过数学上的详细分析和完整的推导,系统地解决了多层神经元网络中隐层单元连续权的学习问题,从而用BP算法克服了简单感知器不能解决的XOR和其他一些问题。因为多层前馈网络的训练经常采用误差反向传播算法,所以通常人们都将多层前馈网络直接称为BP网络。由于BP算法得到广泛的使用,BP模型已成为神经网络的重要模式之一。 BP网络学习方法的基本思想是将训练过程分为两个阶段,第一阶段正向传播,输入信息从输入层经隐含层单元处理后传
2、向输出层,每一层神经元的状态只影响下一层神经元状态。倘若在输出层得不到希望的输出,则转入第二阶段反向传播,将误差信号沿原来的神经元连接通路返回。通过修改各层神经元的权值,逐次地向输入层传播进行计算。这样,反复地运用这两个过程,使得误差信号最小,最后使得信号误差达到允许的范围之内,网络就结束学习训练过程。BP网络主要用于:1)函数逼近:用输入矢量和相应的输出矢量训练一个网络逼近一个函数;2)模式识别:用一个特定的输出矢量将它与输入矢量联系起来;3)分类:把输人矢量以所定义的合适方式进行分类;4)数据压缩:减少输出矢量维数以便于传输或存贮 1)多层网络结构 多层BP网络不仅有输入节点、输出节点,而
3、且有一层或多层隐节点,如下图:1 1、BPBP网络结构网络结构2)传递函数一般为(0,1)S型函数:exxf11)(3)误差函数对第P个样本误差计算公式为:22ipotEpipi式中tpi,opi分别为期望和网络的计算输出2 2、BPBP网络学习公式网络学习公式 网络学习公式推导的指导思想是,对网络权值(ij,Tli)的修正与阈值()的修正,使误差函数(E)沿负梯度方向下降。BP网络三层节点表示为,输入节点: xj ,隐节点: yi ,输出节点: ol 输入节点与隐节点间的网络权值为ij ,隐节点与输出节点间的网络权值为Tli 。当输出节点的期望输出为tl时,BP模型的计算公式如下:(1)输出
4、节点的输出计算公式)输出节点的输出计算公式 1)隐节点的输出:netxwyijijijiff其中jijijixwnet2)输出节点的计算输出:netyTolilililffilililyTnet其中3)输出节点的误差公式:llliljijijlililililllExwfTftyTftot222212121(2)输出层)输出层(隐节点到输出节点间隐节点到输出节点间)的修正公式的修正公式 1)误差控制 所有样本误差:其中一个样本误差,1pkkeE nlklklkote1其中p为样本数,n为输出节点数2)误差公式:oootlllll13)权修正值: yTTillilikk1其中k为迭代次数4)阀值
5、修正: lllnkk1(3)隐节点层)隐节点层(输入节点到隐节点间输入节点到隐节点间)的修正公式的修正公式 1)误差控制Tyyliliiii12)权值修正 jiijijxkk13)阀值修正 iiikk13 3、MATLABMATLAB神经网络工具箱中的神经网络工具箱中的BPBP网络网络(1)BP网络中的神经元模型 下图给出了一个基本的神经元模型,它具有R个输入,每个输入都通过一个适当的权值 与神经元相连,神经元的输出可表示成bpfa, BP网络中基本神经元的激活函数必须处处可微,所以,经常使用的是S型的对数或正切激活函数或线性函数。(2)BP网络结构 典型的BP网络结构如下图。BP网络通常有一
6、个或多个隐层,隐层中的神经元均采用S型变换函数,输出层的神经元采用纯线性变换函数。(2)MATLAB中有关BP网络的重要函数 1)神经元上的传递函数 purelin利用WidrowHoff或BP算法训练的神经元的传递函数经常采用线性函数。神经元可采用的最简单的函数,即线性函数,它只是简单地将神经元输入经阈值调整后传递到输出。 purelin(n)函数可得到输入矢量为n时网络层输出矩阵。 purelin(z,b)函数可用于成批处理矢量,并且提供阈值的情况。这时阈值矢量b与加权输入距阵z是区分的。阈值矢量b加到z的每个矢量中去,以形成网络的输人矩阵,调用后得到的结果为矩阵。 purelin(p)函
7、数中,P指出传递函数特性的名称,调用后可得到所询问的特性,即: purelin(delta )指出delta函数名称。 purelin(init)指出标准初始化函数名称。 purelin(name )指出传递函数的全称。 purelin(output )指出包含传递函数最大和最小输出值的二元矢量。 Tansig双曲正切S型(sigmoid)传递函数。双曲正切sigmoid函数用于将神经元的输入范围为(一,+ )映射到(一1,+1)。正切sigmoid函数是可微函数,因此很适合于利用BP算法训练神经网络。函数表达式为: tansig(n)=tanh(n) tansig(n)函数对网络输入矢量n的
8、所有元素求正切sigmoid函数 tansig(z,b)函数用于成批处理矢量,并且提供阈值的情况,这时阈值b与加权输入矩阵z是区分的,阈值矢量b加到z的每个矢量中去,以形成网络的输入矩阵,然后利用正切sigmoid函数将网络输入转换成输出 tansig(p)函数中,P指出传递函数特性的名称,调用后可得到所询问的特性,即 tansig(delta )指出delta函数名称 tansig(init )指出标准初始化函数名称 tansig(name )指出传递函数的全称 tansig(output )指出包含传递函数最大和最小输出值的二元矢量 logsig对数S型(sigmoid)传递函数。对数si
9、gmoid函数用于将神经元的输入范围(一 ,+ )映射到(0,+1)的区间上,对数sigmoid函数是可微函数,因此很适合于利用BP算法训练神经网络。函数表达式为: logsig(n)函数对网络输入阵n的所有元素求对数logmoid函数 logsig(z,b)函数用于成批处理矢量,并且提供阈值的情况,这时阈值b与加权输入矩阵Z是区分的,阈值矢量b加到Z的每个矢量中去,以形成网络的输入矩阵,然后利用对数sigmoid函数将网络输入转换成输出 logsig(p)函数中,P指出传递函数特性的名称,调用后可得到所询问的特性,即 logsig(delta )指出delta函数名称 logsig(init
10、 )指出标准初始化函数名称 logsig(name )指出传递函数的名称 logsig(output )指出包含传递函数最大和最小输出值的二元矢量 nensig11log 2)(Delta)函数 deltalin纯线性(purelin)神经元的函数。通常的反向传播算法(BP)是利用网络误差平方和对网络各层输入的导数来调整其权值和阈值,从而降低误差平方和。从网络误差矢量中可推导出输出层的误差导数或(delta)矢量,隐层的矢量可由下一层的矢量导出,这种矢量的反向传播正是BP算法的由来 deltalin(a)可计算出这一层输出对本层输出的导数,参数矩阵a为纯线性层的输出矢量 deltalin(a,
11、e)可计算出线性输出层的误差导数,参数矩阵a和e分别为该层的输出矢量和误差 deltalin(a,d2,w2)可计算出线性隐层的误差导数,参数矩阵a为纯线性层的输出矢量,d2为下一层的矢量,w2为与下一层的连接权值 deltalog对数S型(logsig)神经元的函数。 deltalog(a)可计算出这一层输出对本层输出的导数,参数矩阵a为对数S型层的输出矢量 deltalog(a,e)可计算出logsig输出层的误差导数,参数矩阵a和e分别为该层的输出矢量和误差 dehalog(a,d2,w2)可计算出logsig隐层的误差导数,参数矩阵a为对数s型层的输出矢量,d2为下一层的矢量,w2为与
12、下一层的连接权值 deltatan正切S型(tansig)神经元的函数 deltatan(a)可计算出这一层输出对本层输出的导数,参数矩阵a为正切S型层的输出矢量 dehatan(a,e)可计算出tansig输出层的误差导数,参数矩阵a和e分别为该层的输出矢量和误差 deltatan(a,d2,w2)可计算出tansig隐层的误差导数,参数矩阵a为正切S型层的输出矢量, d2为下一层的矢量,w2为与下一层的连接权值 3)基本函数 initff前向网络初始化 语法格式: w,b=initff(p,S,f) w1,b1,w2,b2=initff(p,s1,f1,S2,f2) w1,b1,w2,b2
13、,w3,b3=initff(p,S1,f1,S2,f2,S3,f3) w,b=initff(p,S,t) w1,b1,w2,b2=initff(p,S1,f1,S2,t2) w1,b1,w2,b2,w3,b33=initff(p,S1,f1,S2,f2,S3,t3) initff(p,S,f)可得到S个神经元的单层神经网络的权值和阈值,其中P为输入矢量,f为神经网络层间神经元的传递函数。值得注意:P中的每一行中必须包含网络期望输入的最大值和最小值,这样才能合理地初始化权值和阈值 initff可对至多三层神经网络进行初始化,可得到每层的权值及阈值 此外,initff也可用目标矢量t代替网络输出层
14、的神经元数,这时输出层的神经元数目就为t的行数 simuff前向网络仿真 语法格式: simuff(p,w1,b1,f1) simuff(p,w1,b1,f1,w2,b2,f2) simuff(p,w1,b1,f1,w2,b2,f2,w3,b3,f3) 前向网络由一系列网络层组成,每一层都从前一层得到输入数据,simuff函数可仿真至多三层的前向网络 trainbp利用BP算法训练前向网络语法格式: w,b,te,tr=trainbp(w,b,f,P,t,tp) w1,b1,w2,b2,te,tr=trainbp(w1,b1,f1 ,w2,b2,f2 ,P,t,tp) w1,b1,w2,b2,
15、w3,b3,te,tr= trainbp(w1,b1,f1 ,w2,b2,f2,w3,b3,f3 ,P,t,tp) 利用BP算法训练前向网络,使网络完成函数逼近、矢量分类及模式识别。w,b,te,tr=trainbp(w,b,f ,P,t,tp)利用单层神经元连接的权值矩阵w,阈值矢量b及传递函数f成批训练网络,使当输入矢量为P时,网络的输出为目标矢量矩阵t tp为可选训练参数,其作用是设定如何进行训练,具体如下: tp(1) 显示间隔次数,其缺省值为25; tp(2) 最大循环次数,其缺省值为100; tp(3) 目标误差,其缺省值为002; tp(4) 学习速率,其缺省值为001 值得注意
16、,当指定了tp参数时,任何缺省或NaN值都会自动取其缺省值 一旦训练达到了最大的训练次数,或者网络误差平方和降到期望误差之下时,都会使网络停止学习。学习速率会影响权值与阈值更新的比例,较小的学习速率会导致学习时间增长,但有时可避免训练过程发散 调用trainbp函数可得到新的权值矩阵w、阈值矢量b、网络训练的实际训练次数te及网络训练误差平方和的行矢量tr 对于多层网络,在调用trainbp函数时,可得到各层的权值矩阵及各层的阈值矢量4)学习规则函数 learnbp反向传播学习规则函数语法格式: learnbp(p,d,lr) dw,db=learnbp(p,d,lr)反向传播(BP)学习规则
17、为调整网络的权值和阈值使网络误差的平方和最小,这是通过在最速下降方向上不断地调整网络的权值和阈值来达到的 首先计算出网络输出层的误差矢量的导数,然后通过网络反向传播,直到计算出每个隐层的误差导数(称为矢量),这可利用函数deltalin,deltalog和deltatan来计算 根据BP准则,每一层的权值矩阵利用本层的矢量d和输入矢量P来更新 (i,j)=lr*d(i)*p(j)其中lr为学习速率 调用learnhp(p,d,lr)后,可得到权值修正矩阵,其中P为本层的输入矢量,d为矢量,lr为学习速率 dw,db=learnbp(p,d,lr)可同时得到权值修正矩阵和阈值修正矢量 learn
18、bpm利用动量规则的改进BP算法 语法格式: learnbpm(p,d,lr,mc,dw,db) dw,db一learnbpm(p,d,lr,mc,dw,db) 使权值的变化等于上次权值的变化与这次由BP准则引起的变化之和,这样可将动量加到BP学习中,上一次权值变化的影响可由动量常数来调节。当动量常数为0时,说明权值的变化仅由梯度决定。当动量常数为1时,说明新的权值的变化仅等于上次权值变化,而忽略掉梯度项,其数学表达式为:(i,j)= mc* (i,j)+(1-mc)*lr*d(i)*p(j)其中mc为动量常数 调用learnbpm(p,d,lr,mc,dw,db)后,可得到新权值修正矩阵,其
19、中P为网络层的输入矢量,d为矢量,lr为学习速率,mc为动量常数,dw为上一次权值变化矩阵 dw,db=learnbpm(p,d,lr,mc,dw,db)可同时得到新权值修正矩阵和新阈值修正矢量5)绘图函数 plotes绘制误差曲面图语法格式: plotes(wv,bv,es) plotes(wv,by,es,v) plotes(wv,bv,es)绘制出由权值wv和阈值bv确定的误差曲面图es(由errsurf产生),误差曲面图以三维曲面和等高线图形式显示 plotes(wv,bv,es,v)允许设置期望的视角v,缺省值为-37.530 plotep在误差曲面上绘制出权值和阈值的位置语法格式:
20、 plotep(w,b,e) plotep(w,b,e,h) plotep(w,b,e)在由plotes绘制的误差曲面图上,绘制出单输入神经元误差为e时的权值w和阈值b的位置 当带输出变量调用时,plotep函数可返回包含有关位置信息的矢量h.plotep(w,b,e,h)可利用h清除网络前一次位置,并重新画出新的神经元位置6)误差分析函数 errsurf计算误差曲面语法格式: errsurf(p,t,wv,bv,f) errsurf(p,t,wv,by,f)可计算单输入神经元误差曲面的平方和。输人为输入行矢量P,相应的目标t和传递函数名f。误差曲面是从每个权值与由权值wv,阈值bv的行矢量确
21、定的阈值的组合中计算出来的4 4、实例分析、实例分析1)问题的描述 公路运量主要包括公路的客运量和公路货运量两个方面。据研究,某地区的公路运量主要与该地区的人数、机动车数量和公路面积有关,表1给出了20年得公路运量相关数据,表中人数和公路客运量的单位为万人,机动车数量单位为万两,公路面积的单位为万平方千米,公路货运量单位为万吨。 根据有关部门数据,该地区2010年和2011年的人数分别为73.39和75.55万人,机动车数量分别为3.9635和4.0975万辆,公路面积将分别为0.9880和1.0268万平方米。请利用BP神经网络预测该地区2010年2011年得公路客运量和公路货运量。 某地区
22、20年公路运量数据 年份 人口数量 机动车数量 公路面积 公路客运量 公路货运量1990 20.55 0.6 0.09 5126 12371991 22.44 0.75 0.11 6217 13791992 25.37 0.85 0.11 7730 13851993 27.13 0.90 0.14 9145 13991994 29.45 1.05 0.20 10460 16631995 30.1 1.35 0.23 11387 17141996 30.96 1.45 0.23 12353 1834 1997 34.06 1.60 0.32 15750 43221998 36.42 1.70 0
23、.32 18304 81321999 38.09 1.85 0.34 19836 89362000 39.13 2.15 0.36 21024 110992001 39.99 2.20 0.36 19490 112032002 41.93 2.25 0.38 20433 105242003 44.59 2.35 0.49 22598 11115 年份 人口数量 机动车数量 公路面积 公路客运量 公路货运量2004 47.30 2.50 0.56 25107 133202005 52.89 2.60 0.59 33442 167622006 55.73 2.70 0.59 36836 18673
24、2007 56.76 2.85 0.67 40548 207242008 59.17 2.95 0.69 42927 208032009 60.63 3.10 0.79 43462 218042)BP网络求解过程(具体程序如下)clc%输入原始数据%人口数量(万人)a=20.55 22.44 25.37 27.13 29.45 30.10 30.96 34.06 35.42 38.09 39.13 39.99 41.93 44.59 47.30 52.89 55.73 56.76 59.17 60.63;%机动车辆数(万辆)b=0.6 0.75 0.85 0.9 1.05 1.35 1.45
25、1.6 1.7 1.85 2.15 2.2 2.25 2.35 2.5 2.6 2.7 2.85 2.95 3.1; %公路面积(万平方米)c=0.09 0.11 0.11 0.14 0.20 0.23 0.23 0.32 0.32 0.34 0.36 0.36 0.38 0.49 0.56 0.59 0.59 0.67 0.69 0.79;%公路客运量(万人)d=5126 6217 7730 9145 10460 11387 12353 15750 18304 19836 21024 19490 20433 22598 25107 33442 36836 40548 42927 43462;
26、%公路货运量(万吨)e=1237 1379 1385 1399 1663 1714 1834 4322 8132 8936 11099 11203 10524 11115 13320 16762 18673 20724 20803 21804;%输入数据矩阵 p=a;b;c;%输入目标矩阵t=d;e; %利用函数premnmx对输入矩阵p、t进行归一化处理pn,minp,maxp,tn,mint,maxt=premnmx(p,t);%归一化处理后最小值为-1 ,最大值为1dx=-1,1;-1,1;-1,1; %利用处理好的数据进行BP网络训练net=newff(dx,3,7,2,tansig,
27、tansig,purelin,traingdx);net.trainParam.show=1000;net.trainParam.Lr=0.05;net.trainParam.epochs=20000;net.trainParam.goal=0.65*10(-3);net=train(net,pn,tn); %把仿真得到的数据还原为原始的数量级an=sim(net,pn);a=postmnmx(an,mint,maxt); %用原始数据仿真的结果与已知数据进行对比x=1990:2009;newk=a(1,:);newh=a(2,:);figure(2);subplot(2,1,1);plot(
28、x,newk,r-o,x,d,b-+);legend(网络输出客运量,实际客运量);xlabel(年份);ylabel(客运量/万人);title(运用工具箱客运量学习和测试对比图) ;subplot(2,1,2);plot(x,newh,r-o,x,e,b-+);legend(网络输出货运量,实际货运量);xlabel(年份);ylabel(货运量/万人);title(运用工具箱货运量学习和测试对比图) ; %利用训练好的BP网络对新数据进行仿真pnew=73.39 75.55 3.9635 4.0975 0.9880 1.0268;pnewn=tramnmx(pnew,minp,maxp);anewn=sim(net,pnewn);anew=postmnmx(anewn,mint,maxt)3)结果分析 运行程序后,的到如下结果:也就是说,2010年和2011年的公路客运量分别为41178万人和40763万人,公路货运量分别为21562万吨和21586万吨。谢谢!谢谢!