机器学习初级篇3——过拟合问题
拟合与正则化问题的理解
一.几个基本的概念
对机器学习模型而言,最糟糕的两种情况无非是构建无用的知识体系,或是从训练数据集中一无所获。在机器学习理论中,这两种现象分别被称为过拟合和欠拟合。如图中,则是我们理想的模型曲线。
1.过拟合:过拟合(overfitting),也叫高方差(variance)。
过拟合是指过分依赖训练数据。具体的过拟合是指学习的模型包含的参数太多,以至于出现对已知数据预测的很好,但对未知数据预测的很差的现象;模型过拟合等价于模型泛化能力差,如图右1。一个过拟合的模型具有高方差和低偏差。
2.欠拟合: 欠拟合(underfitting),或者叫作叫做高偏差(bias)。
欠拟合是指未能学习训练数据中的关系。在训练数据中,被提取的特征比较少,导致训练出来的模型不能很好地匹配,表现得很差。如图左1所示。欠拟合意味着低方差和高偏差。
3.泛化性:泛化是指一个假设模型能够应用到新样本的能力。
4.高偏差与高方差
偏差是指我们忽略了多少数据,而方差是指我们的模型对数据的依赖程度。
高偏差:说如果用线性回归这个算法去拟合训练数据,那么该算法实际上会产生一个非常大的偏差或者说存在一个很强的偏见。
高方差:如果我们拟合一个高阶多项式,那么这个函数能很好的拟合训练集(能拟合几乎所有的训练数据),但这也就面临函数可能太过庞大的问题,变量太多。
偏差:是指一个模型的在不同训练集上的平均性能和最优模型的差异。偏差可以用来衡量一个模型的拟合能力。偏差越大,预测值平均性能越偏离最优模型。偏差衡量模型的预测能力,对象是一个在不同训练集上模型,形容这个模型平均性能对最优模型的预测能力。
方差:( variance)描述的是 一个模型在不同训练集上的差异,描述的是一个模型在不同训练集之间的差异,表示模型的泛化能力,方差越小,模型的泛化能力越强。可以用来衡量一个模型是否容易过拟合。
预测值的变化范围,离散程度,也就是离其期望值的距离。方差越大,预测结果数据的分布越散。方差用于衡量一个模型在不同训练集之间的关系,和最优模型无关。对象是不同训练集上的一个模型,表示选取不同的训练集,得出的模型之间的差异性。
记住:方差和偏差都是衡量模型的,方差表示选取不同的训练集,训练出模型的差异有多大,而偏差是指一个模型在不同训练集上的平均性能和最优模型的差异。
假设上面打靶图中的红点是真实值,每一个蓝色的点代表了一个根据不同的训练集训练出一个训练模型的预测数据,就是选取不同的训练集,训练出不一样的模型(不一样的模型指的是假设的模型结构一样,但是选取不同的训练集,训练出不同的模型参数,例如:模型都是y=ax3+bx+c,但是选取不同的训练集,模型1:y=0.5x3+2x+3,模型2:y=x^3+5x+2),每一个蓝点代表某一个训练模型对红点的预测值,这样说就很容易理解力吧。
分析上面的四幅图,左上是低偏差,低方差,因为首先每个模型预测的点都相距很近,所以选取不同的训练集,预测出他们模型之间的差异比较小,所以每个模型的方差比较低,其次对于每一个的模型,他们预测的值和红点之间的距离很近,准确率很高,偏差很小,所以他们是低偏差的。右上是低偏差,高方差,因为首先每个模型预测的点都相距很离散,所以选取不同的训练集,预测出他们模型之间的差异比较大,所以每个模型的方差比较高,其次对于每一个的模型,他们预测的值准确率很高,结果比较集中,偏差比较小,所以他们是低偏差的。左下是高偏差,低方差,因为首先每个模型预测的点都相距很近,所以选取不同的训练集,预测出他们模型之间的差异比较小,所以每个模型的方差比较小,其次对于每一个的模型,他们预测的值准确率很差,离红心点比较远,偏差比较大,所以他们是高偏差的。右下是高偏差,高方差,因为首先每个模型预测的点都相距很离散,所以选取不同的训练集,预测出他们模型之间的差异比较大,所以每个模型的方差比较大,其次对于每一个的模型,他们预测的值准确率很差,离红心点比较远,偏差比较大,所以他们是高偏差的。
当你的训练误差和交叉验证误差或测试误差都很大,且值差不多时,是处于高偏差,低方差,欠拟合状态,需要增加多项式的次数来解决。
当你的训练误差和交叉验证误差差距很大,且测试集误差很小,验证误差很大,是处于低偏差,高方差,过拟合状态,需要减少多项式的次数或者利用正则化来解决。
二.过拟合产生的原因
过拟合的根本原因是特征维度过多,模型假设过于复杂,参数过多,训练数据过少,噪声过多,导致拟合的函数完美的预测训练集,但对新数据的测试集预测结果差。 过度的拟合了训练数据,而没有考虑到泛化能力。
简单来说原因就是:数据太少+模型太复杂 。
在对模型进行训练时,有可能遇到训练数据不够,即训练数据无法对整个数据的分布进行估计的时候,或者在对模型进行过度训练(overtraining)时,常常会导致模型的过拟合(overfitting)。这里总结一下过拟合产生的具体原因:
-
训练集的数量级和模型的复杂度不匹配。训练集的数量级要小于模型的复杂度;
-
训练集和测试集特征分布不一致;
-
样本里的噪音数据干扰过大,大到模型过分记住了噪音特征,反而忽略了真实的输入输出间的关系;
-
权值学习迭代次数足够多(Overtraining),拟合了训练数据中的噪声和训练样例中没有代表性的特征。
三.过拟合的应对的解决措施
要解决过拟合问题,其方法主要包括:(1)减少特征维度;(2)正则化,降低参数值。
具体方法有:
(1)获取更多数据 :从数据源头获取更多数据;数据增强(Data Augmentation)
(2)使用合适的模型:减少网络的层数、神经元个数等均可以限制网络的拟合能力;
(3)dropout ;
(4)正则化,在训练的时候限制权值变大;
(5)限制训练时间;通过评估测试;
(6)增加噪声 Noise: 输入时+权重上(高斯初始化) ;
(7)数据清洗(data ckeaning/Pruning):将错误的label 纠正或者删除错误的数据。
(8)结合多种模型: Bagging用不同的模型拟合不同部分的训练集;Boosting只使用简单的神经网络;
如何处理过拟合?
1.L1/L2正则化
1.1 L1/L2概念
L1和L2是正则化项,又叫做惩罚项,是为了限制模型的参数,防止模型过拟合而加在损失函数后面的一项。
L1正则化: 是指权值向量w中各个元素的绝对值之和,通常表示为∣∣w∣∣1;L1正则化经常被称作Lasso回归。
L2正则化: 是指权值向量w中各个元素的平方和然后再求平方根,通常表示为∣∣w∣∣2 ;L2正则化经常被称作权重衰减(weight decay)和岭回归。
并且,我们一般都会在L1/L2正则化项之前添加一个系数。
1.2 L1/L2作用
L1正则化的解具有稀疏性,可用于特征选择。
L2正则化的解都比较小,抗扰动能力强。
实现参数的稀疏有什么好处?
因为参数的稀疏,在一定程度上实现了特征的选择。一般而言,大部分特征对模型是没有贡献的。这些没有用的特征虽然可以减少训练集上的误差,但是对测试集的样本,反而会产生干扰。稀疏参数的引入,可以将那些无用的特征的权重置为0。
抗扰动能力强是什么意思?
拟合过程中通常都倾向于让权值尽可能小,最后构造一个所有参数都比较小的模型。因为一般认为参数值小的模型比较简单,能适应不同的数据集,也在一定程度上避免了过拟合现象。可以设想一下对于一个线性回归方程,若参数很大,那么只要数据偏移一点点,就会对结果造成很大的影响;但如果参数足够小,数据偏移得多一点也不会对结果造成什么影响,专业一点的说法是『抗扰动能力强』。
1.3 L1/L2为什么可以避免过拟合?
加入正则化项就是在原来目标函数的基础上加入了约束。当目标函数的等高线和L1,L2正则化损失函数第一次相交时,得到最优解。
1.3.1 L1正则化
L1正则化项约束后的解空间是多边形,这些多边形的角和目标函数的接触机会远大于其他部分。就会造成最优值出现在坐标轴上,因此就会导致某一维的权重为0 ,产生稀疏权重矩阵,进而防止过拟合。
1.3.2 L2正则化
L2正则化项约束后的解空间是圆形,图像上的棱角圆滑了很多。一般最优值不会在坐标轴上出现。在最小化正则项时,参数不断趋向于0,最后得到的就是很小的参数。
2. 数据增强
数据增强就是获取和使用更多的数据集。对于解决过拟合的办法就是给与足够多的数据集,让模型在更可能多的数据上进行“观察”和拟合,从而不断修正自己。然而事实上,收集无限多的数据集几乎是不可能的,因此一个常用的办法就是调整已有的数据,添加大量的“噪音”,或者对图像进行锐化、旋转、明暗度调整等优化。
3. dropout
L1、L2正则化是通过修改loss function来实现的,而dropout则是通过修改神经网络本身来实现的,它是在训练网络时用的一种技巧(trike).运用了dropout的训练过程,相当于训练了非常多个仅仅有部分隐层单元的神经网络,每个这种半数网络,都能够给出一个分类结果,这些结果有的是正确的,有的是错误的。随着训练的进行,大部分半数网络都能够给出正确的分类结果。那么少数的错误分类结果就不会对最终结果造成大的影响。并且dropout通过减少神经元之间复杂的共适应关系,从而提高了模型的泛化能力。
4. early stopping
在每一个Epoch结束时(一个Epoch集为对所有的训练数据的一轮遍历)计算validation data的accuracy,当accuracy不再提高时,就停止训练。那么该做法的一个重点便是怎样才认为validation accurary不再提高了呢?并不是说validation accuracy一降下来便认为不再提高了,因为可能经过这个Epoch后,accuracy降低了,但是随后的Epoch又让accuracy又上去了,所以不能根据一两次的连续降低就判断不再提高。一般的做法是,在训练的过程中,记录到目前为止最好的validation accuracy,当连续10次Epoch(或者更多次)没达到最佳accuracy时,则可以认为accuracy不再提高了。此时便可以停止迭代了(Early Stopping)。