通过噪声训练神经网络以减少过拟合

使用小型数据集训练神经网络可能导致网络记住所有训练样本,从而导致过拟合以及在保留数据集上表现不佳。

鉴于高维输入空间中点的稀疏或不均匀采样,小型数据集也可能代表神经网络学习更困难的映射问题。

一种使输入空间更平滑且更易于学习的方法是在训练期间向输入添加噪声。

在这篇文章中,您将发现,在训练期间向神经网络添加噪声可以提高网络的鲁棒性,从而带来更好的泛化能力和更快的学习速度。

阅读本文后,你将了解:

  • 小型数据集可能会使神经网络的学习变得困难,并且样本可能会被记住。
  • 在训练期间添加噪声可以使训练过程更健壮,并减少泛化误差。
  • 噪声传统上添加到输入中,但也可以添加到权重、梯度甚至激活函数中。

用我的新书《更好的深度学习》来启动你的项目,书中包含分步教程和所有示例的 Python 源代码文件

让我们开始吧。

Train Neural Networks With Noise to Reduce Overfitting

通过噪声训练神经网络以减少过拟合
图片由John Flannery提供,保留部分权利。

概述

本教程分为五个部分;它们是:

  1. 小型训练数据集的挑战
  2. 在训练期间添加随机噪声
  3. 如何以及在哪里添加噪声
  4. 在训练期间添加噪声的示例
  5. 在训练期间添加噪声的技巧

小型训练数据集的挑战

训练大型神经网络时,小型数据集可能会带来问题。

第一个问题是网络可能有效地记住了训练数据集。模型可能学习的是特定的输入示例及其相关的输出,而不是学习从输入到输出的通用映射。这将导致模型在训练数据集上表现良好,但在新数据(例如保留数据集)上表现不佳。

第二个问题是,小型数据集提供的机会较少,无法描述输入空间的结构及其与输出的关系。更多的训练数据提供了对问题的更丰富描述,模型可以从中学习。更少的数据点意味着输入空间可能不是平滑的,而是呈现出一种不和谐且不连贯的结构,这可能导致映射函数难以学习,甚至无法学习。

并非总是能够获取更多数据。此外,获取更多数据可能无法解决这些问题。

在训练期间添加随机噪声

一种改善泛化误差和映射问题结构的方法是添加随机噪声。

许多研究[…]指出,向训练数据中添加少量输入噪声(抖动)通常有助于泛化和容错。

— 第273页,《神经网络锻造:前馈人工神经网络中的监督学习》,1999年。

起初,这听起来像是让学习更具挑战性的方法。这是一个反直觉的提高性能的建议,因为人们会认为噪声会降低模型在训练期间的性能。

启发式地,我们可能期望噪声会“涂抹”每个数据点,使网络难以精确拟合单个数据点,从而减少过拟合。在实践中,已经证明用噪声进行训练确实可以改善网络的泛化能力。

— 第347页,《用于模式识别的神经网络》,1995年。

在神经网络模型训练期间添加噪声具有正则化效果,进而提高了模型的鲁棒性。它已被证明对损失函数具有与添加惩罚项类似的影响,就像权重正则化方法一样。

众所周知,在训练期间向神经网络的输入数据添加噪声,在某些情况下,可以显著提高泛化性能。先前的研究表明,这种带噪声的训练等同于一种正则化形式,其中误差函数中添加了一个额外的项。

带噪声训练等效于Tikhonov正则化,2008年。

实际上,添加噪声扩大了训练数据集的大小。每次将训练样本暴露给模型时,都会向输入变量添加随机噪声,使它们每次暴露给模型时都不同。通过这种方式,向输入样本添加噪声是数据增强的一种简单形式。

向神经网络输入中注入噪声也可以看作是数据增强的一种形式。

— 第241页,《深度学习》,2016年。

添加噪声意味着网络更难记住训练样本,因为它们一直在变化,这会导致网络权重更小,以及一个更健壮、泛化误差更小的网络。

这种噪声意味着仿佛是从已知样本附近的域中提取新样本,从而平滑了输入空间的结构。这种平滑可能意味着映射函数更易于网络学习,从而导致更好、更快的学习。

