当我的神经网络不能很好地泛化时该怎么办?


36

我正在训练一个神经网络,训练损失减少了,但是验证损失却没有,或者减少的程度比我预期的要少,这是基于具有非常相似的体系结构和数据的参考或实验得出的。我怎样才能解决这个问题?


至于问题

当我的神经网络不学习时该怎么办?

受此问题启发,该问题被故意保留为通用,以便可以将其他有关如何将神经网络的泛化误差降低到已证明可达到的水平的问题作为该问题的副本来解决。

另请参阅有关Meta的专用线程:

是否存在一个通用问题,我们可以将以下类型的问题重定向到“为什么我的神经网络不能很好地泛化?”


4
如果您打算发布自己的综合答案,那么最好同时发布Q和A(用户界面允许这样做)。否则,您会鼓励其他人编写答案,而我们最终可能会得到几个可以部分重复的答案...总之,期待您的答案。
变形虫说恢复莫妮卡

@amoeba啊,我不知道:当我尝试回答问题时,UI会打开一个弹出窗口,因此,我认为无法将问答集发布在一起。...好吧,如果有人写出更好/更多的文章完整的答案比我要写的要完整,我只会避免添加重复的答案。
DeltaIV

Answers:


37

首先,让我们说一下“我的神经网络不能很好地概括”是什么意思,与说“我的神经网络不能很好地表现”有什么区别。

训练神经网络时,您会不断地对称为训练集的一组标记数据进行评估。如果您的模型无法正常运行,并且似乎无法从训练集中学习,那么您还没有泛化问题,请参阅这篇文章。但是,如果您的模型在训练集上表现出令人满意的性能,但是在以前看不见的数据(例如,验证/测试集)上却不能很好地表现出来,那么您确实会遇到泛化问题。

为什么您的模型无法正确概括?

最重要的部分是了解为什么您的网络不能很好地推广。大容量机器学习模型具有记忆训练集的能力,这可能导致过度拟合

过度拟合是指估算器开始非常好地学习训练集的状态,以至于它开始对训练样本中的噪声进行建模(除所有有用的关系之外)。

例如,在下面的图像中,我们可以看到蓝线明显过大。

但是为什么这不好?

当尝试根据以前看不见的新数据(即验证/测试集)评估模型时,模型的性能将比我们预期的要差得多。

如何防止过度拟合?

在文章的开头,我暗示您的模型的复杂性实际上是导致过度拟合的原因,因为它允许模型从训练集中提取不必要的关系,从而映射其固有噪声。减少过度拟合的最简单方法是从本质上限制模型的容量。这些技术称为正则化技术。

  • 参数规范惩罚。这些参数为每个模型的权重更新功能增加了一个额外的术语,具体取决于参数的范数。该术语的目的是应对实际更新(即限制每个权重可以更新多少)。这使模型对异常值和噪声更健壮。此类正则化的示例是L1和L2正则化,可以在LassoRidgeElastic Net回归变量上找到它们。
    由于神经网络中的每个(完全连接的)层的功能都非常类似于简单的线性回归,因此在神经网络中使用了这些层。最常见的用途是分别调整每个图层。
    keras实施

  • 早停下来。在开始对噪声进行建模之前,该技术尝试过早地停止估计器的训练阶段,即该阶段已学会从数据中提取所有有意义的关系。这是通过监测有效性损失(或者你选择的验证指标),并终止训练阶段时,这个指标停止提高。这样,我们就给估算器足够的时间来学习有用的信息,而没有足够的时间来学习噪声。
    keras实施

  • 神经网络特定的正则化。一些例子是:
    • 辍学辍学是一项非常有趣的有趣技术。在网络中的两个连续层之间应用Dropout。在每次迭代中,将丢弃连接两层的指定百分比的连接(随机选择)。这导致下一层依赖于它与上一层的所有连接。
      keras实现
    • 转移学习。这尤其在深度学习中使用。这是通过将网络的权重初始化为在大型通用数据集中预先训练的具有相同体系结构的另一个网络的权重来完成的。
    • 可能会限制深度神经网络过度拟合的其他因素包括:批量归一化,它可以充当调节器,并且在某些情况下(例如,初始模块)可以工作,也可以退出。SGD中相对较小的批次,也可以防止过度拟合;在隐藏层的权重添加小的随机噪声

