matlab神经网络使用说明及validation check的作用
- matlab神经网络使用说明
- matlab神经网络工具箱说明
- Neural Network
- Algorithms
- Progress
- Plots
- matlab神经网络中的validation check
- 取消validation check
- matlab神经网络训练过程
matlab神经网络使用说明
当创建神经网络进行训练时,原始数据被自动分成training set、validation set 及test set 三部分。
training set:训练样本数据
validation set:验证样本数据
test set:测试样本数据
这三个数据集是没有重叠的,默认比例为7:1.5:1.5
可以通过设置改变比例分配:
net.divideParam.trainRatio = 80/100;
net.divideParam.valRatio = 0/100;
net.divideParam.testRatio = 20/100;
这三者的区别可以参考:机器学习中的训练集、验证集、测试集
matlab神经网络工具箱说明
转载自:
matlab 神经网络工具箱 nntraintool 详解
其中各参数为:
Neural Network
该部分展示了神经网络的结构,从结构图中可以看出该网络有三个隐含层,神经元个数分别为9个、8个、7个
Algorithms
该部分展示了该网络所使用的训练算法,可以看出
Data Division:该网络采用随机划分的方法将数据集划分为training set、validation set、test set
Training:该网络采用Levenberg–Marquardt算法进行训练
Performance:该网络采用均方误差算法计算误差
Calculations:该网络保存为mex格式
Progress
Epoch:该网络允许的迭代次数最大为1000,实际迭代5次
Time:该网络训练时长为3秒
Performance:该网络的最大误差为0.475,目标误差为0.001,实际误差为0.000520,可在Plots中的Performance中详细查看
Gradient:该网络的最大梯度为1.91,阈值梯度为1 * e -7 ,实际梯度为0.033。可在Plots中的Training State中详细查看
Mu:该网络所使用Levenberg–Marquardt算法中的阻尼因子最小值为0.001,阈值为1* e 10 ,实际值为1* e -6 ,Mu值越大意味着算法收敛效果越好。可在Plots中的Training State中详细查看
Validation Checks:该网络的泛化能力检查标准,实际值为0表示在训练过程中误差在持续降低,若连续6次训练误差无法降低,则结束训练任务。可在Plots中的Training State中详细查看
Plots
Performance:该网络训练过程中的误差变换可视化
Training State:该网络训练过程中的梯度、Mu因子和泛化能力变换等信息的可视化
Regression:该网络训练集、验证集、测试集的回归能力可视化
Plot Interval:图中横坐标的刻度
matlab神经网络中的validation check
验证样本的检查值默认是6,是指在网络利用训练样本进行训练的过程中,验证样本的误差连续6次迭代不再下降,则训练终止(这只是训练终止条件之一,其他的如训练步数,目标误差等,满足任一条件,训练过程都将终止)。
我们可以这样理解,如果随着网络的训练,验证样本的误差已经基本不再减小,甚至增大,那么就没有必要再去训练网络了。因为即使继续训练下去,当我们利用测试样本进行网络测试时,测试样本的误差同样也不会有所改善,甚至会过度拟合。validation checks已经达到设置的值了,所以网络停止训练,即如果网络在连续max_fail epochs后不能提高网络性能,就停止训练。
通常,有三种方法解决这个问题:
- 提高validation checks的数值,比如设置net.trainParam.max_fail = 200,其实,这就是自己糊弄自己,非常不严谨,严重不推荐。训练时候,出现停止这种情况,就是因为被训练的网络出现了问题,已经过拟合,应该停下来。但6,的确,可能,有点小,建议改为10到20之间的数吧?这个需要细细思量一下,一般情况默认就好吧?
- 修改被训练的网络,比如说再加一个隐藏层试试
- 如果是数据太相近的问题,试试选择用输入训练数据的乱序排法,以及分类
我们要明白它为什么要停止。连续6次误差不断增大,说明网络性能越训练越差。这可能是两方面原因:
- 过拟合。网络学习得太好了,反而泛化能力下降。
- 网络规模不够大,信息存储能力不够强,原先学习的知识又被新样本抹去了,导致网络性能无法提升。
要解决这个问题:
- 如果要改变validation的验证次数,可以用这个语句net.trainParam.max_fail = 20;
- 或者是增多隐节点或隐层数。
另外,提前停止的网络虽然陷入局优,但不一定就不能用吧,看一下实际效果;
一般来说,不下降就是增大,不可能误差不变。数据少就降低隐层节点数。
取消validation check
加入如下参数,可以取消validation check功能
net.divideFcn =''
但是这个方法对于网络的训练精度提高和输出的逼近程度没有显著改善
matlab神经网络训练过程
在训练时,用training训练,每训练一次,系统自动会将validation set中的样本数据输入神经网络进行验证,在validation set输入后会得出一个误差(不是网络的训练误差,而是验证样本数据输入后得到的输出误差,可能是均方误差),而此前对validation set会设置一个步数,比如默认是6echo,则系统判断这个误差是否在连续6次检验后不下降,如果不下降或者甚至上升,说明training set训练的误差已经不再减小,没有更好的效果了,这时再训练就没必要了,就停止训练,不然可能陷入过学习。所以validation set有个设置步数,就是起这个作用。
参考:
http://blog.sina.com.cn/s/blog_b0ae46ad0102whmo.html
https://www.ilovematlab.cn/thread-68797-1-1.html
matlab 神经网络工具箱 nntraintool 详解