更好的深度学习框架

现代深度学习库(如 Keras)允许您在几分钟内用几行代码定义和开始拟合各种神经网络模型。

然而,配置神经网络以在新预测建模问题上获得良好性能仍然具有挑战性。

获得良好性能的挑战可分为三个主要领域:学习问题、泛化问题和预测问题。

一旦您诊断出网络存在的具体问题类型,就可以选择一套经典和现代技术来解决该问题并提高性能。

在这篇文章中,您将发现一个用于诊断深度学习模型性能问题的框架,以及可用于针对和改进每个特定性能问题的技术。

阅读本文后,你将了解:

  • 定义和拟合神经网络从未如此简单,尽管在新问题上获得良好性能仍然具有挑战性。
  • 神经网络建模性能问题可以分解为学习、泛化和预测类型的问题。
  • 有数十年的技术以及现代方法可以用于解决每种类型的模型性能问题。

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

让我们开始吧。

Framework for Better Deep Learning

更好的深度学习框架
图片由 Anupam_ts 拍摄,保留部分权利。

概述

本教程分为七个部分,它们是:

  1. 神经网络复兴
  2. 配置神经网络的挑战
  3. 系统改进深度学习的框架
  4. 更好的学习技术
  5. 更好的泛化技术
  6. 更好的预测技术
  7. 如何使用该框架

神经网络复兴

历史上,神经网络模型必须从头开始编写代码。

您可能需要花费数天或数周时间将描述不清的数学概念转化为代码,然后再花费数天或数周时间调试代码,才能使一个简单的神经网络模型运行起来。

那些日子已经一去不复返。

如今,借助建立在 TensorFlow 等复杂数学库之上的 Keras 等开源库,您只需几行代码即可在几分钟内定义并开始拟合大多数类型的神经网络。

这意味着可以快速开发和评估标准模型,例如多层感知器,以及以前可能超出大多数实践者实现能力的更复杂的模型,例如卷积神经网络和循环神经网络,如长短期记忆网络。

作为深度学习从业者,我们生活在一个令人惊叹且富有成效的时代。

然而,尽管可以快速定义和评估新的神经网络模型,但关于如何实际配置神经网络模型以充分利用它们,仍然鲜有指导。

配置神经网络的挑战

配置神经网络模型通常被称为“黑魔法”。

这是因为对于给定问题,配置网络没有硬性规定。我们无法分析计算给定数据集的最佳模型类型或模型配置。

相反,有数十年的技术、启发式方法、技巧、诀窍以及其他隐性知识散布在代码、论文、博客文章和人们的头脑中。

配置神经网络以解决问题的捷径是复制用于类似问题的另一个网络的配置。但这种策略很少能带来好的结果,因为模型配置不可在问题之间转移。您所从事的预测建模问题也可能与文献中描述的其他问题大多不同。

幸运的是,在配置和训练神经网络时,有一些已知技术可以解决特定问题,这些技术在 Keras 等现代深度学习库中可用。

此外,在过去 5 到 10 年中,激活函数、自适应学习率、正则化方法和集成技术等领域取得了发现,这些发现已被证明可以显著提高神经网络模型的性能,无论其具体类型如何。

这些技术是可用的;您只需要知道它们是什么以及何时使用它们。

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

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

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

系统改进深度学习的框架

不幸的是,您不能简单地对用于提高深度学习性能的技术进行网格搜索。

几乎普遍地,它们独特地改变了训练数据、学习过程、模型架构等方面的方面。相反,您必须诊断您的模型存在的性能问题类型,然后仔细选择和评估针对该诊断问题的给定干预措施。

对于深度学习神经网络模型的性能不佳,有三种易于诊断的问题;它们是

  • 学习问题。学习问题表现为模型无法有效学习训练数据集,或者在学习训练数据集时表现出进展缓慢或性能不佳。
  • 泛化问题。泛化问题表现为模型过拟合训练数据集,并在留出数据集上表现不佳。
  • 预测问题。预测问题表现为随机训练算法对最终模型有很强的影响,导致行为和性能的高度方差。

这种分解提供了一种系统化的方法来思考您的深度学习模型的性能。

这些关注领域之间存在一些自然的重叠和相互作用。例如,学习问题会影响模型的泛化能力以及最终模型所做预测的方差。

所提出的分解中三个领域之间的顺序关系允许深度学习模型性能问题首先被隔离,然后用特定的技术或方法进行解决。

我们可以将解决这些问题的技术总结如下

  • 更好的学习。改进或加速神经网络模型权重响应训练数据集进行调整的技术。
  • 更好的泛化能力。提高神经网络模型在保留数据集上性能的技术。
  • 更好的预测。减少最终模型性能方差的技术。

现在我们有了一个系统地诊断深度学习神经网络性能问题的框架,让我们看看在这些三个关注领域中可能使用的一些技术示例。

更好的学习技术

更好的学习技术是指对神经网络模型或学习算法进行更改,以改进或加速模型权重对训练数据集的响应适应。

在本节中,我们将回顾用于改进模型权重适应的技术。

