深度学习揭秘之防止过拟合(overfitting)

摘要:本文总结深度学习过拟合产生的原因以及解决办法,涵盖正则化、dropout等操作,可以作为工程中的一份开发指南。


神经网络通过大量的参数模拟各种繁多的任务,并能拟合各种复杂的数据集。这种独特的能力使其能够在许多难以在“传统”机器学习时代取得进展的领域——例如图像识别、物体检测或自然语言处理等领域表现优异。然而,有时候,最大的优点也是潜在的弱点。模型在学习过程时,如果缺乏控制可能会导致过拟合(overfitting)现象的发生——神经网络模型在训练集上表现很好,但对新数据预测时效果不好。了解过拟合产生的原因以及防止这种现象发生的方法对于成功设计神经网络而言显得至关重要。


如何知道模型产生过拟合?


训练(train sets)、开发(dev sets)和测试集(test sets)


在实践中,检测模型过拟合是困难的。很多时候,将训练好的模型上线后才意识到模型出现问题。事实上,只有通过新数据的建议,才能确保一切正常。但在训练期间,应尽量表示真实情况。因此,比较好的作法是将数据集划分为三个部分——训练集、开发集(也称为交叉验证集)和测试集。构建的模型仅通过训练集来学习,验证集用于跟踪训练进度并根据验证集上的结果优化模型。同时,在训练过程结束后使用测试集来评估模型的性能。使用全新的数据可以让我们对算法的仿真情况有一个客观的看法。


深度学习揭秘之防止过拟合(overfitting)_第1张图片

图1.划分数据集的推荐方法


确保验证集和测试集来自同一分布以及它们能够准确地反映希望将来收到的数据非常重要。只有这样,才能确保在学习过程中做出的决策更接近好的解决方案。那么如何分割手上的数据集呢?最常推荐的拆分方法之一是按照60/20/20的比例拆分,但在大数据时代,当数据集是数百万条目时,这种固定比例的划分已经不再合适。简而言之,一切都取决于使用的数据集的大小,如果有数以百万计的条目可供使用,或许最好的划分方法是按照98/1/1的比例划分。注意:开发集和测试集应该足够大,以使得对构建的模型的性能有很高的信心。根据数据大小划分数据集的推荐方法如图1所示。


偏差和方差


当准备好数据集后,需要使用工具来评估模型的性能。然而,在得出任何结论之前,我们应该熟悉两个新的概念——偏差(bias)和方差(variance)。为了让我们更好地理解这个复杂的问题,这里举一个简单的例子。假设数据集由位于二维空间中的两类点组成,如图2所示。


深度学习揭秘之防止过拟合(overfitting)_第2张图片

图2.数据集的可视化


由于这是一个简单的演示用例,这次就没有测试集,仅使用训练集和验证集。接下来,我们准备三个模型:第一个是简单的线性回归,另外两个是由几个密集连接层构建的神经网络。在图3中,我们可以看到使用这些模型定义的分类边界。右上角的第一个模型非常简单,因此具有较高的偏差,即它无法找到要素和结果之间的所有重要链接,这是由于数据集中有很多噪音,因此简单的线性回归无法有效地处理它。从图中可以看到,在神经网络模型上表现得更好,但左下角的模型太紧密地拟合数据,这使得它在验证集上表现得更糟,这意味着它具有很大的方差——它适合噪声而不是预期的输出。在最后的模型中,通过使用正则化来减轻这种不期望的影响。


深度学习揭秘之防止过拟合(overfitting)_第3张图片

图3.创建的分类边界:右上角——线性回归; 左下角——神经网络; 右下角——正则化的神经网络


上述举的例子很简单,只有两个特征。当我们在多维空间中操作时,需要使用包含数十个特征的数据集,这种情况该怎么办?这个时候需要比较使用训练集和交叉验证集计算得到的误差值。当然,最佳情况是这两组的错误率都很低。主要问题是如何定义低错误率——在某些情况下它可以是1%,而在其他情况下它可以高达10%或更大。在训练神经网络时,设立一个比较模型性能的基准是有所帮助的。通常,这取决于执行此任务的人员能力水平。然后尝试确保设计的算法在训练期间有一个接近参考水平的误差。如果已经实现了这个目标,但是在验证集上验证错误率时,错误率会显著增加,这可能意味着模型存在过拟合(高方差)。另一方面,如果模型在训练集和交叉验证上表现都不佳,那么它可能太弱并且具有高偏差。当然,这个问题会更复杂,而且涉及的面也更广,在这里不做讨论,感兴趣的读者可以阅读NG的新书。


防止过拟合的方法


介绍


