Matlab地神经网络工具箱实用指南设计作者夏寒发布时间.docx
《Matlab地神经网络工具箱实用指南设计作者夏寒发布时间.docx》由会员分享,可在线阅读,更多相关《Matlab地神经网络工具箱实用指南设计作者夏寒发布时间.docx(15页珍藏版)》请在冰点文库上搜索。
Matlab地神经网络工具箱实用指南设计作者夏寒发布时间
实用标准文案
2000/11/09作者:
夏寒Matlab的神经网络工具箱实用指南发布时间:
:
文章摘要第一章是神经网络的基本介绍,第二章包括了由工具箱指定的有关网络结构和符号的基本材料
。
第三章以反向传播网络为例trainadapt和new、init、以及建立神经网络的一些基本函数,例如讲解了反向传播网络的原理和应用的基本过程。
:
正文
静态网络中的批处理方式
通train函数来实现,虽然由于由于采用了更高效的学习算法,train批处理方式可以用adapt或train函数只能用于批处理方式。
常是最好的选择。
增加方式只能用adapt来实现,。
让我们用前面用过的静态网络的例子开始,学习速率设置为0.1net=newlin([-11;-11],1,0,0.1);
net.IW{1,1}=[00];
net.b{1}=0;
adapt用函数实现静态网络的批处理方式,输入向量必须用同步向量矩阵的方式放置:
P=[1223;2131];
T=[4577];
精彩文档.
实用标准文案
当我们调用adapt时将触发adaptwb函数,这是缺省的线性网络调整函数。
learnwh是缺省的权重和偏置学习函数。
因此,Widrow-Hoff学习法将会被使用:
[net,a,e,pf]=adapt(net,P,T);
a=0000
e=4577
注意网络的输出全部为0,因为在所有要训练的数据提交前权重没有被更新,如果我们显示权重,我们就会发现:
>>net.IW{1,1}
ans=4.90004.1000
>>net.b{1}
ans=
2.3000
经过了用adapt函数的批处理方式调整,这就和原来不一样了。
现在用train函数来实现批处理方式。
由于Widrow-Hoff规则能够在增加方式和批处理方式中应用,它可以通过adapt和train触发。
我们有好几种算法只能用于批处理方式(特别是Levenberg-Marquardt算法),所以这些算法只能用train触发。
网络用相同的方法建立:
net=newlin([-11;-11],1,0,0.1);
net.IW{1,1}=[00];
net.b{1}=0;
在这种情况下输入向量即能用同步向量矩阵表示也能用异步向量细胞数组表示。
用train函数,任何异步向量细胞数组都会转换成同步向量矩阵。
这是因为网络是静态的,并且因为train总是在批处理精彩文档.
实用标准文案
方式中使用。
因为MATLAB实现同步模式效率更高,所以只要可能总是采用同步模式处理。
P=[1223;2131];
T=[4577];
现在我们开始训练网络。
由于我们只用了一次adapt,我们这里训练它一次。
缺省的线性网络训练函数是trainwb。
learnwh是缺省的权重和偏置学习函数。
因此,我们应该和前面缺省调整函数是adaptwb的例子得到同样的结果。
net.inputWeights{1,1}.learnParam.lr=0.1;
net.biases{1}.learnParam.lr=0.1;
net.trainParam.epochs=1;
net=train(net,P,T);
经过一次训练后,我们显示权重发现:
>>net.IW{1,1}
ans=4.90004.1000
>>net.b{1}
ans=
2.3000
这和用adapt训练出来的结果是一样的。
在静态网络中,adapt函数能够根据输入数据格式的不同应用于增加方式和批处理方式。
如果数据用同步向量矩阵方式输入就用批处理方式训练;如果数据用异步方式输入就用增加方式。
但这对于train函数行不通,无论输入格式如何,它总是采用批处理方式。
动态网络中的增加方式
训练静态网络相对要简单一些。
如果我们用train训练网络,即使输入是异步向量细胞数组,它也精彩文档.
实用标准文案
是转变成同步向量矩阵而采用批处理方式。
如果我们用adapt。
输入格式决定着网络训练方式。
如果传递的是序列,网络用增加方式,如果传递的是同步向量就采用批处理方式。
在动态网络中,批处理方式只能用train完成,特别是当仅有一个训练序列存在时。
为了说明清楚,让我们重新考虑那个带延迟的线性网络。
我们把学习速率设为0.02(当我们采用梯度下降算法时,我们要用比增加方式更小的学习速率,应为所有的分立的梯度都要在决定权重改变步进之前求和)
net=newlin([-11],1,[01],0.02);
net.IW{1,1}=[00];
net.biasConnect=0;
net.trainParam.epochs=1;
Pi={1};
P={234};
T={356};
我们用以前增加方式训练过的那组数据训练,但是这一次我们希望只有在所有数据都提交后才更新权重(批处理方式)。
因为输入是一个序列,网络将用异步模式模拟。
但是权重将用批处理方式更新。
net=train(net,P,T,Pi);
经过一次训练后,权重值为:
>>net.IW{1,1}
ans=0.90000.6200
这里的权重值和我们用增加方式得到的不同。
在增加方式中,通过训练设置,一次训练可以更新权重三次。
在批处理方式中,每次训练只能更新一次。
第三章反向传播网络(BP网络)
精彩文档.
实用标准文案
1.概述
前面介绍了神经网络的结构和模型,在实际应用中,我们用的最广泛的是反向传播网络(BP网络)。
下面就介绍一下BP网络的结构和应用。
BP网络是采用Widrow-Hoff学习算法和非线性可微转移函数的多层网络。
一个典型的BP网络采用的是梯度下降算法,也就是Widrow-Hoff算法所规定的。
backpropagation就是指的为非线性多层网络计算梯度的方法。
现在有许多基本的优化算法,例如变尺度算法和牛顿算法。
神经网络工具箱提供了许多这样的算法。
这一章我们将讨论使用这些规则和这些算法的优缺点。
一个经过训练的BP网络能够根据输入给出合适的结果,虽然这个输入并没有被训练过。
这个特性使得BP网络很适合采用输入/目标对进行训练,而且并不需要把所有可能的输入/目标对都训练过。
为了提高网络的适用性,神经网络工具箱提供了两个特性--规则化和早期停止。
这两个特性和用途我们将在这一章的后面讨论。
这一章还将讨论网络的预处理和后处理技术以提高网络训练效率。
2.基础
网络结构
神经网络的结构前一章已详细讨论过,前馈型BP网络的结构结构和它基本相同,这里就不再详细论述了,这里着重说明以下几点:
1.常用的前馈型BP网络的转移函数有logsig,tansig,有时也会用到线性函数purelin。
当网络的最后一层采用曲线函数时,输出被限制在一个很小的范围内,如果采用线性函数则输出可为任意值。
以上三个函数是BP网络中最常用到的函数,但是如果需要的话你也可以创建其他可微的转移函数。
2.在BP网络中,转移函数可求导是非常重要的,tansig、logsig和purelin都有对应的导函数dtansig、dlogsig和dpurelin。
为了得到更多转移函数的导函数,你可以带字符摜牥癩的转移函数:
精彩文档.
实用标准文案
tansig('deriv')
ans=dtansig
网络构建和初始化
训练前馈网络的第一步是建立网络对象。
函数newff建立一个可训练的前馈网络。
这需要4个输入参数。
第一个参数是一个Rx2的矩阵以定义R个输入向量的最小值和最大值。
第二个参数是一个颟顸每层神经元个数的数组。
第三个参数是包含每层用到的转移函数名称的细胞数组。
最后一个参数是用到的训练函数的名称。
举个例子,下面命令将创建一个二层网络,其网络模型如下图所示。
它的输入是两个元素的向量,第一层有三个神经元,第二层有一个神经元。
第一层的转移函数是tan-sigmoid,输出层的转移函数是linear。
输入向量的第一个元素的范围是-1到2,输入向量的第二个元素的范围是0到5,训练函数是traingd。
net=newff([-12;05],[3,1],{'tansig','purelin'},'traingd');
这个命令建立了网络对象并且初始化了网络权重和偏置,因此网络就可以进行训练了。
我们可能要多次重新初始化权重或者进行自定义的初始化。
下面就是初始化的详细步骤。
在训练前馈网络之前,权重和偏置必须被初始化。
初始化权重和偏置的工作用命令init来实现。
这个函数接收网络对象并初始化权重和偏置后返回网络对象。
下面就是网络如何初始化的:
精彩文档.
实用标准文案
net=init(net);
我们可以通过设定网络参数net.initFcn和net.layer{i}.initFcn这一技巧来初始化一个给定的网络。
net.initFcn用来决定整个网络的初始化函数。
前馈网络的缺省值为initlay,它允许每一层用单独的初始化函数。
设定了net.initFcn,那么参数net.layer{i}.initFcn也要设定用来决定每一层的初始化函数。
对前馈网络来说,有两种不同的初始化方式经常被用到:
initwb和initnw。
initwb函数根据每一层自己的初始化参数(net.inputWeights{i,j}.initFcn)初始化权重矩阵和偏置。
前馈网络的初始化权重通常设为rands,它使权重在-1到1之间随机取值。
这种方式经常用在转换函数是线性函数时。
initnw通常用于转换函数是曲线函数。
它根据Nguyen和Widrow[NgWi90]为层产生初始权重和偏置值,使得每层神经元的活动区域能大致平坦的分布在输入空间。
它比起单纯的给权重和偏置随机赋值有以下优点:
(1)减少神经元的浪费(因为所有神经元的活动区域都在输入空间内)。
(2)有更快的训练速度(因为输入空间的每个区域都在活动的神经元范围中)。
初始化函数被newff所调用。
因此当网络创建时,它根据缺省的参数自动初始化。
init不需要单独的调用。
可是我们可能要重新初始化权重和偏置或者进行自定义的初始化。
例如,我们用newff创建的网络,它缺省用initnw来初始化第一层。
如果我们想要用rands重新初始化第一层的权重和偏置,我们用以下命令:
net.layers{1}.initFcn='initwb';
net.inputWeights{1,1}.initFcn='rands';
net.biases{1,1}.initFcn='rands';
net.biases{2,1}.initFcn='rands';
net=init(net);
网络模拟(SIM)
精彩文档.
实用标准文案
函数sim模拟一个网络。
sim接收网络输入p,网络对象net,返回网络输出a,这里是simuff用来模拟上面建立的带一个输入向量的网络。
p=[1;2];
a=sim(net,p)
a=
-0.1011
(用这段代码得到的输出是不一样的,这是因为网络初始化是随机的。
)
下面调用sim来计算一个同步输入3向量网络的输出:
p=[132;241];
a=sim(net,p)
a=
-0.1011-0.23080.4955
网络训练
一旦网络加权和偏差被初始化,网络就可以开始训练了。
我们能够训练网络来做函数近似(非线性后退),模式结合,或者模式分类。
训练处理需要一套适当的网络操作的例子--网络输入p和目标输出t。
在训练期间网络的加权和偏差不断的把网络性能函数net.performFcn减少到最小。
前馈网络的缺省性能函数是均方误差mse--网络输出和目标输出t之间的均方误差。
这章的余项将描述几个对前馈网络来说不同的训练算法。
所有这些算法都用性能函数的梯度来决定怎样把权重调整到最佳。
梯度由叫做反向传播的技术决定,它要通过网络实现反向计算。
反向传播计算源自使用微积分的链规则。
基本的反向传播算法的权重沿着梯度的负方向移动,这将在下一节讲述。
以后的章节将讲述更复杂的算法以提高收敛速度。
反向传播算法
精彩文档.
实用标准文案
反向传播算法中有许多变量,这一章将讨论其中的一些。
反向传播学习算法最简单的应用是沿着性能函数最速增加的方向--梯度的负方向更新权重和偏置。
这种递归算法可以写成:
xk+1=xk-akgk
这里xk是当前权重和偏置向量,gk是当前梯度,ak是学习速率。
有两种不同的办法实现梯度下降算法:
增加模式和批处理模式。
在增加模式中,网络输入每提交一次,梯度计算一次并更新权重。
在批处理模式中,当所有的输入都被提交后网络才被更新。
下面两节将讨论增加模式和批处理模式。
增加模式训练法(ADAPT)
函数adapt用来训练增加模式的网络,它从训练设置中接受网络对象、网络输入和目标输入,返回训练过的网络对象、用最后的权重和偏置得到的输出和误差。
这里有几个网络参数必须被设置,第一个是net.adaptFcn,它决定使用哪一种增加模式函数,缺省值为adaptwb,这个值允许每一个权重和偏置都指定它自己的函数,这些单个的学习函数由参数net.biases{i,j}.learnFcn、net.inputWeights{i,j}.learnFcn、net.layerWeights{i,j}.learnFcn和GradientDescent(LEARDGD)来决定。
对于基本的梯度最速下降算法,权重和偏置沿着性能函数的梯度的负方向移动。
在这种算法中,单个的权重和偏置的学习函数设定为汜慥湲摧。
下面的命令演示了怎样设置前面建立的前馈函数参数:
net.biases{1,1}.learnFcn='learngd';
net.biases{2,1}.learnFcn='learngd';
net.layerWeights{2,1}.learnFcn='learngd';
net.inputWeights{1,1}.learnFcn='learngd';
函数learngd有一个相关的参数--学习速率lr。
权重和偏置的变化通过梯度的负数乘上学习速率倍数得到。
学习速率越大,步进越大。
如果学习速率太大算法就会变得不稳定。
如果学习速率太小,算法就需要很长的时间才能收敛。
当learnFcn设置为learngd时,就为每一个权重和偏置设置了学习速精彩文档.
实用标准文案
率参数的缺省值,如上面的代码所示,当然你也可以自己按照意愿改变它。
下面的代码演示了把层权重的学习速率设置为0.2。
我们也可以为权重和偏置单独的设置学习速率。
net.layerWeights{2,1}.learnParam.lr=0.2;
为有序训练设置的最后一个参数是net.adaptParam.passes,它决定在训练过程中训练值重复的次数。
这里设置重复次数为200
net.adaptParam.passes=200;
现在我们就可以开始训练网络了。
当然我们要指定输入值和目标值如下所示:
p=[-1-122;0505];
t=[-1-111];
如果我们要在每一次提交输入后都更新权重,那么我们需要将输入矩阵和目标矩阵转变为细胞数组。
每一个细胞都是一个输入或者目标向量。
p=num2cell(p,1);
t=num2cell(t,1);
现在就可以用adapt来实现增加方式训练了:
[net,a,e]=adapt(net,p,t);
训练结束以后,我们就可以模拟网络输出来检验训练质量了。
a=sim(net,p)
a=
[-0.9995][-1.0000][1.0001][1.0000]
带动力的梯度下降法(LEARDGDM)
除了learngd以外,还有一种增加方式算法常被用到,它能提供更快的收敛速度--learngdm,带动量的最速下降法。
动力允许网络不但根据当前梯度而且还能根据误差曲面最近的趋势响应。
就像一个精彩文档.
实用标准文案
低通滤波器一样,动量允许网络忽略误差曲面的小特性。
没有动量,网络又可能在一个局部最小中被卡住。
有了动量网络就能够平滑这样的最小。
动量能够通过把权重变得与上次权重变化的部分和由算法规则得到的新变化的和相同而加入到网络学习中去。
上一次权重变化对动量的影响由一个动量常数来决定,它能够设为0到1之间的任意值。
当动量常数为0时,权重变化之根据梯度得到。
当动量常数为1时新的权重变化等于上次的权重变化,梯度值被忽略了。
Learngdm函数有上面所示的learngd函数触发,除非mc和lr学习参数都被设置了。
由于每一个权重和偏置有它自己的学习参数,每一个权重和偏置都可以用不同的参数。
下面的命令将用lerangdm为前面建立的用增加方式训练的网络设置缺省的学习参数:
net.biases{1,1}.learnFcn='learngdm';
net.biases{2,1}.learnFcn='learngdm';
net.layerWeights{2,1}.learnFcn='learngdm';
net.inputWeights{1,1}.learnFcn='learngdm';
[net,a,e]=adapt(net,p,t);
批处理训练方式
训练的另一种方式是批处理方式,它由函数train触发。
在批处理方式中,当整个训练设置被应用到网络后权重和偏置才被更新。
在每一个训练例子中的计算的梯度加在一起来决定权重和偏置的变化。
批处理梯度下降法(TRAINGD)
与增加方式的学习函数learngd等价的函数是traingd,它是批处理形式中标准的最速下降学习函数。
权重和偏置沿着性能函数的梯度的负方向更新。
如果你希望用批处理最速下降法训练函数,你要设置网络的trainFcn为traingd,并调用train函数。
不像以前章节的学习函数,它们要单独设置权重矩阵和偏置向量,这一次给定的网络只有一个学习函数。
Traingd有几个训练参数:
epochs,show,goal,time,min_grad,max_fail和lr。
这里的学习速率和精彩文档.
实用标准文案
lerangd的意义是一样的。
训练状态将每隔show次显示一次。
其他参数决定训练什么时候结束。
如果训练次数超过epochs,性能函数低于goal,梯度值低于mingrad或者训练时间超过time,训练就会结束。
下面的代码将重建我们以前的网络,然后用批处理最速下降法训练网络。
(注意用批处理方式训练的话所有的输入要设置为矩阵方式)
net=newff([-12;05],[3,1],{'tansig','purelin'},'traingd');
net.trainParam.show=50;
net.trainParam.lr=0.05;
net.trainParam.epochs=300;
net.trainParam.goal=1e-5;
p=[-1-122;0505];
t=[-1-111];
net=train(net,p,t);
TRAINGD,Epoch0/300,MSE1.59423/1e-05,Gradient2.76799/
1e-10
TRAINGD,Epoch50/300,MSE0.00236382/1e-05,Gradient
0.0495292/1e-10
TRAINGD,Epoch100/300,MSE0.000435947/1e-05,Gradient
0.0161202/1e-10
TRAINGD,Epoch150/300,MSE8.68462e-05/1e-05,Gradient
0.00769588/1e-10
TRAINGD,Epoch200/300,MSE1.45042e-05/1e-05,Gradient
精彩文档.
实用标准文案
0.00325667/1e-10
TRAINGD,Epoch211/300,MSE9.64816e-06/1e-05,Gradient
0.00266775/1e-10
TRAINGD,Performancegoalmet.
a=sim(net,p)
a=
-1.0010-0.99891.00180.9985
用nnd12sd1来演示批处理最速下降法的性能。
带动量的批处理梯度下降法(TRAINGDM)
带动量的批处理梯度下降法用训练函数traingdm触发。
这种算法除了两个例外和learmgdm是一致的。
第一.梯度是每一个训练例子中计算的梯度的总和,并且权重和偏置仅仅在训练例子全部提交以后才更新。
第二.如果在给定重复次数中新的性能函数超过了以前重复次数中的性能函数的预定义速率max_perf_inc(典型的是1.04)倍,那么新的权重和偏置就被丢弃,并且动量系数mc就被设为0。
在下面的代码重,我们重建了以前的网络并用带动量的梯度下降算法重新训练。
Traingdm的训练参数和traingd的一样,动量系数mc和性能最大增量max_perf_inc也是如此。
(无论什么时候,只要net.trainFcn倍设为traingdm,训练参数就被设为缺省值。
)
net=newff([-12;05],[3,1],{'tansig','purelin'},'traingdm');
net.trainParam.show=50;
net.trainParam.lr=0.05;
net.trainParam.mc=0.9;
net.trainParam.epochs=300;
精彩文档.
实用标准文案
net.trainParam.goal=1e-5;
p=[-1-122;0505];
t=[-1-111];
net=train(net,p,t);
TRAINGDM,Epoch0/300,MSE3.6913/1e-05,Gradient4.54729/
1e-10
TRAINGDM,Epoch50/300,MSE0.00532188/1e-05,Gradient
0.213222/1e-10
TRAINGDM,Epoch100/300,MSE6.34868e-05/1e-05,Gradient
0.0409749