除了限制模型的容量之外,另一种防止过度拟合的方法是提高数据质量。最明显的选择是离群值/噪声消除,但是在实践中它们的用途是有限的。一种更常见的方式(尤其是在与图像有关的任务中)是数据增强。在这里,我们尝试对训练样本进行随机变换,以使它们在模型中看起来不同,但它们传达的语义信息相同(例如,在图像上左右翻转)。
数据扩充概述

实用建议:

  • 到目前为止,最有效的正则化技术是dropout,这意味着它应该是您应该首先使用的。但是,您不需要(也不应该)在任何地方放置辍学!过度拟合最容易发生的层是完全连接(FC)层,因为它们包含最多的参数。辍学应该应用于这些层(影响它们与下一层的连接)。
  • 批处理归一化除了具有正则化效果外,还可以通过其他几种方式来帮助您的模型(例如,加快收敛速度​​,允许使用更高的学习率)。它也应该在FC层中使用。
  • 如前所述,在训练阶段比计划的阶段更早停止模型也可能是有益的。提前停止的问题是,无法保证在任何给定的时间点,模型都不会再次开始改进。比早期停止更实用的方法是存储在验证集上获得最佳性能的模型权重。但是请务必谨慎,因为这并不是对模型性能的公正估计(仅比训练集更好)。您也可以在验证集上过度拟合。以后再说。
    keras实现
  • 在某些应用程序(例如,与图像相关的任务)中,强烈建议遵循已经建立的体系结构(例如,VGG,ResNet,Inception),您可以为其找到ImageNet权重。此数据集的通用性质允许特征依次通用到足以用于任何与图像相关的任务。除了对过度拟合具有鲁棒性之外,这还将大大减少培训时间。
    相似概念的另一种用法如下:如果您的任务没有很多数据,但是您可以找到另一个相似的任务,则可以使用迁移学习来减少过度拟合。首先为网络训练具有较大数据集的任务,然后尝试进行微调符合您最初想要的模型。在大多数情况下,初始训练将使您的模型对过度拟合更具鲁棒性。
  • 数据扩充。尽管拥有更大的数据集总是有帮助的,但是数据增强技术确实有其缺点。更具体地说,您必须注意不要过度增强,因为这可能会破坏数据的语义内容。例如,在图像增强中,如果您过多地平移/移动/缩放或调整亮度/对比度,则会丢失其中包含的许多信息。此外,需要针对每个任务以临时方式实施增强方案(例如,在手写数字识别中,数字通常对齐并且不应旋转太多;也不应沿任何方向翻转,因为它们不是水平/垂直对称的(医学图像也是如此)。
    简而言之,请注意不要通过数据扩充来产生不真实的图像。此外,增加数据集大小将需要更长的训练时间。就个人而言,当我发现模型在训练集上的损失接近时,我便开始考虑使用数据增强。0

9

有大量的经验证据表明,足够深的神经网络可以记住大量数据集上的随机标签(张驰元,Samy Bengio,Moritz Hardt,Benjamin Recht,Oriol Vinyals,“了解深度学习需要重新考虑泛化”)。因此,原则上,通过获得足够大的NN ,无论任务多么无意义,我们始终可以将训练误差减小到极小的值,而在实践中受到数值精度的限制。

对于泛化错误,情况大不相同。我们不能确定对于每个学习问题,都存在一个可学习的NN模型,该模型可以产生所需的低泛化误差。因此,第一步是

1.正确设定您的期望

在您的数据集或最相似的参考文献上,找到一个信誉良好的参考文献,告诉您存在一种可以达到您正在寻找的泛化错误的体系结构。例如看这里

当前最新的卷积神经网络是什么?

查找在各种任务上CNN的最新SOTA(最新技术水平)性能。在训练自己的数据集之前,最好尝试在这些参考数据集上重现这样的结果,以测试所有基础架构是否正确到位。

2.确保您的培训程序无缺陷

问题答案中描述的所有检查

当我的神经网络不学习时该怎么办?

确保您的训练程序正常,这是成功减少泛化误差的前提(如果您的NN不学习,则无法学习泛化)。这些检查包括:

  • 单元测试
  • 数据集检查(查看训练集和测试集的一些随机输入/标签样本,并检查标签是否正确;检查输入图像的宽度和大小;对训练/测试集中的样本进行混洗,看看是否有影响结果;等)
  • 随机检验
  • 标准化您的预处理和程序包版本
  • 保留数值实验记录

3.尝试获得超收敛

Leslie N. Smith和Nicholay Topin的“超级收敛:使用大学习率对神经网络进行非常快速的训练”表明,在某些情况下,大学习率与Leslie N. Smith的周期性学习率方法的组合可以作为正则化函数,将收敛速度提高一个数量级,并减少了对大量正则化的需求。因此,在尝试之前这是一件好事

4.将您的正则化设置为MAXXX

正则化通常会增加训练时间(不好),增加训练误差并减少泛化误差(好的),但是过多的正则化实际上会增加两个误差(拟合不足)。因此,由于训练时间的增加,成功地使训练集过拟合之后,最好一次一次引入各种正则化技术。请注意,正则化本身并不一定意味着您的泛化误差会变小:模型必须具有足够大的容量才能实现良好的泛化属性。这通常意味着您需要足够深的网络,然后才能看到正则化的好处。

最古老的正则化方法可能是提早停止和体重减轻。其他一些:

  • 减少批处理大小:较小的批处理大小通常与较小的泛化误差相关,因此可以尝试一下。但是,请注意,有人对微型批次的实用性提出了质疑:以我的经验,它们可以提供帮助(只要您不必使用疯狂的小尺寸,例如),但是Elad Hoffer,Itay Hubara,Daniel Soudry Train的使用时间更长,更好地泛化:弥合神经网络的大批量训练中的泛化差距是不同的。请注意,如果您使用批处理规范(请参阅下文),那么小批处理将非常有害。m=16
  • 使用SGD而不是自适应优化器:@shimao已经介绍了此问题,因此,出于完整性考虑,我仅提及它
  • 使用dropout:如果使用LSTM,则仅将标准dropout用于LSTM层的输入和输出单元。对于递归单元(门),请使用递归辍学,如Yarin Gal 在其博士学位中首次展示的那样论文。但是,如果使用CNN,则现在不经常使用辍学。相反,您倾向于…
  • ...使用批处理规范化:最新的CNN架构避开了辍学,转而支持批处理规范化。这可能只是一时的流行,或者可能是由于显然辍学和批处理规范化并不能很好地配合使用(李翔,陈硕,胡小林,杨健,《通过方差了解辍学与批处理规范化之间的不和谐》) Shift)。由于当您拥有大量数据集时批处理规范比退出更有效,因此这可能是为什么退出对CNN架构不利的原因。如果使用批量归一化,请验证每层的权重和偏差分布看起来近似于标准正态。对于RNN,实施批量规范非常复杂:权重归一化(Tim Salimans,Diederik P. Kingma,权重归一化:通过简单的重新参数化来加速深度神经网络的训练是一种可行的选择。
  • 使用数据扩充:它还具有正则化效果。

5.超参数/架构搜索

如果没有其他帮助,则您将不得不测试多个不同的超参数设置(贝叶斯优化可能会在此处提供帮助)或多个不同的架构更改(例如,可能在您的GAN架构中以及对于您正在处理的数据集而言),批处理规范仅适用于生成器,但当添加到鉴别器时也会使情况变得更糟)。确保在井井有条的日志中跟踪这些漫长而无聊的实验的结果。