这始于仔细配置与使用随机梯度下降算法优化神经网络模型和使用误差反向传播算法更新权重相关的超参数;例如

  • 配置批量大小。包括探索批量、随机(在线)或小批量梯度下降等变体是否更合适。
  • 配置学习率。包括理解不同学习率对您问题的影响以及现代自适应学习率方法(如 Adam)是否适用。
  • 配置损失函数。包括理解不同损失函数的解释方式以及替代损失函数是否适用于您的问题。

这还包括简单的数据准备和更深层输入层的自动重新缩放。

  • 数据缩放技术。包括小网络权重对输入变量尺度的敏感性以及目标变量中大误差对权重更新的影响。
  • 批量归一化。包括对网络模型深层输入层分布变化的敏感性以及标准化层输入以增加输入一致性和学习过程稳定性的好处。

随机梯度下降是一种通用的优化算法,可以应用于各种问题。然而,优化过程(或学习过程)可能会变得不稳定,需要采取特定的干预措施;例如

  • 梯度消失。防止深度多层网络训练导致靠近输入层的权重无法更新;这可以通过使用现代激活函数(如修正线性激活函数)来解决。
  • 梯度爆炸。大权重更新导致数值溢出或下溢,使网络权重取 NaN 或 Inf 值;这可以通过梯度缩放或梯度裁剪来解决。

某些预测建模问题上的数据限制可能会阻碍有效学习。可以使用专门的技术来启动优化过程,提供一组有用的初始权重甚至整个模型,可用于特征提取;例如

  • 贪婪逐层预训练。其中层一次性添加到模型中,学习解释前一层输出并允许开发更深的模型:这是深度学习领域的一个里程碑式技术。
  • 迁移学习。其中模型在不同的但某种程度上相关的预测建模问题上进行训练,然后用于初始化权重或整体用作特征提取模型,以为在目标问题上训练的模型提供输入。

您是否使用其他技术来改进学习?
在下面的评论中告诉我。

更好的泛化技术

更好的泛化技术是指改变神经网络模型或学习算法,以减少模型过拟合训练数据集的影响,并提高模型在留出验证或测试数据集上的性能。

在本节中,我们将回顾用于减少训练期间模型泛化错误的技术。

旨在减少泛化误差的技术通常被称为正则化技术。几乎普遍地,正则化通过某种方式减少或限制模型复杂度来实现。

也许最广泛理解的模型复杂度度量是模型权重的大小或幅度。权重大的模型表明它可能过度专门针对训练数据中的输入,这使得它在用于对新未见数据进行预测时不稳定。通过权重正则化保持权重较小是一种强大且广泛使用的技术。

  • 权重正则化。对损失函数的更改,根据模型权重的范数(幅度)惩罚模型,鼓励较小的权重,进而鼓励较低复杂度的模型。

除了通过更新的损失函数简单地鼓励权重保持较小之外,还可以通过约束强制权重变小。

  • 权重约束。当权重的向量范数超过阈值时,更新模型以重新缩放权重。

神经网络层的输出,无论该层在层堆栈中的位置如何,都可以被认为是关于输入的内部表示或一组提取的特征。更简单的内部表示可以对模型产生正则化效果,并且可以通过鼓励稀疏性(零值)的约束来鼓励。

  • 活动正则化。对损失函数的更改,根据层激活的范数(幅度)惩罚模型,鼓励较小或更稀疏的内部表示。

可以在模型中添加噪声,以在训练期间增强对原始输入或先前层输出的鲁棒性;例如

  • 输入噪声。在输入层或隐藏层之间添加统计变化或噪声,以减少模型对特定输入值的依赖。
  • Dropout。在训练网络时随机移除连接(权重),以打破层之间节点之间的紧密耦合。

通常,过拟合可能仅仅由于在训练数据集上训练模型时间过长而发生。一个简单的解决方案是提前停止训练。

  • 提前停止。在训练期间监视模型在留出验证数据集上的性能,并在验证集上的性能开始下降时停止训练过程。

您是否使用其他技术来改进泛化?
在下面的评论中告诉我。

更好的预测技术

更好的预测技术是那些补充模型训练过程以减少最终模型预期性能方差的技术。

在本节中,我们将回顾用于减少最终深度学习神经网络模型预期方差的技术。

通过增加偏差可以减少最终模型性能的方差。向最终模型引入偏差最常见的方法是组合来自多个模型的预测。这被称为集成学习。

除了减少最终模型性能的方差,集成学习还可以带来更好的预测性能。

有效的集成学习方法要求每个贡献模型都具有技能,这意味着模型做出的预测优于随机,但模型之间的预测误差具有低相关性。这意味着,集成成员模型应该有技能,但以不同的方式。

这可以通过改变集成的一个方面来实现;例如

  • 改变用于拟合每个成员的训练数据。
  • 改变有助于集成预测的成员。
  • 改变组合集成成员预测的方式。

可以通过在数据集的不同子样本上拟合模型来改变训练数据。

这可能涉及在训练数据集的不同随机选择子集上拟合和保留模型,为 k 折交叉验证中的每个折保留模型,或者使用引导方法(例如引导聚合)在不同替换样本上保留模型。总的来说,我们可以将这些方法视为重采样集成。

  • 重采样集成。在训练数据集的不同样本上拟合的模型集成。

