为了得到一致假设而使假设变得过度复杂称为过拟合(overfitting),过拟合表现在训练好的模型在训练集上效果很好,但是在测试集上效果差。也就是说模型的泛化能力弱。在很多问题中,我们费心费力收集到的数据集并不能穷尽所有的状态,而且一般训练得到的模型被用来预测未知数据的结果,模型虽然在训练集上效果很好,但是在实际应用中效果差,就说明这个模型训练的并不是很成功,还需要改进。就譬如下方的图像中,左边黑色直线在一定程度拟合数据排列,而蓝紫色的曲线就是照顾到每一个样本点,曲线弯弯折折,属于过拟合;右边黑色的曲线就能把红蓝两种数据点进行很好的分类,过拟合的绿色虽然在此数据上能完美分开两类数据点,可是对于一个新的数据集,其适应能力远不如黑色的曲线。
过拟合是机器学习面临的关键障碍,各类学习算法都必然带有一些针对过拟合的措施;然而必须认识到,过拟合是无法彻底避免的,我们所做的只是“缓解”,或者说减少其风险。那么如何解决过拟合?下面介绍几种方法。
1. 数据集扩增(Data Augmentation)
众所周知,更多的数据往往胜过一个更好的模型。就好比盲人摸象,不足够的数据让每个人对大象的认识都不同,学习太过片面。更多的数据能够让模型学习的更加全面,然而,在现实世界中,由于条件的限制,而不能够收集到更多的数据。所以,往往在这个时候,就需要采用一些计算的方式与策略在原有数据集上进行手脚,以获得更多的数据。数据集扩增就是要得到更多符合要求的数据。
在物体分类(object recognition)问题中,数据扩增已经成为一项特殊的有效的技术。物体在图像中的位置、姿态、尺度,整体图片敏感度等都不会影响分类结果,所以我们就可以通过图像平移、翻转、缩放、切割等手段将数据库成倍扩充。或者在语音识别(speech recognition)中,加入噪音也被看做是一种数据扩增方式。
2. 改进模型
过拟合主要有两个原因造成的,数据太少和模型太复杂,数据扩增增加数据量,下面我们通过使用合适复杂度的模型来防止过拟合问题,让其能够学习到真正的规则。对于模型复杂,最简单暴力的做法就是减少网络的层数和神经元的个数,但是一般不是很提倡这种做法,是因为人为并不能很好掌控删减的程度,因此下面介绍几种高效的方法。
2.1 Early Stopping
如下图所示,在对模型训练的时候,模型在训练集上的训练误差(training error)随着时间会一直减少,然而模型在验证集上的验证误差会减少到一定程度后逐步上升,形成一个非对称的U型曲线。对模型进行训练的过程即是对模型的参数进行更新的过程,参数更新会用到一些优化算法,为了能够得到最低测试误差时的参数,Early Stopping的做法就是运行优化方法直到若干次在验证集上的验证误差没有提升时候停止。
一般做法是,在训练的过程中,记录到目前为止最好的验证正确率(validation accuracy),当连续10次Epoch,validation accuracy没有达到最佳Accuracy,则认为accuracy不再有所提升,此时就可以停止迭代了。
**2.2 正则化(regularization)**
损失函数分为经验风险损失函数和结构风险损失函数,结构风险损失函数就是经验损失函数+表示模型复杂度的正则化,正则项通常选择L1或者L2正则化。结构风险损失函数能够有效地防止过拟合。
- L1正则化是指权值向量 ω \omega ω中各个元素的绝对值之和,通常表示为 ∥ ω ∥ 1 \left \| \omega \right \|_{1} ∥