……输入噪声和权重噪声分别促使神经网络输出成为输入或其权重的平滑函数。

在反向传播训练期间添加噪声对泛化性能的影响,1996年。

想要通过深度学习获得更好的结果吗?

立即参加我为期7天的免费电子邮件速成课程(附示例代码)。

点击注册,同时获得该课程的免费PDF电子书版本。

如何以及在哪里添加噪声

训练期间最常用的噪声类型是向输入变量添加高斯噪声。

高斯噪声,或白噪声,其均值为零,标准差为一,可以使用伪随机数生成器按需生成。向神经网络输入中添加高斯噪声传统上被称为“抖动”或“随机抖动”,这是信号处理中用来指代电路中不相关随机噪声的术语。

添加的噪声量(例如,扩散或标准差)是一个可配置的超参数。噪声过少没有效果,而噪声过多会使映射函数学习起来过于困难。

这通常通过在每个输入模式呈现给网络之前向其添加一个随机向量来完成,这样,如果模式被循环利用,每次都会添加一个不同的随机向量。

带噪声训练等效于Tikhonov正则化,2008年。

随机噪声的标准差控制扩散量,并可以根据每个输入变量的比例进行调整。如果输入变量的比例已先归一化,则配置起来会更容易。

噪声仅在训练期间添加。在模型评估期间或模型用于对新数据进行预测时,不添加噪声。

添加噪声也是自动特征学习的重要组成部分,例如在自编码器(所谓的去噪自编码器)的情况下,它们明确要求模型在存在添加到输入的噪声的情况下学习鲁棒特征。

我们已经看到,单独的重构准则无法保证提取有用的特征,因为它可能导致明显的解决方案“简单地复制输入”或类似不有趣的解决方案,这些解决方案仅仅最大化互信息。[...] 我们将重构准则更改为一个更具挑战性和更有趣的目标:清理部分损坏的输入,或简称为去噪。

堆叠去噪自编码器:使用局部去噪准则在深度网络中学习有用表示,2010年。

尽管向输入中添加额外噪声是最常见和广泛研究的方法,但在训练期间也可以向网络的其他部分添加随机噪声。一些示例包括

  • 向激活函数添加噪声,即每层的输出。
  • 向权重添加噪声,即输入的替代方案。
  • 向梯度添加噪声,即更新权重的方向。
  • 向输出添加噪声,即标签或目标变量。

向层激活添加噪声允许在网络的任何点使用噪声。这对于非常深的网络可能是有益的。噪声可以直接添加到层输出本身,但这更可能通过使用有噪声的激活函数来实现。

向权重添加噪声允许该方法在整个网络中以一致的方式使用,而不是向输入和层激活添加噪声。这在循环神经网络中特别有用。

另一种用于正则化模型的方法是向权重添加噪声。这种技术主要用于循环神经网络的背景下。[...] 施加于权重的噪声也可以被解释为等同于(在某些假设下)一种更传统的正则化形式,鼓励所学函数的稳定性。

— 第242页,《深度学习》,2016年。

向梯度添加噪声更侧重于提高优化过程本身的鲁棒性,而不是输入域的结构。噪声量可以在训练开始时很高,并随着时间推移而减小,就像衰减的学习率一样。这种方法已被证明对于非常深的网络和各种不同类型的网络来说都是一种有效的方法。

在优化各种模型时,我们始终能看到注入梯度噪声带来的改进,包括非常深的完全连接网络,以及用于问答和算法学习的专用架构。[...] 我们的实验表明,通过衰减方差添加退火高斯噪声比使用固定高斯噪声效果更好。

添加梯度噪声可改善非常深网络的学习,2015年。

向激活函数、权重或梯度添加噪声都提供了一种更通用的噪声添加方法,它与提供给模型的输入变量类型无关。

如果问题领域被认为或预期存在错误标记的示例,那么向类别标签添加噪声可以提高模型对此类错误的鲁棒性。尽管如此,它也可能很容易破坏学习过程。

在回归或时间序列预测的情况下,向连续目标变量添加噪声与向输入变量添加噪声非常相似,并且可能是一个更好的用例。

在训练期间添加噪声的示例

本节总结了一些在训练期间添加噪声的示例。

Lasse Holmstrom 在1992年的论文《在反向传播训练中使用加性噪声》中对MLP中的随机噪声进行了分析和实验研究。他们建议首先对输入变量进行标准化,然后使用交叉验证来选择训练期间使用的噪声量。

如果应该建议一种通用的噪声设计方法,我们会选择最大化交叉验证似然函数。这种方法易于实现,完全由数据驱动,并且其有效性得到了理论一致性结果的支持。

Klaus Gref 等人在其2016年的论文《LSTM:一次搜索空间之旅》中,对一系列序列预测任务的输入变量高斯噪声标准差进行了超参数搜索,发现它几乎普遍导致性能下降。

在输入端添加高斯噪声,这是神经网络的传统正则化器,也已用于LSTM。然而,我们发现它不仅几乎总是会损害性能,还会略微增加训练时间。

Alex Graves 等人在他们开创性的2013年论文《使用深度循环神经网络进行语音识别》中,在训练期间向LSTM的权重添加了噪声,该论文在当时实现了语音识别领域的最新成果。

……使用了权重噪声(在训练期间向网络权重添加高斯噪声)。权重噪声是每训练序列添加一次,而不是在每个时间步添加。权重噪声倾向于“简化”神经网络,即减少传输参数所需的信息量,从而提高泛化能力。

在2011年的一篇研究不同类型静态和自适应权重噪声的论文《神经网络的实用变分推断》中,Graves 建议将早期停止与LSTM中的权重噪声结合使用。

……在实践中,当使用权重噪声进行训练时,需要提前停止以防止过拟合。

在训练期间添加噪声的技巧

本节提供了一些在神经网络训练期间添加噪声的技巧。

添加噪声的问题类型

无论处理何种类型的问题,都可以在训练中添加噪声。

尝试向分类和回归类型问题中添加噪声是合适的。

噪声类型可以根据用作模型输入的数据类型进行专门化,例如,图像情况下的二维噪声和音频数据情况下的信号噪声。

向不同网络类型添加噪声

在训练期间添加噪声是一种通用方法,无论使用何种类型的神经网络都可以使用。

它主要用于多层感知器,因为它们在过去占据主导地位,但也可以并且已经用于卷积神经网络和循环神经网络。

首先重新缩放数据

重要的是,添加噪声对模型具有一致的影响。

这要求对输入数据进行重新缩放,使所有变量具有相同的比例,这样当以固定方差向输入添加噪声时,它具有相同的效果。这也适用于向权重和梯度添加噪声,因为它们也受到输入尺度的影响。

这可以通过输入变量的标准化或归一化来实现。

如果在数据缩放后添加随机噪声,则可能需要再次重新缩放变量,可能每个小批量进行一次。

测试噪声量

您无法知道多少噪声会使您的特定模型在您的训练数据集上受益。

尝试不同数量甚至不同类型的噪声,以发现哪种效果最好。

系统地使用受控实验,可能在不同值范围内的较小数据集上进行。

仅限有噪声训练

噪声仅在模型训练期间添加。

确保在模型评估期间或模型用于对新数据进行预测时,不添加任何噪声源。

进一步阅读

如果您想深入了解,本节提供了更多关于该主题的资源。

书籍

论文

文章

总结

在这篇文章中,您发现,在训练期间向神经网络添加噪声可以提高网络的鲁棒性,从而带来更好的泛化能力和更快的学习速度。

具体来说,你学到了:

  • 小型数据集可能会使神经网络的学习变得困难,并且样本可能会被记住。
  • 在训练期间添加噪声可以使训练过程更健壮,并减少泛化误差。
  • 噪声传统上添加到输入中,但也可以添加到权重、梯度甚至激活函数中。

你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。

今天就开发更好的深度学习模型!

Better Deep Learning

更快地训练,减少过拟合,以及集成方法

...只需几行python代码

在我的新电子书中探索如何实现
更好的深度学习

它提供关于以下主题的自学教程
权重衰减批量归一化dropout模型堆叠等等...

