深度学习神经网络的集成学习方法

如何通过组合多个模型的预测来提高性能。

深度学习神经网络是非线性方法。

它们提供了更大的灵活性,并且可以根据可用训练数据的量进行扩展。这种灵活性带来的一个缺点是,它们通过随机训练算法学习,这意味着它们对训练数据的具体细节很敏感,每次训练时可能会找到不同的权重集,这反过来又会产生不同的预测。

通常,这被称为神经网络具有高方差,在尝试开发最终模型以进行预测时,这可能会令人沮丧。

减少神经网络模型方差的一种成功方法是训练多个模型而不是单个模型,并结合这些模型的预测。这称为集成学习,它不仅可以减少预测的方差,还可以产生比任何单个模型都更好的预测。

在这篇文章中,您将发现用于深度学习神经网络的方法,以减少方差并提高预测性能。

阅读本文后,你将了解:

  • 神经网络模型是非线性的且具有高方差,这在准备用于预测的最终模型时可能会令人沮丧。
  • 集成学习结合了多个神经网络模型的预测,以减少预测的方差并降低泛化误差。
  • 集成学习技术可以根据变化的元素进行分组,例如训练数据、模型以及如何组合预测。

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

让我们开始吧。

Ensemble Methods to Reduce Variance and Improve Performance of Deep Learning Neural Networks

集成方法减少深度学习神经网络的方差并提高性能
图片由 旧金山大学表演艺术系 提供,保留部分权利。

概述

本教程分为四个部分;它们是

  1. 神经网络模型的高方差
  2. 使用模型集成来减少方差
  3. 如何集成神经网络模型
  4. 集成技术总结

神经网络模型的高方差

训练深度神经网络在计算上可能非常昂贵。

在数百万个示例上训练的非常深的网络可能需要数天、数周,有时甚至数月才能训练完成。

谷歌的基线模型 […] 是一个深度卷积神经网络 […],它已经使用异步随机梯度下降在大批核心上训练了大约六个月。

《蒸馏神经网络中的知识》,2015年。

在投入如此多的时间和资源之后,不能保证最终模型将具有低泛化误差,在训练期间未见的示例上表现良好。

……训练许多不同的候选网络,然后选择最好的,[…]并丢弃其余的。这种方法有两个缺点。首先,训练其余网络所涉及的所有努力都浪费了。其次,[…]在验证集上表现最好的网络可能不是在新的测试数据上表现最好的网络。

— 《模式识别神经网络》第364-365页,1995年。

神经网络模型是一种非线性方法。这意味着它们可以学习数据中复杂的非线性关系。这种灵活性带来的一个缺点是,它们对初始条件敏感,无论是初始随机权重还是训练数据集中的统计噪声。

学习算法的这种随机性意味着,每次训练神经网络模型时,它都可能学习到输入到输出的映射函数的一个略微(或显著)不同的版本,这反过来又会在训练集和保留集上产生不同的性能。

因此,我们可以将神经网络视为一种具有低偏差和高方差的方法。即使在大型数据集上进行训练以满足高方差,最终模型中任何旨在用于进行预测的方差都可能令人沮丧。

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

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

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

使用模型集成来减少方差

解决神经网络高方差的一种方法是训练多个模型并结合它们的预测。

这个想法是结合多个良好但不同的模型的预测。

一个好的模型具有技能,这意味着它的预测优于随机机会。重要的是,模型必须以不同的方式表现良好;它们必须做出不同的预测错误。

模型平均之所以有效,是因为不同的模型通常不会在测试集上犯相同的错误。

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

结合多个神经网络的预测会增加一个偏差,这反过来又抵消了单个训练神经网络模型的方差。结果是预测对训练数据的具体细节、训练方案的选择以及单个训练运行的偶然性不那么敏感。

除了减少预测中的方差之外,集成还可以产生比任何单个最佳模型都更好的预测。

……委员会的性能可能优于单独使用的最佳单个网络的性能。

— 《模式识别神经网络》第365页,1995年。

