过拟合与欠拟合
机器学习的目的是开发出能够很好泛化到测试数据(或者之前从未见过的数据)的模型,过拟合是指当训练周期达到一定的迭代次数后,模型在训练集上的准确率会越来越高,在验证数据集上的准确率会不断上升,达到峰值,之后会开始下降,也就是说,模型会过拟合训练数据。与过拟合相对的是欠拟合。当测试数据仍存在改进空间时,便会发生欠拟合。出现这种情况的原因有很多:模型不够强大、过于正则化,或者根本没有训练足够长的时间。这意味着网络未学习训练数据中的相关模式。如果训练时间过长,模型将开始过拟合,并从训练数据中学习无法泛化到测试数据的模式。我们需要在这两者之间实现平衡。
为了防止发生过拟合,最好的解决方案是使用更多训练数据。用更多数据进行训练的模型自然能够更好地泛化。如无法采用这种解决方案,则次优解决方案是使用正则化等技术。这些技术会限制模型可以存储的信息的数量和类型。如果网络只能记住少量模式,那么优化过程将迫使它专注于最突出的模式,因为这些模式更有机会更好地泛化。
下面将介绍几种种常见的正则化技术,并用来改善 IMDB 影评分类笔记本。
下载IMDB数据集
演示过拟合
防止过拟合,最简单的方法是缩小模型,即减少模型中可学习参数的数量(由层数和每层的单元数决定)。在深度学习中,模型中可学习参数的数量通常称为模型的 “容量”。直观而言,参数越多的模型 “记忆容量” 越大,因此能够轻松学习训练样本与其目标之间的字典式完美映射(无任何泛化能力的映射),但如果要对之前未见过的数据做出预测,这种映射毫无用处。请务必谨记:深度学习模型往往善于与训练数据拟合,但真正的挑战是泛化,而非拟合。另一方面,如果网络的记忆资源有限,便无法轻松学习映射。为了最小化损失,它必须学习具有更强预测能力的压缩表示法。同时,如果模型太小,它将难以与训练数据拟合。我们需要在 “太多容量” 和 “容量不足” 这两者之间实现平衡。
通常要找到合适的模型大小,最好先使用相对较少的层和参数,然后开始增加层的大小或添加新的层,直到看到返回的验证损失不断减小为止。这里分别使用 Dense 层创建一个简单的基准模型,然后创建一个隐藏单元更少的小模型,再创建一个容量特别大的远远超出解决问题所需容量的模型,看看它多块开始过拟合,接下来,对这三个模型使用相同的训练数据进行训练,并绘制训练损失和验证损失图表,具体过程和实验结果可以参考原始博客。
策略
1、提前终止
对模型进行训练的过程即对模型的参数进行学习更新的过程,这个参数学习过程往往会用到一些迭代方法,如梯度下降法。Early stopping便是一种迭代次数截断的方法来防止过拟合,即在模型对训练数据集迭代收敛之前停止迭代来防止过拟合。Early stopping的具体做法是,在每个epoch结束时(一个epoch是指对所有的训练数据的一轮遍历)计算验证集上的准确率,当验证集上的准确率不再提高时,就停止训练。那么关键问题就是如何认为验证集上的准确率不再提高了呢?并不是说验证集上的准确率一降下来便认为不能再提高了,因为可能经过这个epoch后,准确率降低了,但是随后的epoch又让准确率上去了,所以不能根据一两次的连续降低就判断不再提高。一般的做法是,在训练过程中,记录到目前为止最好的验证集上的准确率,当连续10次epoch没有达到最佳的准确率时,就可以认为准确率不再提高了,这个时候就可以停止迭代了。
2、数据增强
使用训练数据训练模型,通过模型对将来的数据进行拟合,这之间的一个假设便是训练数据和将来的数据是独立同分布的。即使用当前的训练数据对将来的数据进行估计与模拟,而更多的数据往往估计的模型更准确。但是往往数据有限,有限的人力标注成本,因此不能收集到更多的数据,所以这时通过一些方式和策略来获得更多的数据。
一般来讲,数据扩增的目的是获得更多的符合要求的数据,即和已有的数据是独立同分布的,或者近似独立同分布,一般有以下几种方法:
- 从数据源头采集更多数据
- 复制原有数据并加上随机噪声
- 重采样
- 根据当前数据集估计数据分布参数,使用该分部产生更多数据等
如图像处理: - 图像平移:使得网络学习到评议不变的特征;
- 图像旋转:使得网络学习旋转不变特征,有些任务中,目标可能有多种不同的姿态,旋转正好可以弥补样本中姿较少的问题。
- 图像镜像
- 图像亮度变化,如直方图均衡化。
- 裁剪、缩放
- 图像模糊:使用不同的模板卷积产生模糊图像。
3、添加权重正则化
缓解过拟合,一种常见方法是限制网络的复杂性,具体方法是强制要求其权重仅采用较小的值,使权重值的分布更 “规则”。这称为 “权重正则化”。通过向网络的损失函数添加与权重较大相关的代价来实现。这个代价分为两种类型:L1 正则化,其中所添加的代价与权重系数的绝对值(即所谓的权重 “L1 范数”)成正比,L2 正则化,其中所添加的代价与权重系数值的平方(即所谓的权重 “L2 范数”)成正比。L2 正则化在神经网络领域也称为权重衰减。
L1正则:在目标函数后面加上参数的L1范数正则项。即参数绝对值和与参数的积项。在梯度的更新过程中,当w为正,更新后w会变小,当w为负时,更新后的w会变大,因此L1正则项是为了使得那些原先处于零附近的参数往零移动,使得部分参数为零,从而降低模型的复杂度,防止过拟合。
L2正则:在目标后面加上参数的L2范数正则项,即参数的平方和与参数的积项。L2正则项起到使参数w变小加剧的效果。那么更小的参数值意味着模型的复杂度更低,对训练数据的拟合刚刚好,不会过分拟合训练数据,从而提高模型的泛化能力。
4、添加丢弃层droupout
添加丢弃层是最有效且最常用的神经网络正则化技术之一。丢弃(应用于某个层)是指在训练期间随机 “丢弃”(即设置为 0)该层的多个输出特征,相当于随机的“删除”网络中的一部分隐藏单元,假设某个指定的层通常会在训练期间针对给定的输入样本返回一个向量 [0.2, 0.5, 1.3, 0.8, 1.1];在应用丢弃后,此向量将随机分布几个 0 条目,例如 [0, 0.5, 1.3, 0, 1.1]。“丢弃率” 指变为 0 的特征所占的比例,通常设置在 0.2 和 0.5 之间。在测试时,网络不会丢弃任何单元,而是将层的输出值按等同于丢弃率的比例进行缩减,以便平衡以下事实:测试时的活跃单元数大于训练时的活跃单元数。
那么为什么使用droupout有助于防止过拟合呢?可以这样理解,运用了droupout,相当于训练了只有半数隐藏单元的神经网络,每个这样的神经网络都会给出一个分类结果,这样的结果有的是正确的,有的是错误的,随着训练的进行,大多数这样的网络都会给出正确的分类结果,那么少数的错误分类结果就不会对最终结果造成更大的影响。