开始我是很难弄懂什么是过拟合,什么是欠拟合以及造成两者的各自原因以及相应的解决办法,学习了一段时间机器学习和深度学习后,分享下自己的观点,方便初学者能很好很形象地理解上面的问题。

无论在机器学习还是深度学习建模当中都可能会遇到两种最常见结果,一种叫过拟合(over-fitting )另外一种叫欠拟合(under-fitting)。

首先谈谈什么是过拟合呢?什么又是欠拟合呢?网上很直接的图片理解如下:

过拟合和欠拟合-LMLPHP

所谓过拟合(over-fitting)其实就是所建的机器学习模型或者是深度学习模型在训练样本中表现得过于优越,导致在验证数据集以及测试数据集中表现不佳。过拟合就是学到了很多没必要的特征,比如你说的长得像猫的狗,和长得像狗的猫,其实这只是特例,但神经网络为了更好的降低Loss,就只能被迫学习这些特征用来区分猫和狗。但是学习的太过了,(举个例子:一个男人穿着蓝色的衣服,神经网络可能把是否穿蓝色衣服作为区分男人女人的特征,这就是过拟合)遇到了新样本这些错误的特征就没有什么用了。所以过拟合就是表现为训练的时候效果很好(因为神经网络已经学到了很多有用没用的特征),但是在测试样本上的效果就很差(有的特征完全没用啊,完全就是为了降低loss而得出来的特征)。至于为什么会产生过拟合,一般是因为参数过多,为了降低loss(神经网络的任务就是为了最小化loss),后者样本过少。总之就是参数/样本的比太大。

所谓欠拟合呢(under-fitting)?相对过拟合欠拟合还是比较容易理解。还是拿刚才的模型来说,可能训练样本被提取的特征比较少,导致训练出来的模型不能很好地匹配,表现得很差,甚至样本本身都无法高效的识别。

那么问题来了,我们需要怎么去解决过拟合和欠拟合的问题呢??

现在常用的判断方法是从训练集中随机选一部分作为一个验证集,采用K折交叉验证的方式,用训练集训练的同时在验证集上测试算法效果。在缺少有效预防欠拟合和过拟合措施的情况下,随着模型拟合能力的增强,错误率在训练集上逐渐减小,而在验证集上先减小后增大;当两者的误差率都较大时,处于欠拟合状态(high bias, low variance);当验证集误差率达到最低点时,说明拟合效果最好,由最低点增大时,处与过拟合状态(high variance, low bias)。下图的横坐标用拟合函数多项式的阶数笼统地表征模型拟合能力:
过拟合和欠拟合-LMLPHP

过拟合:

首先我们从上面我们可以知道,造成过拟合的原因有可以归结为:参数过多。那么我们需要做的事情就是减少参数,这里有两种办法:

1、回想下我们的模型,假如我们采用梯度下降算法将模型中的损失函数不断减少,那么最终我们会在一定范围内求出最优解,最后损失函数不断趋近0。那么我们可以在所定义的损失函数后面加入一项永不为0的部分,那么最后经过不断优化损失函数还是会存在。其实这就是所谓的“正则化”。

下面这张图片就是加入了正则化(regulation)之后的损失函数。这里m是样本数目,λ表示的是正则化系数。

注意:当 λ 过大时,则会导致后面部分权重比加大,那么最终损失函数过大,从而导致欠拟合

   当 λ 过小时,甚至为0,导致过拟合。

过拟合和欠拟合-LMLPHP

2、对于神经网络,参数膨胀原因可能是因为随着网路深度的增加,同时参数也不断增加,并且增加速度、规模都很大。那么可以采取减少神经网络规模(深度)的方法。也可以用一种叫dropout的方法。dropout的思想是当一组参数经过某一层神经元的时候,去掉这一层上的一部分神经元,让参数只经过一部分神经元进行计算。注意这里的去掉并不是真正意义上的去除,只是让参数不经过一部分神经元计算而已。

过拟合和欠拟合-LMLPHP

3.提前停止训练: 
也就是减少训练的迭代次数。从上面的误差率曲线图可以看出,理论上能够找到一个训练程度,此时验证集误差率最低,视为拟合效果最好的点。

另外增大训练样本规模同样也可以防止过拟合。

欠拟合:

其实个人觉得欠拟合基本上都会发生在训练刚开始的时候,经过不断训练之后欠拟合应该不怎么考虑了。。但是如果真的还是存在的话,可以通过增加网络复杂度或者在模型中增加多点特征点,这些都是很好解决欠拟合的方法。

另外针对正则化,可以参考正则化,希望这篇文章对你用

10-06 10:25