这种方法属于“集成学习”的一般类别,该类别描述了旨在充分利用为相同问题准备的多个模型预测的方法。

通常,集成学习涉及在同一数据集上训练多个网络,然后使用每个训练好的模型进行预测,最后以某种方式组合预测以得出最终结果或预测。

事实上,模型集成是应用机器学习中的标准方法,以确保做出最稳定和最佳的预测。

例如,Alex Krizhevsky等人在其著名的2012年论文《ImageNet 深度卷积神经网络分类》中(该论文介绍了用于照片分类的非常深的卷积神经网络,即AlexNet)使用多个表现良好的CNN模型的模型平均来实现在当时最先进的结果。将一个模型的性能与两个、五个和七个不同模型的平均集成预测进行了比较。

对五个类似CNN的预测进行平均,错误率为16.4%。[…] 将两个预训练的CNN […] 与上述五个CNN的预测进行平均,错误率为15.3%。

集成也是机器学习竞赛获胜者使用的方法。

获得任务最佳结果的另一种强大技术是模型集成。[…] 如果您查看机器学习竞赛,特别是Kaggle上的竞赛,您会发现获胜者使用非常大的模型集成,这些集成不可避免地胜过任何单个模型,无论它有多好。

— 《使用Python进行深度学习》第264页,2017年。

如何集成神经网络模型

对于神经网络而言,也许最古老且仍然最常用的集成方法是所谓的“网络委员会”。

在同一数据集上训练具有相同配置和不同初始随机权重的网络集合。然后使用每个模型进行预测,实际预测计算为预测的平均值。

集成中的模型数量通常保持较小,这既是因为训练模型的计算成本,也是因为增加集成成员在性能上的收益递减。集成可以小到三、五或十个训练好的模型。

集成学习领域得到了充分研究,这种简单主题有许多变体。

考虑改变集成方法的三个主要元素可能会有所帮助;例如:

  • 训练数据:改变用于训练集成中每个模型的数据选择。
  • 集成模型:改变集成中使用的模型选择。
  • 组合方式:改变集成成员结果的组合方式。

让我们依次仔细研究每个元素。

改变训练数据

可改变用于训练集成中每个成员的数据。

最简单的方法是使用 k 折交叉验证来估计所选模型配置的泛化误差。在此过程中,k 个不同的模型在 k 个不同的训练数据子集上进行训练。然后可以保存这 k 个模型并用作集成的成员。

另一种流行的方法涉及带替换地重新采样训练数据集,然后使用重新采样的数据集训练网络。重新采样过程意味着每个训练数据集的组成都不同,并且可能存在重复的示例,从而使在该数据集上训练的模型对样本密度有略微不同的期望,进而产生不同的泛化误差。

这种方法被称为自助法聚合,简称 bagging,它被设计用于具有高方差和低偏差的未剪枝决策树。鉴于它们准备速度快,通常会使用大量的决策树,例如数百或数千个。

……减少统计学习方法的方差从而提高预测准确性的自然方法是从总体中获取多个训练集,使用每个训练集构建一个单独的预测模型,并对结果预测进行平均。[…] 当然,这不切实际,因为我们通常无法访问多个训练集。相反,我们可以通过从(单个)训练数据集中重复采样来进行自助法。

— 《R应用统计学习导论》第216-317页,2013年。

一个等效的方法可能是使用训练数据集的一个较小子集,而不进行正则化,以允许更快的训练和一些过拟合。

对稍微欠优化的模型的渴望更普遍地适用于集成成员的选择。

……委员会的成员不应单独选择在偏差和方差之间具有最佳权衡,而应具有相对较小的偏差,因为额外的方差可以通过平均来消除。

— 《模式识别神经网络》第366页,1995年。

其他方法可能涉及选择输入空间的随机子空间分配给每个模型,例如输入空间中超体积的子集或输入特征的子集。

集成教程

有关改变训练数据的深度学习集成示例,请参见:

改变模型