PS for GAN谈论泛化错误并没有多大意义:上面的示例仅是为了表明深度学习中仍有许多炼金术,您希望它可以很好地工作,有时却不会并非如此,反之亦然,某些可以正常运行的事情突然间就向您求购了新的数据集。


5

我在文献中看到的常用正则化技术列表如下:

  1. 使用批归一化,这是一个令人惊讶的有效正则化器,以至于我几乎不再看到辍学了,因为根本没有必要。
  2. 少量的重量衰减。
  3. 一些较新的正则化技术包括Shake-shaake(Xavier Gastaldi的“ Shake-Shake正则化”)和Cutout(Terrance DeVries和Graham W. Taylor的“具有Cutout的卷积神经网络的改进正则化”)。特别是,实施Cutout的便捷性使其非常有吸引力。我相信这些方法比辍学效果更好-但我不确定。
  4. 如果可能,与具有完全连接的层的体系结构相比,更喜欢全卷积体系结构。将在单个完全连接层中具有1亿个参数的VGG-16与具有层数的10倍且参数更少的Resnet-152进行比较。
  5. 首选SGD而不是Rmsprop和Adam之类的其他优化器。它显示出更好的概括。(Nitish Shirish Keskar和Richard Socher撰写的“通过从Adam转换为SGD来提高通用性能”)