为你的项目带来更好的深度学习!

跳过学术理论。只看结果。

查看内容

用噪声训练神经网络以减少过拟合的33条回复

  1. 许张 2018年12月12日上午10:56 #

    非常感谢您的精彩文章。如果有一个使用这种技术来提高性能的示例,那将非常有帮助。

  2. Bobby 2018年12月23日上午7:25 #

    这是一篇很棒的文章。我真的很喜欢!

  3. Pradip 2019年2月4日下午10:14 #

    嗨,Jason,我正在尝试在生物数据中同时预测年龄和性别。对于年龄,我正在使用回归算法;对于性别,我正在使用分类算法。我正在尝试将这两种算法结合到神经网络中,但不知道如何操作。如果您有任何示例或链接可以分享以解决上述问题,那将非常棒。

    另外,我正在尝试对相同问题使用自编码器。您能否告诉我,它是否有助于解决上述问题,并请分享任何示例。

    • Jason Brownlee 2019年2月5日上午8:22 #

      将模型分开可能更容易。我还没有见过具有不同类型输出的多输出模型。我预计损失函数的选择将是症结所在。

      我不确定自编码器对您的预测问题有什么用处?

  4. Mohammed 2019年3月3日下午10:33 #

    权重(卷积核)添加噪声是否等同于输入数据添加噪声?

    • Jason Brownlee 2019年3月4日上午7:00 #

      类似,但不等同,除非您只向输入权重添加噪声——那样就是同一回事了。

  5. Kenneth Afebu 2019年4月21日下午3:58 #

    嗨,Jason,
    我非常感谢您在这里所做的出色工作,谢谢。

    请问我想在我的训练数据中添加高斯白噪声,并且存在在添加噪声之前测量信号功率的问题,请问这与不测量信号功率而添加噪声有何不同;以及哪种方法更适合向数据添加噪声,是后者还是前者?

    另一个问题
    有些人认为噪声应该同时添加到训练、验证和测试数据中,因为在现实世界中噪声会影响所有数据。

    您对深度学习中用于向数据添加噪声的合适信噪比有什么看法吗?

    谢谢

    • Jason Brownlee 2019年4月22日上午6:16 #

      你为什么要测量添加噪声的功率?

      我建议只在训练期间添加噪声。

  6. Henry 2019年5月8日下午8:00 #

    嗨,Jason,

    感谢您的精彩文章。
    对我真的很有帮助。

    但是,我有一个关于数据重新缩放的问题。

    我的理解是,第一步是标准化(或归一化)所有样本。

    在此步骤中,当使用标准化时,验证或测试样本使用训练样本的均值(以及训练样本的标准差)进行缩放。

    第二步是向训练样本添加噪声。

    第三步是再次对所有样本进行重新缩放(标准化或归一化)吗?
    这是否意味着验证和测试样本将使用训练样本的新均值进行重新缩放?
    我对此有点困惑。

    谢谢你。

    • Jason Brownlee 2019年5月9日上午6:39 #

      我不确定我理解你提到的第三步。

      输入和输出数据都经过缩放。
      你可以在训练期间向模型添加噪声。
      如果输出数据经过缩放,你可以在进行预测后反转缩放,以便利用输出或以自然单位计算误差。

  7. R.Yuan 2019年5月15日上午3:03 #

    非常感谢 Jason。

    我做了我的硕士毕业项目关于“神经网络训练中的噪声”,您的文章在开始时给了我很大的背景理解。

    完成项目后,我认为应用噪声训练的最大问题是通常很难量化噪声的影响,因此在没有实验的情况下很难决定添加噪声的水平。

    再次感谢这篇文章。

  8. Mahsa 2020年7月2日下午10:58 #

    读得很开心!

    感谢这篇文章!

    我想知道您是否碰巧知道任何使用向分类任务标签添加噪声的参考文章?
    我似乎只能找到那些向输入、权重、梯度或隐藏层添加噪声的文章。我很难找到向标签(或神经网络输出)添加噪声的参考文献。

    谢谢。

    • Jason Brownlee 2020年7月3日上午6:17 #

      在较老的神经网络书籍中很常见,我认为它在GAN中也有使用,被称为标签翻转或标签噪声。

  9. vian 2020年12月8日上午5:06 #

    请提供重新缩放的 Python 代码。

  10. vian 2020年12月8日下午10:22 #

    非常感谢您,Jason先生。
    您说:“如果在数据缩放后添加随机噪声,则可能需要再次重新缩放变量,可能每个小批量进行一次。”
    如果我在缩放后添加了噪声,如何再次缩放?这就是我之前问过的

  11. vian 2020年12月9日 上午7:15 #

    谢谢你的帮助

  12. Vian 2021年1月10日 上午9:12 #

    请问,如果我使用均值为0,标准差为0.1的高斯噪声,那么高斯噪声公式中变量的范围是多少?非常感谢

  13. Jeroen 2021年2月21日 上午9:46 #

    嗨,Jason,

    感谢您的博客,它对我的机器学习之旅帮助很大。

    我有一个问题:在变分自编码器中,在SELU激活单元之前应用高斯噪声,它会破坏自归一化特性,还是实际上与SELU非常匹配?

    如果这是一个问题,如何规避它?

    • Jason Brownlee 2021年2月21日 下午12:40 #

      不客气!

      好问题,我暂时不知道答案,抱歉——我想这取决于具体情况。也许你可以通过实验来找到答案?

  14. Fars Samann 2022年3月14日 上午10:10 #

    感谢Jason先生的精彩帖子。
    我注意到使用包含不同噪声水平的受损训练数据集训练自编码器,这可以提高AE的性能。
    此致

  15. Anni 2023年3月8日 晚上9:05 #

    非常感谢您的帖子!我喜欢您安排材料的方式,一种带有参考文献的简短调查。
    我对图像应用领域中的去噪自编码器更感兴趣——图像去噪、图像重建、图像到图像。由于大多数工作都是实验性的而不是理论性的,因此关于如何应用噪声及其影响有很多问题。
    其中一个问题比较实际,图像在[0,1]范围内,添加噪声会使输入超出此范围。有不同的替代方案,例如
    (1) 不关心,因为数据是浮点型,但数据范围不平衡,这不是一个好方法。
    (2) 裁剪到[0,1],但这表示改变了分布。顺便说一下,大多数 PyTorch、TensorFlow 官方网站都使用这种方法。
    (3) 添加噪声后将数据缩放到[0,1](这不是一个好方法,因为它在测试中使用时会导致图像拉伸/饱和)。
    (4) 裁剪高斯噪声。
    您知道是否有人系统地研究过这个问题吗?我搜索的结果是负面的……。
    第二个问题是,如果将干净图像与干净图像对以及噪声图像与干净图像对一起使用,或者添加不同标准差的噪声图像对会发生什么?或者,在整个图像中使用相同的标准差,或者每个像素略有不同或完全不同有多重要?

    我们知道什么时候添加噪声不好吗?

    此外,将此参考文献添加到您的帖子中会很棒
    @misc{https://doi.org/10.48550/arxiv.1305.6663,
    doi = {10.48550/ARXIV.1305.6663},

    url = {https://arxiv.org/abs/1305.6663},

    author = {Bengio, Yoshua and Yao, Li and Alain, Guillaume and Vincent, Pascal},

    keywords = {机器学习 (cs.LG), FOS: 计算机与信息科学, FOS: 计算机与信息科学},

    title = {作为生成模型的广义去噪自编码器},

    publisher = {arXiv},

    year = {2013},

    copyright = {arXiv.org 永久、非独占许可}
    }

    • James Carmichael 2023年3月9日 上午9:36 #

      你好 Anni……请将你的问题缩小到一个,以便我们更好地帮助你。

      • Anni 2023年3月12日 晚上8:59 #

        问题是
        (1) 如何正确归一化图像以进行图像去噪/重建任务
        (2) 如何正确添加噪声,使用什么标准差

        实际上,我找到了一篇很好的论文阐明了这个问题:https://arxiv.org/pdf/1710.04026.pdf
        第4页B节很有趣。
        非常感谢。

发表评论

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。