鉴于问题的难度和学习算法的随机性,用不同的初始条件在相同数据上训练相同的欠约束模型将导致不同的模型。

这是因为网络试图解决的优化问题非常具有挑战性,存在许多“良好”且“不同”的解决方案来将输入映射到输出。

大多数神经网络算法之所以达到次优性能,正是因为存在压倒性数量的次优局部最小值。如果我们取一组已收敛到局部最小值的神经网络并进行平均,我们可以构建一个改进的估计。理解这一事实的一种方式是,通常,陷入不同局部最小值的网络将在特征空间的不同区域表现不佳,因此它们的误差项不会强烈相关。

《当网络意见不一致时:混合神经网络的集成方法》,1995年。

这可能导致方差减小,但可能不会显著改善泛化误差。模型产生的误差可能仍然高度相关,因为模型都学习了相似的映射函数。

另一种方法可能是改变每个集成模型的配置,例如使用具有不同容量(例如层数或节点数)的网络,或在不同条件下训练的模型(例如学习率或正则化)。

结果可能是模型集成学习了更多异构的映射函数集合,进而其预测和预测误差之间的相关性更低。

随机初始化、小批量随机选择、超参数差异或神经网络非确定性实现的不同结果通常足以使集成中的不同成员产生部分独立的错误。

— 《深度学习》第257-258页,2016年。

通过开发网络和调整其超参数的正常过程,可以实现这样一组配置不同的模型。在此过程中可以保存每个模型,并选择一部分更好的模型来组成集成。

略微欠优化的网络是大多数调优算法的免费副产品;即使它们的性能明显低于找到的最佳性能,也值得使用这些额外的副本。通过精心规划集成分类,使用最佳可用参数并在可用数据库的不同子集上训练不同的副本,可以实现更好的性能。

《神经网络集成》,1990年。

在单个模型可能需要数周或数月才能训练的情况下,另一种选择可能是在训练过程中定期保存最佳模型,称为快照或检查点模型,然后从保存的模型中选择集成成员。这提供了在相同数据上训练多个模型的好处,尽管是在单个训练运行期间收集的。

快照集成从单个训练过程中产生了一组准确而多样的模型。快照集成的核心是一个优化过程,它在收敛到最终解决方案之前会访问多个局部最小值。我们在这些不同的最小值处拍摄模型快照,并在测试时平均它们的预测。

《快照集成:训练一次,免费获得M个》,2017年。

快照集成的一个变体是保存不同时期的模型,也许通过在训练期间审查模型在训练集和验证集上的学习曲线来识别。来自这种连续模型序列的集成被称为水平集成。

首先,选择在相对稳定的时期范围内训练的网络。每个标签的概率预测由选定时期内的标准分类器产生,然后进行平均。

《用于分类的深度表示的水平和垂直集成》,2013年。

快照集成的进一步增强是在训练过程中系统地改变优化过程以强制产生不同的解决方案(即权重集),其中最好的解决方案可以保存到检查点。这可能涉及在训练时期内注入振荡量的噪声或在训练时期内振荡学习率。这种方法的一种变体,称为带暖重启的随机梯度下降(SGDR),在标准照片分类任务中表现出更快的学习速度和最先进的结果。

我们的 SGDR 通过调度学习率来模拟暖启动,以实现具有竞争力的结果 […] 大约快两到四倍。我们还使用 SGDR 取得了新的最先进结果,主要是通过使用更广泛的 [模型] 以及 SGDR 轨迹中的快照集成。

《SGDR:带暖启动的随机梯度下降》,2016年。

深度神经网络的一个好处是中间隐藏层提供了低分辨率输入数据的学习表示。隐藏层可以直接输出它们的内部表示,并且来自一个或多个隐藏层的输出可以作为新分类模型的输入。当深度模型使用自编码器模型训练时,这可能是最有效的。这种类型的集成被称为垂直集成。

该方法集成了一系列分类器,其输入是中间层的表示。由于这些特征似乎具有多样性,因此预期错误率会降低。