当我们的神经网络具有较高的方差时,这里有很多方法可以有所帮助。比如,非常普遍的方法——获取更多数据,这种方法一般每次都运行良好。还有一些操作,例如正则化,但这种方法需要一些经验和技巧,因为对神经网络施加太多限制可能会损害其有效学习的能力。现在让我们试着看一下减少过拟合的一些最流行的方法,并讨论它们起作用的原因。


L1和L2正则化


当需要减少过拟合时,应该尝试的第一种方法是正则化。这种方法涉及到在损失函数中添加一个额外的式子,这会使得模型过于复杂。简单来说,就是在权重矩阵中使用过高的值,这样就会尝试限制其灵活性,同时也鼓励它根据多种特征构建解决方案。这种方法的两个流行版本是L1-最小绝对偏差(LAD)和L2-最小二乘误差(LS),相应的公式如下。在大多数情况下,L2正则化是首选,因为它将不太重要的特征的权重值减小到零。但是在处理具有大量异常值的数据集时不是首选。


深度学习揭秘之防止过拟合(overfitting)_第4张图片


现在看一下在偏差和方差的例子中使用的两个神经网络。正如之前提到的,使用正则化来消除过拟合。在三维空间中可视化权重矩阵并比较在有正则化和没有正则化的模型之间获得的结果如下图所示。此外,还使用正则化对许多模型进行了模拟,改变λ值以验证其对权重矩阵中包含的值的影响。矩阵行和列索引对应于水平轴值,权重为垂直坐标值。


深度学习揭秘之防止过拟合(overfitting)_第5张图片

图4.可视化没有和具有正则化的模型权重矩阵


Lambda因子及其影响

       

在前面提到的L1和L2两个版本中的正则化公式中,引入了超参数λ (也称为正则化率)。在选择其值时,试图在模型的简单性和拟合训练数据之间达到最佳点。增加λ值也会增加正则化效应。在图4中可以注意到,没有正则化的模型获得的平面,以及具有非常低λ的模型其系数值非常“紊乱”,有许多具有重要价值的峰值。在应用具有较高超参数值的L2正则化之后,该平面图是平坦的。最后,可以看到将lambda值设置为0.1或1会导致模型中权重值急剧下降。


dropout


另一种非常流行的神经网络正则化方法是dropout。这个想法实际上非常简单——神经网络的每个单元(属于输出层的那些单元)都被赋予在计算中被暂时忽略的概率p。超参数p称为丢失率,通常将其默认值设置为0.5。然后,在每次迭代中,根据指定的概率随机选择丢弃的神经元。因此,每次训练会使用较小的神经网络。下图显示了使用dropout操作的神经网络的示例。从图中可以看到,在每次迭代过程中是随机停用来自第二和第四层神经元。


深度学习揭秘之防止过拟合(overfitting)_第6张图片

图5:dropout可视化


这种方法的有效性是非常令人惊讶。毕竟,在现实世界中,如果经理每天随机选择员工并将其送回家,工厂的生产率是不会提高的。让我们从单个神经元的角度来看这个问题,在每次迭代中,任何输入值都可能会被随机消除,神经元会尝试平衡风险而不会支持任何特征。结果,权重矩阵值的分布变得更均匀。


提前停止(early stopping)

 

下图显示了在后续的学习过程迭代期间在测试和交叉验证集上得到的准确度值的变化情况。从中可以看到,最终得到的模型并不是最好的模型。最终得到的结果比150个epoch后的情况要糟糕得多。为什么不在模型开始过拟合之前就中断学习过程?这一观察启发了一种流行的过拟合减少方法,即提前停止(early stopping)。


图6.神经网络学习过程中后续时期的准确度值的变化


在实践中,每迭代几次就对模型进行检查它在验证集上的工作情况,并保存每个比以前所有迭代时都要好的模型。此外,还设置最大迭代次数这个限制,超过此值时停止学习。尽管提前停止可以显著改善模型的性能,但在实践中,其应用极大地使得模型的优化过程变得复杂,很难与其他常规技术结合使用。


结论

       

掌握如何确认模型是否过拟合对于构建神经模型是很重要的,掌握防止过拟合发生的解决方法也是最基本的。受限于篇幅,本文中没有进行详细描述,但总结了相关内容,具体的操作技巧还需要各位在实践中进行尝试。


作者信息


Piotr Skalski,热爱机器学习和数据科学 
本文由阿里云云栖社区组织翻译。 
文章原标题《Preventing Deep Neural Network from Overfitting》,译者:海棠,审校:Uncle_LLD。 


深度学习揭秘之防止过拟合(overfitting)_第7张图片

你可能感兴趣的:(深度学习揭秘之防止过拟合(overfitting))