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