(完整版)BP神经网络原理及应用

(完整版)BP神经网络原理及应用
(完整版)BP神经网络原理及应用

BP神经网络原理及应用

1 人工神经网络简介

1.1生物神经元模型

神经系统的基本构造是神经元(神经细胞),它是处理人体内各部分之间相

互信息传递的基本单元。据神经生物学家研究的结果表明,人的大脑一般有1011

个神经元。每个神经元都由一个细胞体,一个连接其他神经元的轴突1010

和一些向外伸出的其它较短分支——树突组成。轴突的功能是将本神经元的输出信号(兴奋)传递给别的神经元。其末端的许多神经末梢使得兴奋可以同时送给多个神经元。树突的功能是接受来自其它神经元的兴奋。神经元细胞体将接受到的所有信号进行简单地处理后由轴突输出。神经元的树突与另外的神经元的神经末梢相连的部分称为突触。

1.2人工神经元模型

神经网络是由许多相互连接的处理单元组成。这些处理单元通常线性排列成组,称为层。每一个处理单元有许多输入量,而对每一个输入量都相应有一个相关

联的权重。处理单元将输入量经过加权求和,并通过传递函数的作用得到输出量,再传给下一层的神经元。目前人们提出的神经元模型已有很多,其中提出最早且影

响最大的是1943年心理学家McCulloch和数学家Pitts在分析总结神经元基本特

性的基础上首先提出的M-P 模型,它是大多数神经网络模型的基础。

)()(1∑=-=n

i j i ji j x w f t Y θ (1.1)

式(1.1)中,j 为神经元单元的偏置(阈值),ji w 为连接权系数(对于激发状态,ji w 取正值,对于抑制状态,ji w 取负值),n 为输入信号数目,j Y 为神经元输出,t 为时间,f()为输出变换函数,有时叫做激发或激励函数,往往采用0和1二值函数或S形函数。

1.3人工神经网络的基本特性

人工神经网络由神经元模型构成;这种由许多神经元组成的信息处理网络具有并行分布结构。每个神经元具有单一输出,并且能够与其它神经元连接;存在许多(多重)输出连接方法,每种连接方法对应一个连接权系数。严格地说,人工神经网络是一种具有下列特性的有向图:

(1)对于每个节点存在一个状态变量xi ;

(2)从节点i 至节点j ,存在一个连接权系数wji ; (3)对于每个节点,存在一个阈值j ;

(4)对于每个节点,定义一个变换函数(,,),j i ji j f x w i j θ≠,对于最一般的情况,此函数取()j ji i j i

f w x θ-∑形式。

1.4 人工神经网络的主要学习算法

神经网络主要通过两种学习算法进行训练,即指导式(有师)学习算法和非指导式(无师)学习算法。此外,还存在第三种学习算法,即强化学习算法;可把它看做有师学习的一种特例。

(1)有师学习 有师学习算法能够根据期望的和实际的网络输出(对应于给定输入)间的差来调整神经元间连接的强度或权。因此,有师学习需要有个老师或导师来提供期望或目标输出信号。有师学习算法的例子包括 规则、广义规则或反向传播算法以及LVQ 算法等。

(2)无师学习 无师学习算法不需要知道期望输出。在训练过程中,只要向神

经网络提供输入模式,神经网络就能够自动地适应连接权,以便按相似特征把输入模式分组聚集。无师学习算法的例子包括Kohonen 算法和Carpenter-Grossberg 自适应共振理论(ART )等。

(3)强化学习 如前所述,强化学习是有师学习的特例。它不需要老师给出目标输出。强化学习算法采用一个“评论员”来评价与给定输入相对应的神。 2 BP 神经网络原理

2.1 基本BP 算法公式推导

基本BP 算法包括两个方面:信号的前向传播和误差的反向传播。即计算实际输出时按从输入到输出的方向进行,而权值和阈值的修正从输出到输入的方向进行。

图2-1 BP 网络结构

Fig.2-1 Structure of BP network

图中:

j x 表示输入层第j 个节点的输入,j =1,…,M ; ij w 表示隐含层第i 个节点到输入层第j 个节点之间的权值;

i θ表示隐含层第i 个节点的阈值;

()x φ表示隐含层的激励函数;

ki

w 表示输出层第k 个节点到隐含层第i 个节点之间的权值,i =1,…,q ; k a 表示输出层第k 个节点的阈值,k =1,…,L ;

()

x ψ表示输出层的激励函数;

k o 表示输出层第k 个节点的输出。

(1)信号的前向传播过程

隐含层第i 个节点的输入net i :

1M i ij j i

j net w x θ==+∑ (3-1)

隐含层第i 个节点的输出y i :

1()()

M i i ij j i j y net w x φφθ===+∑ (3-2)

输出层第k 个节点的输入net k :

111()q q M k ki i k ki ij j i k

i i j net w y a w w x a φθ====+=++∑∑∑ (3-3)

输出层第k 个节点的输出o k :

111()()()q

q M k k ki i k ki ij j i k i i j o net w y a w w x a ψψψφθ===??==+=++ ?

??∑∑∑ (3-4) (2)误差的反向传播过程

误差的反向传播,即首先由输出层开始逐层计算各层神经元的输出误差,然后根据误差梯度下降法来调节各层的权值和阈值,使修改后的网络的最终输出能接近期望值。

对于每一个样本p 的二次型误差准则函数为E p :

2

11()2L

p k k k E T o ==-∑ (3-5)

系统对P 个训练样本的总误差准则函数为:

2

111()2P L

p p k k p k E T o ===-∑∑ (3-6)

根据误差梯度下降法依次修正输出层权值的修正量Δw ki ,输出层阈值的修正量Δa k ,隐含层权值的修正量Δw ij ,隐含层阈值的修正量

i θ?。 ki ki w E

w ??-=?η;k k E a a η??=-?;ij ij E w w η??=-?;

i i E θηθ??=-? (3-7) 输出层权值调整公式:

ki k k k k ki k k ki ki w net net o o E w net net E w E w ??????-=????-=??-=?ηηη (3-8)

输出层阈值调整公式:

k k k k k k k k k k net o net E E E a a net a o net a ηηη???????=-=-=-?????? (3-9)

隐含层权值调整公式:

i i i ij ij i ij i i ij net y net E E E w w net w y net w ηηη???????=-=-=-?????? (3-10)

隐含层阈值调整公式:

i i i i i i i i i i net y net E E E net y net θηηηθθθ???????=-=-=-?????? (3-11)

又因为:

11()

P L

p

p

k k p k k E T o o ==?=--?∑∑

(3-12) i

ki k y w net =??,1

k k net a ?=?,i j ij net x w ?=?,1

i i net

θ?

=?

(3-13) 11()'()P L

p p

k k k ki

p k i E T o net w y ψ==?=--???∑∑

(3-14) )