0

我觉得Djib2011可以很好地说明自动化方法,但是它们并没有真正解决我们如何知道用于减少过度拟合的方法是否奏效的根本问题。因此,作为DeltaIV答案的重要脚注,我想根据最近两年的最新研究结果将其包括在内。对于神经网络的过度拟合不仅与模型记忆过度有关,还与模型无法学习新事物或处理异常有关。

在黑匣子模型中检测过度拟合:模型的可解释性直接取决于您对模型的概括能力的了解程度。因此,许多可解释的图都是检测过度拟合的方法,它们可以告诉您以上建议的任何方法的效果如何。可解释性图直接检测到它,特别是如果您比较验证图和测试结果图。这本未出版的书的第5章和第6章谈论过拟合领域检测的最新进展:可解释的建模

基于这本书,我想提一下其他一些检测和消除过度拟合的方法,这对于某些人可能是显而易见的,但我个人发现人们经常忘记这些方法。因此,我想强调一下他们的想法:

  1. 特征选择检测:参数越少,模型具有的特征越少越好。因此,如果仅包含1亿个重要的数字(也许有7千5百万个数字),那么您将拥有一个更好的可推广模型。问题在于,许多神经网络在特征选择上并不完美,特别是当存在#2时。Bootstrap或Boosting从根本上不能解决这两个问题(只能使用称为wild bootstrap的版本)。用简单的话来说,如果您给您神经网络垃圾数据,那么它将把您垃圾出去。(上面提到的L2 Normalization非常有助于解决此问题)

  2. 检测和处理异常: “异常值”越少,模型的可推广性越强。所谓“离群值”,不只是指数据中的离群值。对于神经网络来说,数据中的离群值(就像您用箱形图看到的那样)是太狭窄的定义。您还需要考虑模型误差中的异常值(称为影响)以及其他异常。因此,在运行网络之前检测异常很重要。神经网络对于一种类型的异常可能是鲁棒的,但对于所有其他类型的异常却不是鲁棒的。反例方法,批评方法和对抗性方法以及影响图可以很好地帮助您发现异常值,然后弄清楚如何将其纳入考虑范围(即更改参数甚至删除一些数据)。

  3. 基于统计或伦理考虑的分层采样,过度采样和欠采样:我希望我是欠采样和过度采样方面的专家,但我不是,但我知道分层采样。对重要因素(例如(种族,性别,性别))进行聚类,然后按聚类进行分层抽样,对于在考虑大数据时不会过拟合至关重要。在进行图像检测时,某些领域在法律上要求分层采样和聚类相结合,以避免种族歧视。上面链接的书简要讨论了执行此操作的方法。

PS我应该包括更多链接吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.