完整版BP神经网络原理及应用doc.docx
《完整版BP神经网络原理及应用doc.docx》由会员分享,可在线阅读,更多相关《完整版BP神经网络原理及应用doc.docx(23页珍藏版)》请在冰豆网上搜索。
![完整版BP神经网络原理及应用doc.docx](https://file1.bdocx.com/fileroot1/2023-2/3/6c327176-8025-4abc-acc5-b73fa28397d2/6c327176-8025-4abc-acc5-b73fa28397d21.gif)
完整版BP神经网络原理及应用doc
BP神经网络原理及应用
1人工神经网络简介
1.1生物神经元模型
神经系统的基本构造是神经元(神经细胞),它是处理人体内各部分之间相互信息传递的基本单元。
据神经生物学家研究的结果表明,人的大脑一般有
10101011个神经元。
每个神经元都由一个细胞体,一个连接其他神经元的轴突
和一些向外伸出的其它较短分支——树突组成。
轴突的功能是将本神经元的输出信号(兴奋)传递给别的神经元。
其末端的许多神经末梢使得兴奋可以同时送给多个神经元。
树突的功能是接受来自其它神经元的兴奋。
神经元细胞体将接受到的所有信号进行简单地处理后由轴突输出。
神经元的树突与另外的神经元的神经末梢相连的部分称为突触。
1.2人工神经元模型
神经网络是由许多相互连接的处理单元组成。
这些处理单元通常线性排列成
组,称为层。
每一个处理单元有许多输入量,而对每一个输入量都相应有一个相
关
联的权重。
处理单元将输入量经过加权求和,并通过传递函数的作用得到输出量,再传给下一层的神经元。
目前人们提出的神经元模型已有很多,其中提出最早且
影
响最大的是1943年心理学家McCulloch和数学家Pitts在分析总结神经元基本特
性的基础上首先提出的M-P模型,它是大多数神经网络模型的基础。
n
Yj(t)f(wjixij)
(1.1)
i1
式(1.1)中,j为神经元单元的偏置(阈值),wji为连接权系数(对于激发状态,
wji
取正值,对于抑制状态,
wji取负值),n为输入信号数目,
Yj为神经元输出,
t为时间,f()为输出变换函数,有时叫做激发或激励函数,往往采用
0和
1二值
函数或S形函数。
1.3人工神经网络的基本特性
人工神经网络由神经元模型构成;这种由许多神经元组成的信息处理网络具有并行分布结构。
每个神经元具有单一输出,并且能够与其它神经元连接;存在许多(多重)输出连接方法,每种连接方法对应一个连接权系数。
严格地说,人工神经网络是一种具有下列特性的有向图:
(1)对于每个节点存在一个状态变量xi;
(2)从节点i至节点j,存在一个连接权系数wji;
(3)对于每个节点,存在一个阈值j;
(4)对于每个节点,定义一个变换函数fj(xi,wji,j),ij,对于最一般的情况,
此函数取fj(wjixi
j)形式。
i
1.4人工神经网络的主要学习算法
神经网络主要通过两种学习算法进行训练,即指导式(有师)学习算法和非指导
式(无师)学习算法。
此外,还存在第三种学习算法,即强化学习算法;可把它
看做有师学习的一种特例。
(1)有师学习有师学习算法能够根据期望的和实际的网络输出(对应于给定输
入)间的差来调整神经元间连接的强度或权。
因此,有师学习需要有个老师或导
师来提供期望或目标输出信号。
有师学习算法的例子包括规则、广义规
则或反向传播算法以及LVQ算法等。
(2)无师学习无师学习算法不需要知道期望输出。
在训练过程中,只要向神
网提供入模式,神网就能自地适接,以便按相似特征把入模式分聚集。
无学算法的例子包括Kohonen算法和Carpenter-Grossberg自适共振理(ART)等。
(3)化学如前所述,化学是有学的特例。
它不需要老出目出。
化学算法采用一个“”来价与定入相的神。
2BP神经网络原理
2.1基本BP算法公式推导
基本BP算法包括两个方面:
信号的前向播和差的反向播。
即算出按从入到出的方向行,而和的修正从出到入的方向行。
1
a1
x1
o1
⋯
⋯
⋯
输
输
i
ak
出
入
xj
ok变
变
wij
wki⋯
量
量
⋯
aL
⋯
q
xM
oL
输入层
隐含层
输出层
2-1BP网构
Fig.2-1StructureofBPnetwork中:
xj表示入第j个点的入,j=1,⋯,M;
wij表示含第i个点到入第j个点之的;
i表示含第i个点的;
(x)表示含的激励函数;
wki表示出第k个点到含第i个点之的,i=1,⋯,q;ak表示出第k个点的,k=1,⋯,L;
x表示出的激励函数;
ok表示输出层第k个节点的输出。
(1)信号的前向传播过程
隐含层第i个节点的输入neti:
M
neti
j1
wijxj
i
(3-1)
隐含层第i个节点的输出yi:
M
yi
(neti)
(
wijxj
i)
j1
(3-2)
输出层第k个节点的输入netk:
q
q
M
netk
wkiyi
ak
wki(
wijxj
i)
ak
i1
i1
j
1
(3-3)
输出层第k个节点的输出ok:
q
q
M
ok(netk)(
wki
yi
ak)
wki(
wijxj
i)ak
i1
i
1
j1
(3-4)
(2)误差的反向传播过程
误差的反向传播,即首先由输出层开始逐层计算各层神经元的输出误差,然后根据误差梯度下降法来调节各层的权值和阈值,使修改后的网络的最终输出能接近期望值。
对于每一个样本p的二次型误差准则函数为
Ep:
Ep
1
L
ok)
2
(Tk
2k1
(3-5)
系统对P个训练样本的总误差准则函数为:
E
1
PL
p
p
2
2p1k1
(Tk
ok)
(3-6)
根据误差梯度下降法依次修正输出层权值的修正量
wki,输出层阈值的修正量
k
ij
,隐含层阈值的修正量
i。
a,隐含层权值的修正量
w
E
ak
E
wij
E
E
wki
wij;
i
wki;
ak;
i
(3-7)
输出层权值调整公式:
wki
E
E
netk
E
ok
netk
wki
netk
wki
ok
netk
wki
(3-8)
输出层阈值调整公式:
ak
E
E
netk
E
ok
netk
ak
netk
ak
ok
netk
ak
(3-9)
隐含层权值调整公式:
E
E
neti
E
yi
neti
wij
neti
wij
yi
neti
wij
wij
(3-10)
隐含层阈值调整公式:
i
又因为:
netk
wki
E
E
neti
E
yi
neti
i
neti
i
yi
neti
i
E
P
L
(Tkp
okp)
ok
p
1k
1
yi
netk
1
neti
neti
1
ak
wij
xj
,
,
,
i
E
P
L
(Tkp
okp)
'(netk)
wki
yi
p1
k1
(3-11)
(3-12)
(3-13)
(3-14)
yi
(neti)
neti
ok'(netk)
netk
所以最后得到以下公式:
P
L
wki
(Tkp
okp)
'
netk
yi
p1k1
P
L
ak
(Tkp
okp)
'
netk
p
1k
1
P
L
(Tkp
okp)
wij
'netk
wki(neti)xj
p
1k
1
P
L
i
(Tkp
okp)
'netk
wki
(neti)
p1k1
(3-15)
(3-16)
(3-17)
(3-18)
(3-19)
(3-20)
开始
批量输入学习样本并且对输
入和输出量进行归一化处理
参数初始化:
最大训练次数,学习精度,隐节点
数,初始权值、阈值,初始学习速率等
计算各层的输入和输出值
Yes
计算输出层误差E(q)
Yes
E(q)<ε
N
修正权值和阈值
结束
图2-2BP算法程序流程图
Fig.2-2TheflowchartoftheBPalgorithmprogram
2.2基本BP算法的缺陷
BP算法因其简单、易行、计算量小、并行性强等优点,目前是神经网
络训练采用最多也是最成熟的训练算法之一。
其算法的实质是求解误差函
数的最小值问题,由于它采用非线性规划中的最速下降方法,按误差函数
的负梯度方向修改权值,因而通常存在以下问题:
(1)学习效率低,收敛速度慢
(2)易陷入局部极小状态
2.3BP算法的改进
2.3.1附加动量法
附加动量法使网络在修正其权值时,不仅考虑误差在梯度上的作用,
而且考虑在误差曲面上变化趋势的影响。
在没有附加动量的作用下,网络
可能陷入浅的局部极小值,利用附加动量的作用有可能滑过这些极小值。
该方法是在反向传播法的基础上在每一个权值(或阈值)的变化上加
上一项正比于前次权值(或阈值)变化量的值,并根据反向传播法来产生
新的权值(或阈值)变化。
带有附加动量因子的权值和阈值调节公式为:
wij(k1)
(1
mc)
ipjmcwij(k)
bi(k1)
(1
mc)i
mcbi(k)
其中k为训练次数,
mc为动量因子,一般取
0.95左右。
附加动量法的实质是将最后一次权值(或阈值)变化的影响,通过一个动量因子来传递。
当动量因子取值为零时,权值(或阈值)的变化仅是
根据梯度下降法产生;当动量因子取值为1时,新的权值(或阈值)变化
则是设置为最后一次权值(或阈值)的变化,而依梯度法产生的变化部分则被忽略掉了。
以此方式,当增加了动量项后,促使权值的调节向着误差
曲面底部的平均方向变化,当网络权值进入误差曲面底部的平坦区时,
i
将变得很小,于是wij(k1)wij(k),从而防止了wij0的出现,有助于
使网络从误差曲面的局部极小值中跳出。
根据附加动量法的设计原则,当修正的权值在误差中导致太大的增长
结果时,新的权值应被取消而不被采用,并使动量作用停止下来,以使网
络不进入较大误差曲面;当新的误差变化率对其旧值超过一个事先设定的
最大误差变化率时,也得取消所计算的权值变化。
其最大误差变化率可以
是任何大于或等于1的值。
典型的取值取1.04。
所以,在进行附加动量法
的训练程序设计时,必须加进条件判断以正确使用其权值修正公式。
训练程序设计中采用动量法的判断条件为:
0
E(k)
E(k
1)*1.04
mc0.95
E(k)
E(k
1),E(k)为第k步误差平方和。
mc
其它
2.3.2自适应学习速率
对于一个特定的问题,要选择适当的学习速率不是一件容易的事情。
通常是凭经验或实验获取,但即使这样,对训练开始初期功效较好的学习
速率,不见得对后来的训练合适。
为了解决这个问题,人们自然想到在训
练过程中,自动调节学习速率。
通常调节学习速率的准则是:
检查权值是
否真正降低了误差函数,如果确实如此,则说明所选学习速率小了,可以
适当增加一个量;若不是这样,而产生了过调,那幺就应该减少学习速率
的值。
下式给出了一个自适应学习速率的调整公式:
1.05(k)E(k1)E(k)
(k1)0.7(k)E(k1)1.04E(k),E(k)为第k步误差平方和。
(k)其它
初始学习速率(0)的选取范围可以有很大的随意性。
2.3.3动量-自适应学习速率调整算法
当采用前述的动量法时,BP算法可以找到全局最优解,而当采用自适
应学习速率时,BP算法可以缩短训练时间,采用这两种方法也可以用来
训练神经网络,该方法称为动量-自适应学习速率调整算法。
2.4网络的设计
2.4.1网络的层数
理论上已证明:
具有偏差和至少一个S型隐含层加上一个线性输出层
的网络,能够逼近任何有理数。
增加层数可以更进一步的降低误差,提高
精度,但同时也使网络复杂化,从而增加了网络权值的训练时间。
而误差
精度的提高实际上也可以通过增加神经元数目来获得,其训练效果也比增
加层数更容易观察和调整。
所以一般情况下,应优先考虑增加隐含层中的
神经元数。
2.4.2隐含层的神经元数
网络训练精度的提高,可以通过采用一个隐含层,而增加神经元数了
的方法来获得。
这在结构实现上,要比增加隐含层数要简单得多。
那么究
竟选取多少隐含层节点才合适?
这在理论上并没有一个明确的规定。
在具
体设计时,比较实际的做法是通过对不同神经元数进行训练对比,然后适
当地加上一点余量。
2.4.3初始权值的选取
由于系统是非线性的,初始值对于学习是否达到局部最小、是否能够
收敛及训练时间的长短关系很大。
如果初始值太大,使得加权后的输入和
n落在了S型激活函数的饱和区,从而导致其导数f’(n)非常小,而在计算
权值修正公式中,因为f'(n),当f’(n)0时,则有0。
这使得
wij0,从而使得调节过程几乎停顿下来。
所以一般总是希望经过初始加权后的每个神经元的输出值都接近于零,这样可以保证每个神经元的权
值都能够在它们的S型激活函数变化最大之处进行调节。
所以,一般取初始权值在(-1,1)之间的随机数。
2.4.4学习速率
学习速率决定每一次循环训练中所产生的权值变化量。
大的学习速率
可能导致系统的不稳定;但小的学习速率导致较长的训练时间,可能收敛
很慢,不过能保证网络的误差值不跳出误差表面的低谷而最终趋于最小误
差值。
所以在一般情况下,倾向于选取较小的学习速率以保证系统的稳定
性。
学习速率的选取范围在
0.01-0.8之间。
3BP神经网络的应用
现给出一药品商店一年当中12个月的药品销售量(单位:
箱)如下:
205623952600229816341600187314871900150020461556
训练一个BP网络,用当前的所有数据预测下一个月的药品销售量。
有两种方法实现,一种是编写matlab程序,一种是使用nntool工具
箱。
3.1matlab程序实现
我们用前三个月的销售量预测下一个月的销售量,也就是用
1-3
月的
销售量预测第
4个月的销售量,用
2-4
个月的销售量预测第
5个月的销售
量,如此循环下去,直到用
9-11
月预测
12月份的销售量。
这样训练
BP
神经网络后,就可以用10-12月的数据预测来年一月的销售量。
实现程序如下:
p=[205623952600;
239526002298;
260022981634;
229816341600;
163416001873;
160018731478;
187314781900;
147819001500;
190015002046;]
t=[229816341600187314871900150020461556];
pmax=max(p);pmax1=max(pmax);
pmin=min(p);pmin1=min(pmin);
fori=1:
9%归一化处理
p1(i,:
)=(p(i,:
)-pmin1)/(pmax1-pmin1);
end
t1=(t-pmin1)/(pmax1-pmin1);
t1=t1';
net=newff([01;01;01],[71],{
'tansig'
'logsig'
},'traingd'
);
fori=1:
9
net.trainParam.epochs=15000;
net.trainParam.goal=0.01;
LP.lr=0.1;
net=train(net,p1(i,:
)',t1(i));
end
y=sim(net,[150020461556]');
y1=y*(pmax1-pmin1)+pmin1;
如果神经网络的训练函数使用trainlm,则仿真步骤会很少,但需要较大的系
统内存。
经预测,来年一月的销售量(y1)为1.4848e+003箱(每次运行后的结果可能
不同)。
3.2nntool神经网络工具箱的使用
1)在matlab(7.4)命令窗口键入nntool命令打开神经网络工具箱。
如图:
2)点击Import按钮两次,分别把输入向量和目标输出加入到对应的窗口([Inputs]
和[Targets])中,有两种可供选择的加入对象(点击Import后可以看见),一种是把当前工作区中的某个矩阵加入,另一种是通过.mat文件读入。
3)点击[NewNetwork]按钮,填入各参数:
(以最常用的带一个隐层的3层神经网络为例说明,下面没有列出的参数表示使用默认值就可以了,例如NetworkType为默认的BP神经网络);
i)InputRange——这个通过点击GetFromInput下拉框选择你加入的输入向量便可自动完成,当然也可以自己手动添加。
ii)TrainingFunction——最好使用TRAINSCG,即共轭梯度法,其好处是当训练不收敛时,它会自动停止训练,而且耗时较其他算法(TRAINLM,TRAINGD)少,也就是收敛很快(如果收敛的话),而且TrainParameters输入不多,也不用太多的技巧调整,一般指定迭代次数、结果显示频率和目标误差就可以了(详见下文)。
iii)Layer1NumberofNeurons——隐层的神经元个数,这是需要经验慢慢尝试并调整的,大致上由输入向量的维数、样本的数量和输出层(Layer2)的神经元个数决定。
一般来说,神经元越多,输出的数值与目标值越接近,但所花费的训练时间也越长,反之,神经元越少,输出值与目标值相差越大,但训练时间会
相应地减少,这是由于神经元越多其算法越复杂造成的,所以需要自己慢慢尝试,找到一个合适的中间点。
比如输入是3行5000列的0-9的随机整数矩阵,在一开始选择1000个神经元,虽然精度比较高,但是花费的训练时间较长,而且这
样神经网络的结构与算法都非常复杂,不容易在实际应用中实现,尝试改为100个,再调整为50个,如果发现在50个以下时精度较差,则可最后定为50个神经元,等等。
iv)Layer1TransferFunction——一般用TANSIG(当然也可以LOGSIG),即表示隐层输出是[-1,1]之间的实数,与LOGSIG相比范围更大。
v)Layer2NumberofNeurons——输出层的神经元个数,需要与输出的矩阵行数对应,比如设置为3,等等。
vi)Layer2TransferFunction——如果是模式识别的两类(或者多类)问题,一般用LOGSIG,即表示输出层的输出是[0,1]之间的实数;如果输出超过[0,1]则
可选择PURELIN。
所有参数输入后,可以先用View按钮预览一下,如图6。
没有问题的话就可以Create了。
另外,网络创建完毕后,如果需要手动设置权重的初始值,按View按钮后有个Initialize选项卡,在那里可以设定。
当然了,也可以不自行设定,这时候Matlab执行默认的程序进行权重的初始化。
4)点击Train按钮,到达TrainingInfo选项卡,在输入向量[Inputs]和目标输入向
量[Targets]下拉框中选择你要训练的向量(即第二步加入的对象),如图7。
然后到达TrainParameters选项卡,填入适当的迭代次数[ep