训练集:用于模型拟合的数据样本。
验证集:是模型训练过程中单独留出的样本集,它可以用于调整模型的超参数和用于对模型的能力进行初步评估。 在神经网络中, 我们用验证数据集去寻找最优的网络深度(number of hidden layers),或者决定反向传播算法的停止点或者在神经网络中选择隐藏层神经元的数量; 在普通的机器学习中常用的交叉验证(Cross Validation) 就是把训练数据集本身再细分成不同的验证数据集去训练模型。
测试集:用来评估模最终模型的泛化能力。但不能作为调参、选择特征等算法相关的选择的依据。
训练集-----------学生的课本;学生 根据课本里的内容来掌握知识。
验证集------------作业,通过作业可以知道 不同学生学习情况、进步的速度快慢。
测试集-----------考试,考的题是平常都没有见过,考察学生举一反三的能力。
传统上,一般三者切分的比例是:6:2:2,验证集并不是必须的。
交叉验证法
交叉验证法的作用就是尝试利用不同的训练集/验证集划分来对模型做多组不同的训练/验证,来应对单独测试结果过于片面以及训练数据不足的问题。(就像通过多次考试,才通知哪些学生是比较比较牛B的)
交叉验证的做法就是将数据集粗略地分为比较均等不相交的k份,即
D
然后取其中的一份进行测试,另外的k-1份进行训练,然后求得error的平均值作为最终的评价。
举个例子:假设建立一个BP神经网络,对于隐含层的节点数目,我们并没有很好的方法去确定。此时,一般将节点数设定为某一具体的值,通过训练集训练出相应的参数后,再由交叉验证集去检测该模型的误差;
然后再改变节点数,重复上述过程,直到交叉验证误差最小。
b) 交叉验证算法的具体步骤如下:
1.随机将训练数据等分成k份,S1, S2, …, Sk。
2.对于每一个模型Mi,算法执行k次,每次选择一个Sj作为验证集,而其它作为训练集来训练模型Mi,把训练得到的模型在Sj上进行测试,这样一来,每次都会得到一个误差E,最后对k次得到的误差求平均,就可以得到模型Mi的泛化误差。
3.算法选择具有最小泛化误差的模型作为最终模型,并且在整个训练集上再次训练该模型,从而得到最终的模型。
K折交叉验证,其主要 的目的是为了选择不同的模型类型(比如一次线性模型、非线性模型、),而不是为了选择具体模型的具体参数。比如在BP神经网络中,其目的主要为了选择模型的层数、神经元的激活函数、每层模型的神经元个数(即所谓的超参数)。每一层网络神经元连接的最终权重是在模型选择(即K折交叉验证)之后,由全部的训练数据重新训练。
目的在模型选择,而非模型训练调整参数。
c) K值的选择
K值的选取是一个偏差与方差的权衡:
K=1时,所有数据用于训练,容易过拟合;
K=N时,相当于留一法LOOCV (Leave-one-out cross-validation ).;
通常建议K=10.
模型训练与验证
调参
调参的目的:
- 当网络出现训练错误的时候,需要调整参数(网络不收敛、部分收敛等)
- 可以训练但是需要提高整个网络的训练准确度
方法:
-
完全不收敛:
检测自己的数据是否存在可以学习的信息,这个数据集中的数值是否泛化(防止过大或过小的数值破坏学习)。
如果是错误的数据则需要去再次获得正确的数据,如果是数据的数值异常可以使用zscore函数来解决这个问题。
如果是网络的错误,则希望调整网络,包括:网络深度,非线性程度,分类器的种类等等。 -
部分收敛:
underfitting:
增加网络的复杂度(深度),
降低learning rate,
优化数据集,
增加网络的非线性度(ReLu),
采用batch normalization,
overfitting:
丰富数据,
增加网络的稀疏度,
降低网络的复杂度(深度),
L1 regularization,
L2 regulariztion,
添加Dropout,
Early stopping,
适当降低Learning rate,
适当减少epoch的次数, -
全部收敛:
调整方法就是保持其他参数不变,只调整一个参数。这里需要调整的参数会有:
learning rate,
minibatch size,
epoch,
filter size,
number of filter
网络调参的主方向其实只有两种:1. 更深层的网络, 2. 更加的复杂的结构。
调参的过程必须是有规律的,切忌不可乱调。
参考文献:
https://blog.csdn.net/kieven2008/article/details/81582591
https://blog.csdn.net/qq_20259459/article/details/70316511