一次并更新权重。在批处理模式中,当所有的输入都被提交后网络才被更新。下面两节将讨论增加模式和批处理模式。
增加模式训练法(ADAPT)
函数adapt用来训练增加模式的网络,它从训练设置中接受网络对象、网络输入和目标输入,返回训练过的网络对象、用最后的权重和偏置得到的输出和误差。
这里有几个网络参数必须被设置,第一个是net.adaptFcn,它决定使用哪一种增加模式函数,缺省值为adaptwb,这个值允许每一个权重和偏置都指定它自己的函数,这些单个的学习函
数
由
参
数
net.biases{i,j}.learnFcn
、
net.inputWeights{i,j}.learnFcn、 net.layerWeights{i,j}.learnFcn和Gradient Descent (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 -1 2 2;0 5 0 5];
t = [-1 -1 1 1];
如果我们要在每一次提交输入后都更新权重,那么我们需要将输入矩阵和目标矩阵转变为细胞数组。每一个细胞都是一个输入或者目标向量。
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([-1 2; 0 5],[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 -1 2 2;0 5 0 5]; t = [-1 -1 1 1]; net=train(net,p,t);
TRAINGD, Epoch 0/300, MSE 1.59423/1e-05, Gradient 2.76799/ 1e-10
TRAINGD, Epoch 50/300, MSE 0.00236382/1e-05, Gradient
0.0495292/1e-10
TRAINGD, Epoch 100/300, MSE 0.000435947/1e-05, Gradient 0.0161202/1e-10
TRAINGD, Epoch 150/300, MSE 8.68462e-05/1e-05, Gradient 0.00769588/1e-10
TRAINGD, Epoch 200/300, MSE 1.45042e-05/1e-05, Gradient 0.00325667/1e-10
TRAINGD, Epoch 211/300, MSE 9.64816e-06/1e-05, Gradient 0.00266775/1e-10
TRAINGD, Performance goal met. a = sim(net,p) a =
-1.0010 -0.9989 1.0018 0.9985
用nnd12sd1来演示批处理最速下降法的性能。 带动量的批处理梯度下降法(TRAINGDM)
带动量的批处理梯度下降法用训练函数traingdm触发。这种算法除了两个例外和learmgdm是一致的。第一.梯度是每一个训练例子中计算的梯度的总和,并且权重和偏置仅仅在训练例子全部提交以后才更新。第二.如果在给定重复次数中新的性能函数超过了以前重复次数中的性能函数的预定义速率max_perf_inc(典型的是1.04)倍,那么新的权重和偏置就被丢弃,并且动量系数mc就被设为0。
在下面的代码重,我们重建了以前的网络并用带动量的梯度下降算法重新训练。Traingdm的训练参数和traingd的一样,动量系数mc和性能最大增量max_perf_inc也是如此。(无论什么时候,只要net.trainFcn倍设为traingdm,训练参数就被设为缺省值。)
net=newff([-1 2; 0 5],[3,1],{'tansig','purelin'},'traingdm'); net.trainParam.show = 50; net.trainParam.lr = 0.05;
相关推荐: