Task4 模型训练与验证
(一)过拟合与欠拟合
在模型的训练过程中,模型只能利用训练数据来进行训练,模型并不能接触到测试集上的样本。因此模型如果将训练集学的过好,模型就会记住训练样本的细节,导致模型在测试集的泛化效果较差,这种现象称为过拟合(Overfitting)。与过拟合相对应的是欠拟合(Underfitting),即模型在训练集上的拟合效果较差。
欠拟合:根本原因是特征维度过少,模型过于简单,导致拟合的函数无法满足训练集,误差较大; 解决方法:增加特征维度,增加训练数据; 过拟合:根本原因是特征维度过多,模型假设过于复杂,参数过多,训练数据过少,噪声过多,导致拟合的函数完美的预测训练集,但对新数据的测试集预测结果差。 过度的拟合了训练数据,而没有考虑到泛化能力。
在训练数据不够多时,或者over training时,常常会导致过拟合(overfitting)。当学习器把训练样本学得"太好"了的时候,很可能已经把训练样本自身的一些特点当作了所有潜在样本都会具有的一般性质,这样就会导致泛化性能下降。
过拟合的原因
噪声:永远没有完美的数据,数据里的噪声会影响模型的学习。
假规律:样本量较少时,学习器却很复杂时,学习器会过度解读学到很多假的但是在这少数几个样本拥有的规律。
防止过拟合的方法
减少过拟合总结:过拟合主要是有两个原因造成的:数据太少+模型太复杂
(1)获取更多数据 :从数据源头获取更多数据;数据增强(Data Augmentation)(2)使用合适的模型:减少网络的层数、神经元个数等均可以限制网络的拟合能力;(3)dropout (4)正则化,在训练的时候限制权值变大;(5)限制训练时间;通过评估测试;(6)增加噪声 Noise: 输入时+权重上(高斯初始化)(7)数据清洗(data ckeaning/Pruning):将错误的label 纠正或者删除错误的数据。(8)结合多种模型: Bagging用不同的模型拟合不同部分的训练集;Boosting只使用简单的神经网络;
防止过拟合方法主要有:
- 正则化(Regularization)(L1和L2)
- 数据增强(Data augmentation),增加训练数据样本:能够在原始数据上做些改动,得到很多其它的数据,以图片数据集举例,能够做各种变换,如:将原始图片旋转一个小角度;加入随机噪声;一些有弹性的畸变;截取(crop)原始图片的一部分
- Dropout:L1、L2正则化是通过改动代价函数来实现的,而Dropout则是通过改动神经网络本身来实现的。在训练开始时,随机地“删除”一部分的隐层单元,视它们为不存在;在第二次迭代中,也用相同的方法,每一次迭代都是“随机”地去删掉一部分,直至训练结束。
- Early stopping:Early stopping便是一种迭代次数截断的方法来防止过拟合的方法,即在模型对训练数据集迭代收敛之前停止迭代来防止过拟合。 具体做法是,在每一个Epoch结束时(一个Epoch集为对所有的训练数据的一轮遍历)计算validation data的accuracy,当accuracy不再提高时,就停止训练。一般的做法是,在训练的过程中,记录到目前为止最好的validation accuracy。
正则化就是在损失函数后加上一个正则化项(惩罚项),其实就是常说的结构风险最小化策略,即经验风险(损失函数)加上正则化。一般模型越复杂,正则化值越大。正则化其实就是带约束条件的优化问题。过拟合产生的原因通常是因为参数比较大导致的,通过添加正则项,假设某个参数比较大,目标函数加上正则项后,也就会变大,因此该参数就不是最优解了。
L1正则项表示:
L2正则项表示:
L1正则化(L1范数)指的是权重参数W的各项元素绝对值之和;L2(L2范数)权重参数W的各项元素的平方和的开方。
L1正则化可以产生稀疏权重矩阵,即大部分w为0,只有少数w非0,可以用于特征选择L2正则化可以防止模型过拟合。L1会趋向于产生少量的特征,而其他的特征都是0,而L2会选择更多的特征,这些特征都会接近于0。
对于线性模型,譬如线性回归、逻辑回归,可以使用简单有效的参数范数模型进行正则化。许多正则化方法通过对目标函数J添加惩罚项,其中α也被称为惩罚系数,限制模型的学习能力:
对于神经网络中,参数通常是包括权值w和偏置b,而我们通常对w做惩罚而不对偏置b做处理,这是因为不对b进行处理也不会有太大的影响。
(二)数据集的划分
在一般情况下,参赛选手也可以自己在本地划分出一个验证集出来,进行本地验证。训练集、验证集和测试集分别有不同的作用:
-
训练集(Train Set):模型用于训练和调整模型参数;
-
验证集(Validation Set):用来验证模型精度和调整模型超参数;
-
测试集(Test Set):验证模型的泛化能力。
因为训练集和验证集是分开的,所以模型在验证集上面的精度在一定程度上可以反映模型的泛化能力。在划分验证集的时候,需要注意验证集的分布应该与测试集尽量保持一致,不然模型在验证集上的精度就失去了指导意义。
既然验证集这么重要,那么如何划分本地验证集呢。在一些比赛中,赛题方会给定验证集;如果赛题方没有给定验证集,那么就需要从训练集中拆分一部分得到验证集。验证集的划分有如下几种方式:
-
留出法(Hold-Out)
直接将训练集划分成两部分,新的训练集和验证集。这种划分方式的优点是最为直接简单;缺点是只得到了一份验证集,有可能导致模型在验证集上过拟合。留出法应用场景是数据量比较大的情况。
-
交叉验证法(Cross Validation,CV)
将训练集划分成K份,将其中的K-1份作为训练集,剩余的1份作为验证集,循环K训练。这种划分方式是所有的训练集都是验证集,最终模型验证精度是K份平均得到。这种方式的优点是验证集精度比较可靠,训练K次可以得到K个有多样性差异的模型;CV验证的缺点是需要训练K次,不适合数据量很大的情况。
-
自助采样法(BootStrap)
通过有放回的采样方式得到新的训练集和验证集,每次的训练集和验证集都是有区别的。这种划分方式一般适用于数据量较小的情况。
在现有的数据比赛中一般采用的划分方法是留出法和交叉验证法。如果数据量比较大,留出法还是比较合适的。当然任何的验证集的划分得到的验证集都是要保证训练集-验证集-测试集的分布是一致的,所以如果不管划分何种的划分方式都是需要注意的。
这里的分布一般指的是与标签相关的统计分布,比如在分类任务中“分布”指的是标签的类别分布,训练集-验证集-测试集的类别分布情况应该大体一致;如果标签是带有时序信息,则验证集和测试集的时间间隔应该保持一致。