(i i i

net net y φ'=??

(3-15) '()

k

k k o net net ψ?=?

(3-16) 所以最后得到以下公式:

()11()'P L

p

p

ki k k k i

p k w T o net y ηψ==?=-??∑∑

(3-17) ()

11()'P L

p

p

k k k k p k a T o net ηψ==?=-?∑∑

(3-18) ()11()'()P L

p p

ij k k k ki i j

p k w T o net w net x η

ψφ=='?=-????∑∑

(3-19) ()11()'()

P L

p p

i k

k k ki i p k T o net w net θηψφ=='?=-???∑∑ (

3-20)

图2-2 BP算法程序流程图

Fig.2-2 The flowchart of the BP algorithm program

2.2 基本BP算法的缺陷

BP算法因其简单、易行、计算量小、并行性强等优点,目前是神经网络训练采用最多也是最成熟的训练算法之一。其算法的实质是求解误差函数的最小值问题,由于它采用非线性规划中的最速下降方法,按误差函数的负梯度方向修改权值,因而通常存在以下问题:

(1)学习效率低,收敛速度慢

(2)易陷入局部极小状态

2.3 BP 算法的改进

2.3.1附加动量法

附加动量法使网络在修正其权值时,不仅考虑误差在梯度上的作用,而且考虑在误差曲面上变化趋势的影响。在没有附加动量的作用下,网络可能陷入浅的局部极小值,利用附加动量的作用有可能滑过这些极小值。

该方法是在反向传播法的基础上在每一个权值(或阈值)的变化上加上一项正比于前次权值(或阈值)变化量的值,并根据反向传播法来产生新的权值(或阈值)变化。