《用于分类的深度表示的水平和垂直集成》,2013年。

集成教程

有关改变模型的深度学习集成示例,请参见:

改变组合

组合预测最简单的方法是计算集成成员预测的平均值。

通过对每个模型的预测进行加权可以略微改善这一点,其中权重使用保留验证数据集进行优化。这提供了一个加权平均集成,有时被称为模型融合。

……我们可能会预期,委员会中的一些成员通常会比其他成员做出更好的预测。因此,我们期望如果给一些委员会成员更大的权重,可以进一步减少误差。因此,我们考虑由成员预测的加权组合给出的广义委员会预测……

— 《模式识别神经网络》第367页,1995年。

进一步复杂的一步是使用新模型来学习如何最好地组合每个集成成员的预测。

该模型可以是一个简单的线性模型(例如,很像加权平均),但也可以是一个复杂的非线性方法,除了每个成员提供的预测之外,它还会考虑特定的输入样本。这种学习新模型的一般方法被称为模型堆叠,或堆叠泛化

堆叠泛化通过推断泛化器相对于提供的学习集的偏差来工作。这种推断通过在第二个空间中进行泛化来实现,该空间的输入是(例如)原始泛化器在学习集的一部分上训练并试图猜测其余部分时的猜测,其输出是(例如)正确的猜测。 […] 当与单个泛化器一起使用时,堆叠泛化是一种估计(然后纠正)已经在一个特定学习集上训练并被问及一个特定问题的泛化器错误的方法。

《堆叠泛化》,1992年。

堆叠模型有更复杂的方法,例如提升(boosting),其中集成成员逐个添加,以纠正先前模型的错误。增加的复杂性意味着这种方法较少与大型神经网络模型一起使用。

另一种略有不同的组合方式是组合多个具有相同结构的神经网络的权重。多个网络的权重可以进行平均,希望能得到一个新的单一模型,其整体性能优于任何原始模型。这种方法称为模型权重平均。

……建议对权重空间中的这些点进行平均,并使用具有这些平均权重的网络,而不是通过对模型空间中网络的输出进行平均来形成集成。

《平均权重导致更宽的优化和更好的泛化》,2018年。

集成教程

有关改变组合的深度学习集成示例,请参见:

集成技术总结

总而言之,我们可以列出一些更常见和有趣的神经网络集成方法,根据方法中可以改变的每个元素进行组织,如下所示:

没有单一最好的集成方法;也许可以尝试几种方法,或者让您的项目约束来指导您。

进一步阅读

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

书籍

论文

文章

总结

在这篇文章中,您发现了用于深度学习神经网络的集成方法,以减少方差并提高预测性能。

具体来说,你学到了:

  • 神经网络模型是非线性的且具有高方差,这在准备用于预测的最终模型时可能会令人沮丧。
  • 集成学习结合了多个神经网络模型的预测,以减少预测的方差并降低泛化误差。
  • 集成学习技术可以根据变化的元素进行分组,例如训练数据、模型以及如何组合预测。

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

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

Better Deep Learning

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

...只需几行python代码

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

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

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

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

查看内容

深度学习神经网络集成学习方法的45条回复

  1. 查尔斯·皮埃尔 2018年12月19日 下午1:19 #

    我真的很喜欢你的书。我正在考虑购买这本。

  2. Wonbin 2019年2月8日 上午12:24 #

    非常感谢这篇精彩的帖子!我希望其中一个深度学习集成能帮助我正在进行的项目。

  3. Tarig Ballal 2019年3月22日 上午10:04 #

    谢谢杰森的精彩文章,非常有见地,并且呈现得非常好。我喜欢你的风格,特别是那些引文。

    • 杰森·布朗利 2019年3月22日 下午2:31 #

      谢谢,我很感谢您的反馈,很高兴它有所帮助!

  4. July 2019年4月14日 下午4:27 #

    对集成神经网络的精彩总结。感谢您的工作。

  5. Nitin Pasumarthy 2019年4月25日 下午12:57 #

    写得好,杰森!
    Dropout 也可以看作是一种不同的模型集成技术,对吗?另外,您能否根据您的经验比较这些技术,它们在哪里表现良好,又在哪里表现不佳?

  6. Jess 2019年11月21日 上午10:22 #

    很棒的文章。您会把超过一层的LSTM(长短期记忆)称为集成方法吗?

    • 杰森·布朗利 2019年11月21日 下午1:28 #

      不是。它是一个具有多层结构的单一模型。

      • Tommy Decito 2020年5月28日 上午1:04 #

        您为什么要这么说呢?它不是一个在不同时间步保留权重和输出的单层吗?

  7. inamullah 2020年2月5日 下午7:55 #

    杰森先生,您的帖子真棒。我们如何在CNN集成模型中创建参数多样性呢?

    • 杰森·布朗利 2020年2月6日 上午8:22 #

      一种方法是在训练数据的不同子集上拟合模型,即所谓的装袋法或随机子空间。

      • inamullah 2020年2月19日 上午4:28 #

        我们可以应用不同的技术(权重初始化)方法来创建参数多样性以创建不同的模型吗?

  8. Ariel_Arias 2020年3月17日 上午6:31 #

    感谢您的帖子。信息量很大

  9. Saif Ul Islam 2020年4月5日 下午4:37 #

    这篇文章真的很有用,很有见地!

    不过,我真的不明白第一张图片和任何东西有什么关系。😛

  10. Kelvin 2020年6月3日 下午7:52 #

    您好,我阅读了您的帖子,想澄清一些事情。现在我分别编写了4个具有相同配置但初始权重不同的网络,我该如何对预测输出进行平均呢?
    一个例子将不胜感激。谢谢

  11. Yogeeshwari 2020年6月14日 下午8:57 #

    先生,Dropout率不同的模型可以集成吗?

  12. Yogeeshwari 2020年6月15日 下午2:22 #

    谢谢!

  13. Kelvin 2020年6月15日 下午3:17 #

    感谢这篇文章。

    不过,我有一个问题。在做回归问题时,如果我采用了集成学习,方差误差小于平均误差是否可以?

  14. M 2020年7月1日 上午4:30 #

    与单个CNN相比,训练集成网络需要多长时间?

    • 杰森·布朗利 2020年7月1日 上午5:56 #

      如果您拟合了5个版本的最终模型,那么时间就会是原来的5倍。

  15. catherin 2020年7月22日 上午9:31 #

    真的很有用!谢谢你的帖子!

  16. Brad 2020年10月3日 上午2:00 #

    杰森您好,我想知道您是否曾尝试对多个集成的结果进行集成,以及这是否会提高性能。我特指从相同的成员预测中构建多个堆叠模型(例如,从10折交叉验证示例中构建10个模型,并在初始数据上进行训练),然后将这些堆叠模型的预测与另一个堆叠模型一起集成。您知道将这些技术嵌套在一起是否会提高性能吗?这通常是不做的吗?

    • 杰森·布朗利 2020年10月3日 上午6:10 #

      是的。它通常会提供轻微的提升或没有提升。这真的取决于数据集和模型。

      在您的数据和模型上尝试一下。实验是廉价且容易的。

  17. Arjun Roy 2021年1月25日 下午1:16 #

    您的文章总是那么精彩和富有信息。真正的灵感之源……

  18. Israa 2021年12月25日 上午3:23 #

    非常感谢杰森,这解释得太棒了!!

    我真的很感谢您能给我一些帮助,我有两个独立的神经网络模型,它们在不同的数据集上训练,用于不同的任务,在这种情况下是否可以使用集成?如果不能,我有没有办法在第一个模型的数据集上训练第二个模型,而不会对该模型进行剧烈更改?
    提前感谢!

  19. Manash Sarma 2022年3月13日 下午12:28 #

    杰森,深度学习模型是否可以与基于SVM、RF等非深度学习模型进行集成?有没有人做过这样的例子?

发表评论

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