本节主要学习BP中几个容易混绕的概念和问题:什么是网络的泛化能力?过拟合是什么,怎么处理?学习速率有什么作用?神经网络的权值和阈值分别是个什么概念?用BP逼近非线性函数,如何提高训练精度?
什么是网络的泛化能力?
一个神经网路是否优良,与传统最小二乘之类的拟合评价不同(主要依据残差,拟合优度等),不是体现在其对已有的数据拟合能力上,而是对后来的预测能力,既泛化能力。
网络的预测能力(也称泛化能力、推广能力)与训练能力(也称逼近能力、学习能力)的矛盾。一般情况下,训练能力差时,预测能力也差,并且一定程度上,随训练能力地提高,预测能力也提高。但这种趋势有一个极限,当达到此极限时,随训练能力的提高,预测能力反而下降,即出现所谓“过拟合”现象。此时,网络学习了过多的样本细节,而不能反映样本内含的规律。
过拟合是什么,怎么处理?
神经网络计算不能一味地追求训练误差最小,这样很容易出现“过拟合”现象,只要能够实时检测误差率的变化就可以确定最佳的训练次数,比如15000次左右的学习次数,如果你不观察,设成500000次学习,不仅需要很长时间来跑,而且最后结果肯定令人大失所望。
避免过拟合的一种方法是:在数据输入中,给训练的数据分类,分为正常训练用、变量数据、测试数据,在后面节将讲到如何进行这种分类。
其中变量数据,在网络训练中,起到的作用就是防止过拟合状态。
学习速率有什么作用?
学习速率这个参数可以控制能量函数的步幅,并且如果设为自动调整的话,可以在误差率经过快速下降后,将学习速率变慢,从而增加BPNN的稳定性。
此时训练方法采用
net.trainFcn = 'traingda'; % 变学习率梯度下降算法
net.trainFcn = 'traingdx'; % 变学习率动量梯度下降算法
可以定义一个变动的学习速率,如
p = [-1 -1 2 2; 0 5 0 5];
t = [-1 -1 1 1];
net = newff(p,t,3,{},'traingda');
net.trainParam.lr = 0.05;
net.trainParam.lr_inc = 1.05;
net = train(net,p,t);
y = sim(net,p)
在后面的拟合例题中,我们也将用到学习速率这个参数。
神经网络的权值和阈值分别是个什么概念?
第一节中,我们已经谈到了权值和阀值的概念。这里我们更深入的说明一下,因为他们很重要,关系到网络最后的结果。权值和阈值是神经元之间的连接,将数据输入计算出一个输出,然后与实际输出比较,误差反传,不断调整权值和阈值。
假如下面两个点属于不同的类,须设计分类器将他们分开
p1=[1 1 -1]’;
p2=[1 -1 -1]’;
这里用单层神经元感知器,假设初始权值
w=[0.2 0.2 0.3]
同时假设初始阀值
b=-0.3
输出 a1 a2
a1=hardlims(w*p1+b)
a2=hardlims(w*p2+b)
如果不能分开,还须不断调整w,b
用BP逼近非线性函数,如何提高训练精度
(1)调整网络结构
增加网络的层数可以进一步降低误差,提高精度但会使网络复杂化,从而增加网络的训练时间。精度的提高实际上也可以通过增加隐层神经元的数目来获得,其效果更容易观察和掌握,所以应优先考虑。
(2)初始值选取
为了使误差尽可能小 ,需要合理选择初始权重和偏置,如果太大就容易陷入饱和区,导致停顿 。一般应选为均匀分布的小数,介于 (-1,1) 【即归一化处理】。
(3)学习速率调整
学习速率的选取很重要 ,大了可能导致系统不稳定,小了会导致训练周期过长、收敛慢,达不到要求的误差。一般倾向于选取较小的学习速率以保持系统稳定,通过观察误差下降曲线来判断。下降较快说明学习率比较合适,若有较大振荡则说明学习率偏大。同时,由于网络规模大小的不同,学习率选择应当针对其进行调整。采用变学习速率的方案,令学习速率随学习进展而逐步减少,可收到良好的效果。
(4)期望误差
期望误差当然希望越小越好,但是也要有合适值。