摘要: 本文总结深度学习过拟合产生的缘由以及解决办法,涵盖正则化、dropout等操做,能够做为工程中的一份开发指南。
神经网络经过大量的参数模拟各类繁多的任务,并能拟合各类复杂的数据集。这种独特的能力使其可以在许多难以在“传统”机器学习时代取得进展的领域——例如图像识别、物体检测或天然语言处理等领域表现优异。然而,有时候,最大的优势也是潜在的弱点。模型在学习过程时,若是缺少控制可能会致使过拟合(overfitting)现象的发生——神经网络模型在训练集上表现很好,但对新数据预测时效果很差。了解过拟合产生的缘由以及防止这种现象发生的方法对于成功设计神经网络而言显得相当重要。算法
在实践中,检测模型过拟合是困难的。不少时候,将训练好的模型上线后才意识到模型出现问题。事实上,只有经过新数据的建议,才能确保一切正常。但在训练期间,应尽可能表示真实状况。所以,比较好的做法是将数据集划分为三个部分——训练集、开发集(也称为交叉验证集)和测试集。构建的模型仅经过训练集来学习,验证集用于跟踪训练进度并根据验证集上的结果优化模型。同时,在训练过程结束后使用测试集来评估模型的性能。使用全新的数据可让咱们对算法的仿真状况有一个客观的见解。网络
确保验证集和测试集来自同一分布以及它们可以准确地反映但愿未来收到的数据很是重要。只有这样,才能确保在学习过程当中作出的决策更接近好的解决方案。那么如何分割手上的数据集呢?最常推荐的拆分方法之一是按照60/20/20
的比例拆分,但在大数据时代,当数据集是数百万条目时,这种固定比例的划分已经再也不合适。简而言之,一切都取决于使用的数据集的大小,若是有数以百万计的条目可供使用,或许最好的划分方法是按照98/1/1
的比例划分。注意:开发集和测试集应该足够大,以使得对构建的模型的性能有很高的信心。根据数据大小划分数据集的推荐方法如图1所示。机器学习
当准备好数据集后,须要使用工具来评估模型的性能。然而,在得出任何结论以前,咱们应该熟悉两个新的概念——误差(bias)和方差(variance)。为了让咱们更好地理解这个复杂的问题,这里举一个简单的例子。假设数据集由位于二维空间中的两类点组成,如图2所示。函数
因为这是一个简单的演示用例,此次就没有测试集,仅使用训练集和验证集。接下来,咱们准备三个模型:第一个是简单的线性回归,另外两个是由几个密集链接层构建的神经网络。在图3中,咱们能够看到使用这些模型定义的分类边界。右上角的第一个模型很是简单,所以具备较高的误差,即它没法找到要素和结果之间的全部重要连接,这是因为数据集中有不少噪音,所以简单的线性回归没法有效地处理它。从图中能够看到,在神经网络模型上表现得更好,但左下角的模型太紧密地拟合数据,这使得它在验证集上表现得更糟,这意味着它具备很大的方差——它适合噪声而不是预期的输出。在最后的模型中,经过使用正则化来减轻这种不指望的影响。工具
上述举的例子很简单,只有两个特征。当咱们在多维空间中操做时,须要使用包含数十个特征的数据集,这种状况该怎么办?这个时候须要比较使用训练集和交叉验证集计算获得的偏差值。固然,最佳状况是这两组的错误率都很低。主要问题是如何定义低错误率——在某些状况下它能够是1%,而在其余状况下它能够高达10%或更大。在训练神经网络时,设立一个比较模型性能的基准是有所帮助的。一般,这取决于执行此任务的人员能力水平。而后尝试确保设计的算法在训练期间有一个接近参考水平的偏差。若是已经实现了这个目标,可是在验证集上验证错误率时,错误率会显著增长,这可能意味着模型存在过拟合(高方差)。另外一方面,若是模型在训练集和交叉验证上表现都不佳,那么它可能太弱而且具备高误差。固然,这个问题会更复杂,并且涉及的面也更广,在这里不作讨论,感兴趣的读者能够阅读NG的新书。性能
当咱们的神经网络具备较高的方差时,这里有不少方法能够有所帮助。好比,很是广泛的方法——获取更多数据,这种方法通常每次都运行良好。还有一些操做,例如正则化,但这种方法须要一些经验和技巧,由于对神经网络施加太多限制可能会损害其有效学习的能力。如今让咱们试着看一下减小过拟合的一些最流行的方法,并讨论它们起做用的缘由。学习
当须要减小过拟合时,应该尝试的第一种方法是正则化。这种方法涉及到在损失函数中添加一个额外的式子,这会使得模型过于复杂。简单来讲,就是在权重矩阵中使用太高的值,这样就会尝试限制其灵活性,同时也鼓励它根据多种特征构建解决方案。这种方法的两个流行版本是L1-最小绝对误差(LAD)和L2-最小二乘偏差(LS),相应的公式以下。在大多数状况下,L2正则化是首选,由于它将不过重要的特征的权重值减少到零。可是在处理具备大量异常值的数据集时不是首选。测试
如今看一下在误差和方差的例子中使用的两个神经网络。正如以前提到的,使用正则化来消除过拟合。在三维空间中可视化权重矩阵并比较在有正则化和没有正则化的模型之间得到的结果以下图所示。此外,还使用正则化对许多模型进行了模拟,改变λ值以验证其对权重矩阵中包含的值的影响。矩阵行和列索引对应于水平轴值,权重为垂直坐标值。大数据
在前面提到的L1和L2两个版本中的正则化公式中,引入了超参数λ (也称为正则化率)。在选择其值时,试图在模型的简单性和拟合训练数据之间达到最佳点。增长λ值也会增长正则化效应。在图4中能够注意到,没有正则化的模型得到的平面,以及具备很是低λ的模型其系数值很是“紊乱”,有许多具备重要价值的峰值。在应用具备较高超参数值的L2正则化以后,该平面图是平坦的。最后,能够看到将lambda值设置为0.1或1会致使模型中权重值急剧降低。优化
另外一种很是流行的神经网络正则化方法是dropout。这个想法实际上很是简单——神经网络的每一个单元(属于输出层的那些单元)都被赋予在计算中被暂时忽略的几率p。超参数p称为丢失率,一般将其默认值设置为0.5。而后,在每次迭代中,根据指定的几率随机选择丢弃的神经元。所以,每次训练会使用较小的神经网络。下图显示了使用dropout操做的神经网络的示例。从图中能够看到,在每次迭代过程当中是随机停用来自第二和第四层神经元。
这种方法的有效性是很是使人惊讶。毕竟,在现实世界中,若是经理天天随机选择员工并将其送回家,工厂的生产率是不会提升的。让咱们从单个神经元的角度来看这个问题,在每次迭代中,任何输入值均可能会被随机消除,神经元会尝试平衡风险而不会支持任何特征。结果,权重矩阵值的分布变得更均匀。
下图显示了在后续的学习过程迭代期间在测试和交叉验证集上获得的准确度值的变化状况。从中能够看到,最终获得的模型并非最好的模型。最终获得的结果比150个epoch后的状况要糟糕得多。为何不在模型开始过拟合以前就中断学习过程?这一观察启发了一种流行的过拟合减小方法,即提早中止(early stopping)。
在实践中,每迭代几回就对模型进行检查它在验证集上的工做状况,并保存每一个比之前全部迭代时都要好的模型。此外,还设置最大迭代次数这个限制,超过此值时中止学习。尽管提早中止能够显著改善模型的性能,但在实践中,其应用极大地使得模型的优化过程变得复杂,很难与其余常规技术结合使用。
掌握如何确认模型是否过拟合对于构建神经模型是很重要的,掌握防止过拟合发生的解决方法也是最基本的。受限于篇幅,本文中没有进行详细描述,但总结了相关内容,具体的操做技巧还须要各位在实践中进行尝试。
本文为云栖社区原创内容,未经容许不得转载。