我正在训练一个神经网络并且训练损失减少了,但验证损失没有,或者它减少的比我预期的要少得多,基于非常相似的架构和数据的参考或实验。我怎样才能解决这个问题?
至于问题
对于这个问题的启发,这个问题是有意留下的,以便其他关于如何将神经网络的泛化误差降低到已被证明可以达到的水平的问题,可以作为这个问题的重复而关闭。
另请参阅 Meta 上的专用线程:
我正在训练一个神经网络并且训练损失减少了,但验证损失没有,或者它减少的比我预期的要少得多,基于非常相似的架构和数据的参考或实验。我怎样才能解决这个问题?
至于问题
对于这个问题的启发,这个问题是有意留下的,以便其他关于如何将神经网络的泛化误差降低到已被证明可以达到的水平的问题,可以作为这个问题的重复而关闭。
另请参阅 Meta 上的专用线程:
首先,让我们提一下“我的神经网络不能很好地泛化”是什么意思,和“我的神经网络性能不好”有什么区别。
在训练神经网络时,您会不断地在一组称为训练集的标记数据上对其进行评估。如果您的模型不能正常工作并且似乎没有从训练集中学习,那么您还没有泛化问题,请参阅这篇文章。但是,如果您的模型在训练集上取得了令人满意的性能,但在以前看不见的数据(例如验证/测试集)上表现不佳,那么您确实存在泛化问题。
最重要的部分是理解为什么你的网络不能很好地泛化。大容量机器学习模型具有记忆训练集的能力,这可能导致过度拟合。
过度拟合是估计器已经开始很好地学习训练集以至于它已经开始对训练样本中的噪声进行建模(除了所有有用的关系)的状态。
例如,在下图中,我们可以看到右行的蓝色是如何明显过拟合的。
当试图在新的、以前看不见的数据(即验证/测试集)上评估我们的模型时,模型的性能将比我们预期的要差得多。
在帖子的开头,我暗示您的模型的复杂性实际上是导致过度拟合的原因,因为它允许模型从训练集中提取不必要的关系,从而映射其固有的噪声。减少过度拟合的最简单方法是从本质上限制模型的容量。这些技术称为正则化技术。
参数规范惩罚。这些为每个模型的权重更新函数添加了一个额外的项,这取决于参数的范数。该术语的目的是对抗实际更新(即限制每个权重可以更新多少)。这使得模型对异常值和噪声更加鲁棒。此类正则化的示例是L1 和 L2正则化,可以在Lasso、Ridge和Elastic Net回归器上找到。
由于神经网络中的每个(完全连接的)层的功能很像简单的线性回归,因此这些都用于神经网络。最常见的用途是分别对每一层进行正则化。
keras 实现。
早停。这种技术试图过早停止估计器的训练阶段,在它学会从数据中提取所有有意义的关系时,然后开始对其噪声进行建模。这是通过监控验证损失(或您选择的验证指标)并在该指标停止改进时终止训练阶段来完成的。这样,我们给估计器足够的时间来学习有用的信息,但不足以从噪声中学习。keras 实现。
除了限制模型的容量之外,防止过度拟合的另一种方法是提高数据的质量。最明显的选择是去除异常值/噪声,但实际上它们的用处有限。一种更常见的方式(尤其是在与图像相关的任务中)是数据增强。在这里,我们尝试随机变换训练示例,以便在模型看来它们不同时,它们传达相同的语义信息(例如,左右翻转图像)。
数据增强概述
有大量经验证据表明,足够深的神经网络可以记住大量数据集上的随机标签(Chiyuan Zhang、Samy Bengio、Moritz Hardt、Benjamin Recht、Oriol Vinyals,“理解深度学习需要重新思考泛化”)。因此,原则上,通过获得足够大的 NN,我们总是可以将训练误差降低到极小的值,在实践中受到数值准确性的限制,无论任务多么无意义。
泛化错误的情况完全不同。我们不能确定对于每个学习问题,是否存在一个可学习的 NN 模型,该模型可以产生尽可能低的泛化误差。为此,第一步是
找到一个有信誉的参考资料,它告诉您存在一种架构,可以在您的数据集或您可以找到参考资料的最相似的数据集上达到您正在寻找的泛化错误。例如,看这里
查找 CNN 在各种任务上的当前(在回答时)SOTA(最先进的)性能。在您对自己的数据集进行训练之前,尝试在这些参考数据集上重现此类结果是一个好主意,以测试您的所有基础设施是否正确。
问题答案中描述的所有检查
确保您的训练过程正常,是成功减少泛化错误的先决条件(如果您的 NN 不学习,它就无法学习泛化)。这些检查包括,除其他外:
Leslie N. Smith 和 Nicholay Topin的“超收敛:使用大学习率对神经网络进行非常快速的训练”表明,在某些情况下,大学习率与 Leslie N. Smith 的循环学习率方法的组合充当了正则化器,将收敛速度加快一个数量级,并减少对广泛正则化的需求。因此,这是一件好事之前尝试
正则化通常会增加训练时间(坏),增加训练误差并减少泛化误差(好),但过多的正则化实际上会增加两个错误(欠拟合)。出于这个原因,并且由于训练时间的增加,在您成功地设法过拟合训练集之后,通常最好一次引入各种正则化技术。请注意,正则化本身并不一定意味着您的泛化误差会变小:模型必须具有足够大的容量才能实现良好的泛化特性。这通常意味着您需要一个足够深的网络,然后才能看到正则化的好处。
最古老的正则化方法可能是提前停止和权重衰减。其他一些:
如果没有其他帮助,您将不得不测试多个不同的超参数设置(贝叶斯优化在这里可能会有所帮助)或多个不同的架构更改(例如,可能在您的 GAN 架构和您正在处理的数据集中,批处理规范仅适用于生成器,但是当添加到鉴别器时也会使事情变得更糟)。请务必在井井有条的日志中记录这些漫长而无聊的实验结果。
PS 对于 GAN,谈论泛化错误没有多大意义:上面的例子只是为了表明深度学习中仍有很多炼金术,你希望能正常工作的东西,有时不要't,或者反之亦然,一些多次运行良好的东西,突然对你产生了新的数据集。
我在文献中看到的常用正则化技术列表是:
我觉得 Djib2011 对自动化方法给出了很好的观点,但它们并没有真正解决我们如何知道用于减少过度拟合的方法是否发挥作用的根本问题。因此,作为 DeltaIV 答案的重要脚注,我想根据过去 2 年的最新研究将其包括在内。神经网络的过度拟合不仅与模型过度记忆有关,还与模型无法学习新事物或处理异常有关。
检测黑盒模型中的过度拟合:模型的可解释性直接与您判断模型泛化能力的能力有关。因此,许多可解释的图都是检测过拟合的方法,可以告诉你上面建议的任何方法的效果如何。可解释性图直接检测到它,尤其是在您比较验证图和测试结果图时。这本未出版的书的第 5 章和第 6 章讨论了过拟合领域检测的最新进展:可解释建模
根据这本书,我想提一下其他三种检测和消除过拟合的方法,这对某些人来说可能很明显,但我个人发现人们经常忘记这些。因此,如果不是一个想法,我想强调它们:
特征选择检测:模型具有的参数数量和特征越少越好。因此,如果您只包括 1 亿个中的重要部分(可能有 7500 万个),您将拥有一个更好的泛化模型。问题是许多神经网络在特征选择方面并不完美,尤其是当 #2 存在时。Bootstrap 或 Boosting 从根本上无法同时解决这两个问题(只有一个名为 wild bootstrap 的版本可以)。简单来说,如果你给你神经网络垃圾数据,那么它就会给你垃圾。(上面提到的 L2 Normalization 非常擅长帮助解决这个问题)
检测和处理异常: “异常值”越少,模型越通用。“异常值”不仅指数据中的异常值。数据中的异常值(如您在箱线图中看到的那种)对于神经网络来说是一个过于狭隘的定义。您还需要考虑模型误差中的异常值(称为影响)以及其他异常情况。因此,在运行网络之前检测异常非常重要。神经网络可以对一种类型的异常具有鲁棒性,但不能对所有其他类型的异常具有鲁棒性。反例方法、批评方法、对抗性示例方法和影响图非常适合帮助您发现异常值,然后弄清楚如何将它们考虑在内。(即更改参数甚至删除一些数据)
基于统计或伦理考虑的分层抽样、过抽样和欠抽样:我希望我是欠抽样和过抽样方面的专家,但我不是,但我知道分层抽样。对重要因素(例如种族、性别、性别)进行聚类,然后按聚类进行分层抽样对于在考虑大数据时不过度拟合至关重要。在进行图像检测时,在某些领域法律要求分层抽样与聚类相结合,以避免种族歧视。上面链接的书简要介绍了执行此操作的方法。
PS我应该包含更多链接吗?