改变集成成员最简单的方法可能是从训练数据集上的学习算法的多次运行中收集模型。随机学习算法将在每次运行中产生略微不同的拟合,进而将产生略微不同的拟合。对多次运行的模型求平均将确保性能保持一致。

  • 模型平均集成。在同一数据集上对同一学习算法的多次运行中重新训练模型。

这种方法的变体可能涉及使用不同的超参数配置训练模型。

训练多个最终深度学习模型可能代价高昂,尤其是一个模型可能需要数天或数周才能拟合。

另一种方法是在单次训练运行中收集模型以用作贡献集成成员;例如

  • 水平集成。从单个训练运行结束时连续的训练时期块中收集的集成成员。
  • 快照集成。使用激进的循环学习率进行训练运行,其中在学习率的每个循环的低谷处收集集成成员。

组合多个集成成员预测最简单的方法是在回归情况下计算预测的平均值,或者在分类情况下计算统计众数或最常见的预测。

或者,可以学习组合多个模型预测的最佳方式;例如

  • 加权平均集成(融合)。来自每个集成成员对集成预测的贡献通过学习系数进行加权,该系数表示对每个模型的信任。
  • 堆叠泛化(堆叠。训练一个新模型以学习如何最好地组合集成成员的预测。

除了组合集成成员的预测之外,模型本身也可以组合;例如

  • 平均模型权重集成。来自多个神经网络模型的权重被平均为一个用于进行预测的单个模型。

您是否使用其他技术来减少最终模型的方差?
在下面的评论中告诉我。

如何使用该框架

我们可以将技术组织成更好的学习、泛化和预测这三个领域,将其视为一个系统地改进神经网络模型性能的框架。

在您的项目中,有太多技术无法合理地调查和评估。

相反,您需要有条不紊地使用技术,以有针对性的方式解决已定义的问题。

步骤 1:诊断性能问题

使用此框架的第一步是诊断您的模型存在的性能问题。

一个强大的诊断工具是计算损失的学习曲线和特定于问题的指标(如回归的 RMSE 或分类的准确性)在给定数量的训练时期内在训练和验证数据集上的表现。

  • 如果训练数据集上的损失很差、停滞不前或未能改善,则您可能存在学习问题。
  • 如果训练数据集上的损失或特定于问题的指标持续改善,但在验证数据集上恶化,则您可能存在泛化问题。
  • 如果验证数据集上的损失或特定于问题的指标在运行结束时显示出高方差,则您可能存在预测问题。

步骤 2:选择并评估技术

审查旨在解决您问题的技术。

选择一种似乎非常适合您的模型和问题的技术。这可能需要一些先前的技术经验,对于初学者来说可能具有挑战性。

幸运的是,有一些启发式方法和最佳实践适用于大多数问题。

例如:

  • 学习问题:调整学习算法的超参数;特别是,学习率提供了最大的杠杆作用。
  • 泛化问题:使用权重正则化和提前停止在大多数模型和大多数问题上效果很好,或者尝试使用 dropout 和提前停止。
  • 预测问题:对来自多次运行或一次运行中多个时期的模型预测进行平均,以添加足够的偏差。

选择一个干预措施,然后阅读一些相关资料,包括它是如何工作的,为什么它有效,以及更重要的是,查找先行者如何使用它的示例,以了解您如何在自己的问题上使用它。

步骤 3:转到步骤 1

一旦您确定了一个问题并用干预措施解决了它,请重复该过程。

开发更好的模型是一个迭代过程,可能需要多个层面的多次干预,这些干预措施相互补充。

这是一个经验过程。这意味着您依赖于测试工具的稳健性,以便在干预前后提供可靠的性能摘要。花时间确保您的测试工具是稳健的,保证训练、测试和验证数据集是干净的,并提供适合您问题领域中具有代表性的观测样本。

进一步阅读

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

书籍

论文

文章

文章

总结

在这篇文章中,您发现了用于诊断深度学习模型性能问题的框架以及可用于针对和改进每个特定性能问题的技术。

具体来说,你学到了:

  • 定义和拟合神经网络从未如此简单,尽管在新问题上获得良好性能仍然具有挑战性。
  • 神经网络建模性能问题可以分解为学习、泛化和预测类型的问题。
  • 有数十年的技术以及现代方法可以用于解决每种类型的模型性能问题。

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

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

Better Deep Learning

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

...只需几行python代码

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

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

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

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

查看内容

《深度学习改进框架》的 6 条回复

  1. ironfrown 2019 年 2 月 11 日下午 8:28 #

    这是对深度学习模型开发中的问题及其解决方案的精彩回顾。谢谢。

    • Jason Brownlee 2019 年 2 月 12 日上午 7:57 #

      谢谢!

      希望它有用,我为此思考了几周。

  2. wangafei 2019 年 10 月 7 日下午 7:56 #

    权重初始化是改进学习的重要技术

  3. Hammad 2020 年 2 月 14 日下午 11:55 #

    深度学习本质上是自适应的吗?我的意思是,它能适应数据集的变化吗?

发表评论

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