训练一个能够很好地泛化到新数据的深度神经网络是一个具有挑战性的问题。
一个容量过小的模型无法学习问题,而一个容量过大的模型则可能学习得太好,从而过拟合训练数据集。这两种情况都会导致模型泛化能力不佳。
一种减少泛化误差的现代方法是使用更大的模型,这可能需要在训练期间使用正则化,以保持模型权重较小。这些技术不仅可以减少过拟合,还可以加快模型的优化速度,并获得更好的整体性能。
在这篇文章中,您将了解训练神经网络时过拟合的问题,以及如何通过正则化方法解决它。
阅读本文后,你将了解:
- 欠拟合可以通过增加网络容量轻松解决,但过拟合需要使用专门的技术。
- 权重衰减等正则化方法为大型神经网络模型提供了控制过拟合的简便方法。
- 一种现代的正则化建议是使用早期停止、Dropout 和权重约束。
用我的新书《更好的深度学习》来启动你的项目,书中包含分步教程和所有示例的 Python 源代码文件。
让我们开始吧。

正则化入门指南:减少过拟合,提高泛化误差
图片由jaimilee.beale拍摄,保留部分权利。
概述
本教程分为四个部分;它们是
- 模型泛化和过拟合问题
- 通过约束模型复杂度减少过拟合
- 正则化方法
- 正则化建议
模型泛化和过拟合问题
神经网络的目标是得到一个最终模型,它不仅在用于训练的数据(例如训练数据集)上表现良好,而且在将用于预测的新数据上也能表现良好。
机器学习的核心挑战在于,我们必须在新颖的、以前未见过的数据上表现良好,而不仅仅是在我们的模型经过训练的数据上。在以前未观测到的输入上表现良好的能力称为泛化。
——摘自《深度学习》,2016年,第110页。
我们要求模型从已知示例中学习,并从这些已知示例泛化到未来新示例。我们使用训练/测试分割或k折交叉验证等方法,仅仅是为了估计模型对新数据进行泛化的能力。
学习并泛化到新案例是困难的。
学习不足会导致模型在训练数据集和新数据上表现不佳。模型将欠拟合问题。学习过度会导致模型在训练数据集上表现良好,但在新数据上表现不佳,模型将过拟合问题。在这两种情况下,模型都没有泛化。
- 欠拟合模型。指未能充分学习问题,在训练数据集上表现不佳,在保留样本上表现也不佳的模型。
- 过拟合模型。指对训练数据集学习得太好,在训练数据集上表现良好,但在保留样本上表现不佳的模型。
- 良好拟合模型。指适当地学习了训练数据集并能很好地泛化到旧数据集的模型。
模型的拟合度可以在偏差-方差权衡的背景下进行考虑。
欠拟合模型具有高偏差和低方差。无论训练数据中的具体样本如何,它都无法学习问题。过拟合模型具有低偏差和高方差。模型对训练数据学习得太好,性能会随着新的未见示例或甚至添加到训练数据示例中的统计噪声而大幅变化。
为了更好地泛化,系统需要足够强大以近似目标函数。如果它过于简单以至于无法拟合训练数据,那么对新数据的泛化也可能很差。[...] 然而,一个过于复杂的系统可能能够以许多不同的方式近似数据,这些方式会产生相似的误差,并且不太可能选择泛化效果最好的那种...
——摘自《神经锻造:前馈人工神经网络中的监督学习》,1999年,第241页。
我们可以通过增加模型的容量来解决欠拟合问题。容量指的是模型拟合各种函数的能力;容量越大,意味着模型可以拟合更多类型的函数来将输入映射到输出。通过改变模型的结构,例如添加更多层和/或更多节点到层中,可以轻松实现增加模型容量。
由于欠拟合模型很容易解决,所以更常见的情况是模型过拟合。
通过在训练过程中评估模型在训练数据集和留出验证数据集上的性能,可以很容易地诊断过拟合模型。绘制模型在训练过程中性能的线图,即学习曲线,将显示一个熟悉的模式。
例如,模型在训练集和验证集上的损失(我们试图最小化)的线图将显示一条训练集曲线,该曲线下降并可能趋于平稳,而验证集曲线则先下降,然后某一点开始再次上升。
随着训练的进行,泛化误差可能下降到最小值,然后随着网络适应训练数据的特异性而再次增加。
——摘自《神经锻造:前馈人工神经网络中的监督学习》,1999年,第250页。
学习曲线图讲述了模型学习问题的过程,直到它开始过拟合,并且其泛化到未见验证数据集的能力开始变差。
想要通过深度学习获得更好的结果吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
通过约束模型复杂度减少过拟合
解决过拟合模型有两种方法:
- 通过在更多示例上训练网络来减少过拟合。
- 通过改变网络复杂度来减少过拟合。
非常深的神经网络的一个优点是,随着数据集越来越大,它们的性能会持续提高。一个拥有近乎无限示例的模型最终会在网络学习能力方面达到平台期。
一个模型可能过拟合训练数据集,因为它有足够的容量这样做。降低模型容量可以减少模型过拟合训练数据集的可能性,直到它不再过拟合。
神经网络模型的容量,即其复杂性,由其节点和层结构以及权重参数共同决定。因此,我们可以通过以下两种方式之一来降低神经网络的复杂性以减少过拟合:
- 通过改变网络结构(权重数量)来改变网络复杂度。
- 通过改变网络参数(权重值)来改变网络复杂度。
在神经网络的情况下,可以通过改变网络中自适应参数的数量来改变复杂度。这被称为结构稳定化。[...] 控制模型复杂度的第二个主要方法是使用正则化,这涉及到在误差函数中添加一个惩罚项。
——摘自《用于模式识别的神经网络》,1995年,第332页。
例如,可以通过网格搜索等方式调整结构,直到找到合适的节点数量和/或层数,以减少或消除问题中的过拟合。或者,模型可以过拟合并通过移除节点进行剪枝,直到在验证数据集上达到合适的性能。
更常见的是通过确保模型的参数(权重)保持较小来限制模型的复杂性。较小的参数意味着模型复杂度较低,从而更稳定,对输入数据中的统计波动敏感度较低。
较大的权重往往会导致[激活]函数中出现急剧的转变,从而在输入微小变化时导致输出发生较大变化。
——摘自《神经锻造:前馈人工神经网络中的监督学习》,1999年,第269页。
更常见的是关注限制神经网络权重大小的方法,因为可以定义一个结构欠约束的单一网络结构(即其容量远大于问题所需),并且可以在训练期间使用正则化来确保模型不会过拟合。在这种情况下,性能甚至可能更好,因为额外的容量可以集中于更好地学习问题中可泛化的概念。
旨在通过保持网络权重较小来减少过拟合(减少泛化误差)的技术被称为正则化方法。更具体地说,正则化是指一类通过添加额外信息将不适定问题转换为更稳定的适定问题的方法。
如果给定信息的微小变化导致解的巨大变化,则称问题为不适定问题。这种对数据的不稳定性使得解不可靠,因为小的测量误差或参数不确定性可能会被大大放大,导致截然不同的响应。[...] 正则化背后的思想是利用补充信息以稳定的形式重新表述不适定问题。
——摘自《神经锻造:前馈人工神经网络中的监督学习》,1999年,第266页。
正则化方法被广泛用于减少过拟合,以至于“正则化”一词可以用于任何提高神经网络模型泛化误差的方法。
正则化是我们对学习算法所做的任何修改,旨在减少其泛化误差而不是训练误差。正则化是机器学习领域的核心关注点之一,其重要性仅次于优化。
——摘自《深度学习》,2016年,第120页。
神经网络的正则化方法
最简单也可能是最常见的正则化方法是,根据模型中权重的大小,在损失函数中添加一个惩罚项。
- 权重正则化(权重衰减):根据权重的大小在训练期间惩罚模型。
这将鼓励模型以保持模型权重较小的方式将输入映射到训练数据集的输出。这种方法称为权重正则化或权重衰减,几十年来已被证明对简单的线性模型和神经网络都非常有效。
收集更多数据的简单替代方法是减小模型大小或改进正则化,通过调整超参数如权重衰减系数...
——摘自《深度学习》,2016年,第427页。
以下是五种最常见的额外正则化方法。
- 活动正则化:根据激活的幅度在训练期间惩罚模型。
- 权重约束:将权重的幅度限制在一定范围或低于某个限值。
- Dropout:在训练期间以概率方式移除输入。
- 噪声:在训练期间向输入添加统计噪声。
- 提前停止:监控模型在验证集上的性能,并在性能下降时停止训练。
这些方法中的大多数已被证明(或被证实)能够近似于向损失函数添加惩罚项的效果。
每种方法都以不同的方式解决问题,在泛化性能、可配置性和/或计算复杂性方面提供不同的优势。
正则化建议
本节概述了深度学习神经网络使用正则化的一些建议。
除非您拥有非常大的数据集(例如大数据规模),否则您应始终考虑使用正则化。
除非您的训练集包含数千万甚至更多示例,否则您应该从一开始就引入一些温和的正则化形式。
——摘自《深度学习》,2016年,第426页。
一个好的通用建议是设计一个欠约束的神经网络结构,并使用正则化来降低过拟合的可能性。
... 控制模型的复杂性并非简单地寻找具有正确大小和正确参数数量的模型。相反,... 在实际的深度学习场景中,我们几乎总是发现——最好的拟合模型(在最小化泛化误差的意义上)是一个经过适当正则化的大模型。
——摘自《深度学习》,2016年,第229页。
除了在训练期间保持权重较小的方法外,应几乎普遍使用早期停止。
早期停止应该几乎普遍使用。
——摘自《深度学习》,2016年,第426页。
一些更具体的建议包括:
- 经典方法:使用早期停止和权重衰减(L2权重正则化)。
- 替代方法:使用早期停止和添加噪声以及权重约束。
- 现代方法:使用早期停止和Dropout,以及权重约束。
这些建议适用于多层感知器和卷积神经网络。
一些关于循环神经网络的建议包括:
- 经典方法:使用早期停止、添加权重噪声和权重约束(如最大范数)。
- 现代方法:使用早期停止、具有“通过时间反向传播感知”的 Dropout 版本和权重约束。
在正则化方面没有万能药,强烈建议进行系统实验。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
书籍
- 《深度学习》第7章,正则化,2016年。Deep Learning, 2016.
- 《模式识别与机器学习》第5.5节,神经网络中的正则化,2006年。Pattern Recognition and Machine Learning, 2006.
- 《神经锻造:前馈人工神经网络中的监督学习》第16章,改善泛化的启发式方法,1999年。Neural Smithing: Supervised Learning in Feedforward Artificial Neural Networks, 1999.
- 《模式识别的神经网络》第9章,学习与泛化,1995年。Neural Networks for Pattern Recognition, 1995.
文章
总结
在这篇文章中,您了解了训练神经网络时过拟合的问题,以及如何通过正则化方法解决它。
具体来说,你学到了:
- 欠拟合可以通过增加网络容量轻松解决,但过拟合需要使用专门的技术。
- 权重衰减等正则化方法为大型神经网络模型提供了控制过拟合的简便方法。
- 一种现代的正则化建议是使用早期停止、Dropout 和权重约束。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
感谢您的帖子。不过,您在关于过拟合/欠拟合和良好拟合的三个图表中,是否将损失和准确率弄混了?
不是,但它们是最大化(准确率)而不是最小化(损失)。也许这令人困惑。
我想问题在于它们显示的是准确率,但却标记为“损失”……
是的。图表不好。
我已经删除了它们。
欠拟合难道不是简单地因为数据不足,而不是因为网络容量限制吗?
不,如果数据不足,您会过拟合。
关于机器学习中的欠拟合和过拟合的精彩概念总结,以及其背后的思想是,多次获得关于某事物的许多(多余且不相关的)细节意味着失去了主流概念(泛化)......
此外,每当我遇到这个问题时,我总是忍不住想到古老谚语中包含的思想:“知之甚多者(‘过拟合方法’)一无所知(‘泛化能力’)”…… 🙂
感谢您分享这些教程
JG
好的
是的,这让我想起了:狐狸知道很多事情,刺猬知道一件大事。
杰森,有一个问题,数据增强这种常用技术应该归入过拟合技术中的哪一类?
——作为增加数据输入的一种方式,但使用相同的数据(以新数据的形式出现),还是
——作为一种正则化方式(为了获得更好的泛化能力,消除不助于获取模式的数据细节?)
谢谢
JG
它兼具两种作用:通过更多训练数据改进训练,并具有温和的正则化效果。
先生,我在期刊上发表了一篇论文,收到了以下修改意见:
优化 epoch——也许 epoch 不需要优化,因为当验证损失趋于平稳时,模型训练就可以停止了,这可能发生在不同的 epoch,具体取决于优化器和/或使用的数据集。
上述情况可以解释为什么 SGD 优化器在 200 个 epoch 时可能没有收敛,这是 GSO 选择的(参见图 5)。作者需要解释为什么他们选择优化 epoch。
感谢分享。
嗨,Jason,
我可能有一个“问题”,但不确定我的想法是否正确。我开发了一个多层感知机(MLP),它使用不平衡数据进行了训练,我应用了不同的策略来避免这个问题。
如果在测试阶段,我使用原始数据集(在应用平衡技术之前)的一个子集。我是否在避免过拟合?
非常感谢。
此致。
您可以通过查看学习曲线来判断您的神经网络是否过拟合。
https://machinelearning.org.cn/learning-curves-for-diagnosing-machine-learning-model-performance/
是的,我知道。我的意思是,如果您的初始数据集不平衡,并且您使用 SNOTE 或其他方法进行了数据增强,现在也有了人工数据,那么进行验证的最佳数据策略是什么?
再次感谢。
随机抽样,重复以避免偏差。理想情况下是重复的 k 折交叉验证。
嗨,Jason,
您有关于最后几条建议的例子吗?
一些关于循环神经网络的建议包括:
• 经典方法:使用早期停止,并添加权重噪声和权重约束(如最大范数)。
• 现代方法:使用早期停止,并使用“通过时间反向传播感知”的 Dropout 版本和权重约束。
是的,您可以在博客上搜索示例。
https://github.com/omar16100/Movielens-Recommender-System-Keras/blob/master/movie_recsys.ipynb,这个模型在我的数据集上使用后过拟合了。您能告诉我如何解决吗?
或许可以尝试上面描述的一些方法。
嗨,Jason,
感谢您的文章。
在处理深度学习过拟合时,我经常遇到这样的情况:在添加 Dropout 或 L2 和 L1 正则化后,训练数据损失增大,但验证数据也没有改善。您能给我一些关于这种情况的提示吗?非常感谢。
添加正则化可能需要更小的学习率和更多的训练周期。例如,仅仅改变一件事是不够的。
感谢杰森的精彩主题
我想知道饱和模型是否等同于过拟合
以及结合网格搜索使用 K 折交叉验证和 LOOCV 等重采样技术是否有助于避免过拟合
在机器学习中,“过饱和”是什么意思?
我在一些评论中发现这意味着参数过多。
太棒了!
总结得很棒!
谢谢!
你好 Jason,
感谢这篇博客。如果我必须从以下选项中选择最有效的方法来减少基于 XGBoost 回归的过拟合:
1. 收集数据或数据增强(您已在您的某篇博客中涵盖此内容)
2. 特征选择
3. Dropout
4. 随机森林
会是哪一个以及为什么?
我将不胜感激您的想法。
我不认为您可以在 XGBoost 中使用 Dropout,这种方法是用于神经网络的。
早期停止是减少 XGBoost 模型过拟合的好方法。
xgboost 1.5.0(参见https://docs.xgboost.com.cn/en/latest/parameter.html)中包含了 DART 实现。(还有其他 Dropout 树算法。)我发现 DART 偶尔有用:随机森林几乎从没用过。
特别是对于 GBM 方法,特征选择可能最有用,因为尽管 xgboost 确实有 alpha、lambda 和 gamma,但它在噪声问题上难以完全忽略噪声变量。
但最有用的选择可能是:0)理解你的数据。
感谢分享。
嗨,Jason,
感谢您的介绍。
我有3个问题想问。
第一个问题是,您论文中作为额外正则化方法之一的“4.噪声:在训练期间向输入添加统计噪声”是否等同于副标题“通过约束模型复杂度减少过拟合”下的“1.通过在更多示例上训练网络来减少过拟合”这句话?如果不是,它们之间的关系是什么?您介意更详细地解释第二句话吗?
第二个问题是,“1.通过改变网络结构(权重数量)来改变网络复杂度”是否意味着我们常说的“简化模型”方法,即通过简单地移除层或减少神经元数量来使网络变小?
最后一个问题是,额外的正则化方法“1.活动正则化”和“2.权重约束”是否分别对应于我们常说的 L1 和 L2?
祝好,
你好 Muhan……请将问题精简为一个简洁的问题,这样可以更好地帮助你。