1. 什么是欠拟合和过拟合?
当你的模型在数据集上不能获得足够低的loss时,就出现了欠拟合。这种情况下,你的模型未能学习到训练数据中潜在的模式。
当我们的学习将训练数据的模式学习的太好了,但不能泛化于验证集,叫做过拟合。
因此,我门在训练机器学习模型时的目标是:
- 尽可能降低训练训练loss
- 确保训练loss和测试loss之间的间隙足够小
我们可以通过调整神经网络的容量来控制模型是否欠拟合或者过拟合。
- 通过增加网络层数和神经元个数来增加容量。
- 通过删除网络层数和神经元、实施正则技术(weight decay, dropout, 数据增强, 早停)来减少容量。
下图将欠拟合和过拟合与模型容量的关系进行可视化(以下图片皆引用自:Deep Learning for Computer Version with Python)
x轴刻画了网络容量,y轴刻画了loss。
刚开始训练的时候,我们处于欠拟合区,此处我们只是尝试学习训练数据中的潜在分布,从开始随机生成的权重慢慢学习,理想情况下,训练loss和验证loss此时应该一起降低,这种趋势说明我们的网络正在学习。
当我们模型容量增加,我们达到了网络的“最佳容量”,在此处,我们的训练和验证的loss以及准确率开始彼此分离,可以看到一个间隙开始生成,我们的目标是限制这个间隙,保证模型的泛化能力。
如果我们未能限制此间隙,那么我们就会进入 过拟合区,在此处,我们的训练loss也许会停滞,也许会继续降低,但是验证loss会停滞甚至升高。验证loss在一系列连续epoch持续升高时过拟合的明显标志。
那么,我们如何控制过拟合呢?
一般情况下,我们有两种方式:
- 降低模型的复杂度,选择更浅的网络,更少的神经层和神经元。
- 实施正则方法。
使用更浅的神经网络也许对小数据集会有效果,但是一般来说,这不是我们想要的方法。
我们应该实施权重衰减、dropout、数据增强等正则方法。
实际上,用正则技术来控制过拟合时更好的选择,而不是减小网络深度,除非你确信你的网络对于你所要解决的问题来说确实太大了。
1.1 学习率的影响
学习率对于过拟合有什么影响呢?见下图:
理想情况下,我们的训练loss和验证loss应该像图中的绿线一样,下降的很快,但也没有快到无法找到最佳梯度,并且在一个loss很低的地方慢慢平稳下来。
在这种情况下,如果我们在一幅图中同时表示出训练loss和验证loss,它们应该会彼此模仿,之间仅有一个小间隙。
但在现实生活的应用中,这种情况不切实际,甚至不是我们希望的,因为这样需要我们话很长时间去训练模型。因此我们只需要注意训练loss和验证loss 之间的间隙。只要这个间隙没有剧烈增加,我们就知道有程度可接受的过拟合。
然而,如果我们没能保持好这个间隙,让训练loss和验证loss严重分离,我们就会面临着过拟合的风险,一旦验证loss开始增加,我们就已经严重过拟合了。
注意训练曲线
当训练神经网络的时候, 注意你的训练数据和验证数据的loss和accuracy曲线,在刚开始的几个epoch,模型的曲线也许一切正常,看起来只是有一点欠拟合,但是这种模式变得很快,你很快就会看到训练loss和验证loss开始分离,当出现这种情况的时候,你需要考虑如下问题:
- 用正则方法了吗?
- 学习率是否太高?
- 网络是否太深?
最后,你应该接受一个事实:对于某些数据集来说,过拟合是无法避免的。比如cifar-10数据集。
如果验证loss比训练loss还低怎么办?
这是一个奇怪的现象。
- 最简单的原因可能是:
- 训练数据包含所有难分类的样本
- 验证集都是由简单的样本点组成的
一般情况下,除非有意而为之,否则经过随机分类的数据集一般是不会出现这种情况的。
-
还有一种可能是数据增强,后续我们将会提到。主要就是说在训练过程中通过给图像施加如平移、旋转、改变尺寸和修剪等变换来随机改变图像。因此网络不断的经过这些增强数据的训练,这也是正则的一种形式,使得网络对于验证集的泛化能力更强,而在训练集上的表现没有那么好。
-
第三种原因,就是你训练的不够“狠”, 你也许应该考虑增大学习率和正则强度