带有附加动量因子的权值和阈值调节公式为:

)()1()1(k w mc p mc k w ij j i ij ?+-=+?ηδ

)()1()1(k b mc mc k b i i i ?+-=+?ηδ

其中k 为训练次数,mc 为动量因子,一般取0.95左右。

附加动量法的实质是将最后一次权值(或阈值)变化的影响,通过一个动量因子来传递。当动量因子取值为零时,权值(或阈值)的变化仅是根据梯度下降法产生;当动量因子取值为1时,新的权值(或阈值)变化则是设置为最后一次权值(或阈值)的变化,而依梯度法产生的变化部分则被忽略掉了。以此方式,当增加了动量项后,促使权值的调节向着误差曲面底部的平均方向变化,当网络权值进入误差曲面底部的平坦区时, δi 将变得很小,于是)()1(k w k w ij ij ?=+?,从而防止了0=?ij w 的出现,有助于使网络从误差曲面的局部极小值中跳出。

根据附加动量法的设计原则,当修正的权值在误差中导致太大的增长结果时,新的权值应被取消而不被采用,并使动量作用停止下来,以使网络不进入较大误差曲面;当新的误差变化率对其旧值超过一个事先设定的最大误差变化率时,也得取消所计算的权值变化。其最大误差变化率可以是任何大于或等于1的值。典型的取值取1.04。所以,在进行附加动量法的训练程序设计时,必须加进条件判断以正确使用其权值修正公式。

训练程序设计中采用动量法的判断条件为:

??

???=mc mc 95.00 其它)1()(04.1*)1()(-<->k E k E k E k E , E (k )为第k 步误差平方和。

2.3.2自适应学习速率

对于一个特定的问题,要选择适当的学习速率不是一件容易的事情。

通常是凭经验或实验获取,但即使这样,对训练开始初期功效较好的学习速率,不见得对后来的训练合适。为了解决这个问题,人们自然想到在训练过程中,自动调节学习速率。通常调节学习速率的准则是:检查权值是否真正降低了误差函数,如果确实如此,则说明所选学习速率小了,可以适当增加一个量;若不是这样,而产生了过调,那幺就应该减少学习速率的值。下式给出了一个自适应学习速率的调整公式:

??

???=+)()(7.0)(05.1)1(k k k k ηηηη 其它)(04.1)1()()1(k E k E k E k E >+<+ , E (k )为第k 步误差平方和。

初始学习速率η(0)的选取范围可以有很大的随意性。

2.3.3动量-自适应学习速率调整算法

当采用前述的动量法时,BP 算法可以找到全局最优解,而当采用自适应学习速率时,BP 算法可以缩短训练时间, 采用这两种方法也可以用来训练神经网络,该方法称为动量-自适应学习速率调整算法。

2.4 网络的设计

2.4.1网络的层数

理论上已证明:具有偏差和至少一个S 型隐含层加上一个线性输出层的网络,能够逼近任何有理数。增加层数可以更进一步的降低误差,提高精度,但同时也使网络复杂化,从而增加了网络权值的训练时间。而误差精度的提高实际上也可以通过增加神经元数目来获得,其训练效果也比增加层数更容易观察和调整。所以一般情况下,应优先考虑增加隐含层中的神经元数。

2.4.2隐含层的神经元数

网络训练精度的提高,可以通过采用一个隐含层,而增加神经元数了的方法来获得。这在结构实现上,要比增加隐含层数要简单得多。那么究竟选取多少隐含层节点才合适?这在理论上并没有一个明确的规定。在具体设计时,比较实际的做法是通过对不同神经元数进行训练对比,然后适当地加上一点余量。

2.4.3初始权值的选取

由于系统是非线性的,初始值对于学习是否达到局部最小、是否能够收敛及训练时间的长短关系很大。如果初始值太大,使得加权后的输入和n 落在了S 型激活函数的饱和区,从而导致其导数f ’(n)非常小,而在计算权值修正公式中,因为)('n f ∝δ,当f ’(n)0→时,则有0→δ。这使得

?

w,从而使得调节过程几乎停顿下来。所以一般总是希望经过初始ij

加权后的每个神经元的输出值都接近于零,这样可以保证每个神经元的权值都能够在它们的S型激活函数变化最大之处进行调节。所以,一般取初始权值在(-1,1)之间的随机数。

2.4.4学习速率

学习速率决定每一次循环训练中所产生的权值变化量。大的学习速率可能导致系统的不稳定;但小的学习速率导致较长的训练时间,可能收敛很慢,不过能保证网络的误差值不跳出误差表面的低谷而最终趋于最小误差值。所以在一般情况下,倾向于选取较小的学习速率以保证系统的稳定性。学习速率的选取范围在0.01-0.8之间。

3 BP神经网络的应用

现给出一药品商店一年当中12个月的药品销售量(单位:箱)如下:2056 2395 2600 2298 1634 1600 1873 1487 1900 1500 2046 1556 训练一个BP网络,用当前的所有数据预测下一个月的药品销售量。

有两种方法实现,一种是编写matlab程序,一种是使用nntool工具箱。

3.1 matlab程序实现

我们用前三个月的销售量预测下一个月的销售量,也就是用1-3月的销售量预测第4个月的销售量,用2-4个月的销售量预测第5个月的销售量,如此循环下去,直到用9-11月预测12月份的销售量。这样训练BP 神经网络后,就可以用10-12月的数据预测来年一月的销售量。

实现程序如下:

p=[2056 2395 2600;

2395 2600 2298;

2600 2298 1634;

2298 1634 1600;

1634 1600 1873;

1600 1873 1478;

1873 1478 1900;

1478 1900 1500;

1900 1500 2046;]

t=[2298 1634 1600 1873 1487 1900 1500 2046 1556];

pmax=max(p);pmax1=max(pmax);

pmin=min(p);pmin1=min(pmin);

for i=1:9 %归一化处理

p1(i,:)=(p(i,:)-pmin1)/(pmax1-pmin1);

end

t1=(t-pmin1)/(pmax1-pmin1);

t1=t1';

net=newff([0 1;0 1;0 1],[7 1],{'tansig','logsig'},'traingd');

for i=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,[1500 2046 1556]');

y1=y*(pmax1-pmin1)+pmin1;

如果神经网络的训练函数使用trainlm,则仿真步骤会很少,但需要较大的系统内存。

经预测,来年一月的销售量(y1)为1.4848e+003箱(每次运行后的结果可能不同)。

3.2 nntool神经网络工具箱的使用

1)在matlab(7.4)命令窗口键入nntool命令打开神经网络工具箱。如图:

2)点击Import按钮两次,分别把输入向量和目标输出加入到对应的窗口([Inputs]和[Targets])中,有两种可供选择的加入对象(点击Import后可以看见),一种是把当前工作区中的某个矩阵加入,另一种是通过.mat文件读入。

3)点击[New Network]按钮,填入各参数:(以最常用的带一个隐层的3层神经网络为例说明,下面没有列出的参数表示使用默认值就可以了,例如Network Type 为默认的BP神经网络);

i)Input Range——这个通过点击Get From Input下拉框选择你加入的输入向量便可自动完成,当然也可以自己手动添加。

ii) Training Function——最好使用TRAINSCG,即共轭梯度法,其好处是当训练不收敛时,它会自动停止训练,而且耗时较其他算法(TRAINLM,TRAINGD)少,也就是收敛很快(如果收敛的话),而且Train Parameters输入不多,也不用太多的技巧调整,一般指定迭代次数、结果显示频率和目标误差就可以了(详见下文)。

iii) Layer 1 Number of Neurons——隐层的神经元个数,这是需要经验慢慢尝试并调整的,大致上由输入向量的维数、样本的数量和输出层(Layer2)的神经元个数决定。一般来说,神经元越多,输出的数值与目标值越接近,但所花费的训练时间也越长,反之,神经元越少,输出值与目标值相差越大,但训练时间会相应地减少,这是由于神经元越多其算法越复杂造成的,所以需要自己慢慢尝试,找到一个合适的中间点。比如输入是3行5000列的0-9的随机整数矩阵,在一开始选择1000个神经元,虽然精度比较高,但是花费的训练时间较长,而且这样神经网络的结构与算法都非常复杂,不容易在实际应用中实现,尝试改为100个,再调整为50个,如果发现在50个以下时精度较差,则可最后定为50个神经元,等等。

iv)Layer 1 Transfer Function——一般用TANSIG(当然也可以LOGSIG),即表示隐层输出是[-1,1]之间的实数,与LOGSIG相比范围更大。

v) Layer 2 Number of Neurons——输出层的神经元个数,需要与输出的矩阵行数对应,比如设置为3,等等。

vi) Layer 2 Transfer Function——如果是模式识别的两类(或者多类)问题,一般用LOGSIG,即表示输出层的输出是[0,1]之间的实数;如果输出超过[0,1]则可选择PURELIN。

所有参数输入后,可以先用View按钮预览一下,如图6。没有问题的话就可以Create了。另外,网络创建完毕后,如果需要手动设置权重的初始值,按View按钮后有个Initialize选项卡,在那里可以设定。当然了,也可以不自行设定,这时候Matlab执行默认的程序进行权重的初始化。

4)点击Train按钮,到达Training Info选项卡,在输入向量[Inputs]和目标输入向量[Targets]下拉框中选择你要训练的向量(即第二步加入的对象),如图7。然后到达Train Parameters选项卡,填入适当的迭代次数[epochs](一般先设置一个较

小的数如200,然后观察收敛结果,如果结果窗口的收敛曲线衰减较快,则表示之前的参数比较有效,因此可填入2000或更大的数目使得网络收敛,否则修改之前的参数)、结果显示频率[show](例如要每隔50次迭代显示结果窗口,则填50)和目标误差[goal](这个与第2步中的“Performance Function”有关,如果使用默认的MSE,则一般满足“goal*样本数量<0.5”就可以了),就可以开始训练了(按钮[Train Network]),如果结果收敛(训练误差不大于目标误差,即蓝色线到达黑色线位置)就OK了(例如要求精度很高,尝试填0,等等)。

由于神经网络工具箱一次只能输入一组输入数据,所以对于此问题要分九次输入,并没有编程简单。

相关主题
相关文档
最新文档