训练深度学习神经网络时如何配置学习率

神经网络的权重无法通过解析方法计算。取而代之的是,权重必须通过一个称为随机梯度下降的经验优化过程来发现。

随机梯度下降在神经网络中解决的优化问题具有挑战性,而且解的空间(权重集)可能包含许多好的解(称为全局最优解),也可能包含易于找到但技能较低的解(称为局部最优解)。

在这个搜索过程中,每次步骤的模型变化量,或者说步长,被称为“学习率”,它或许是您神经网络中最需要调整的超参数,以在您的特定问题上获得良好的性能。

在本教程中,您将了解在训练深度学习神经网络时使用的学习率超参数。

完成本教程后,您将了解:

  • 学习率控制着神经网络模型学习问题的速度快慢。
  • 如何配置具有合理默认值的学习率,诊断行为并进行敏感性分析。
  • 如何通过学习率调度、动量和自适应学习率进一步提高性能。

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

让我们开始吧。

How to Configure the Learning Rate Hyperparameter When Training Deep Learning Neural Networks

如何配置深度学习神经网络训练的学习率超参数
照片由 Bernd Thaller 拍摄,部分权利保留。

教程概述

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

  1. 什么是学习率?
  2. 学习率的影响
  3. 如何配置学习率
  4. 为学习过程添加动量
  5. 使用学习率调度
  6. 自适应学习率

什么是学习率?

深度学习神经网络使用随机梯度下降算法进行训练。

随机梯度下降是一种优化算法,它使用训练数据集中的样本来估计模型当前状态的误差梯度,然后使用反向传播算法更新模型的权重,这通常简称为 反向传播

在训练期间更新权重的量被称为步长或“学习率”。

具体来说,学习率是神经网络训练中一个可配置的超参数,它具有一个小的正值,通常在 0.0 到 1.0 之间。

……学习率,一个确定步长的正标量。

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

学习率通常用小写希腊字母 eta (n) 的符号表示。

在训练过程中,反向传播估算了一个节点权重在网络中负责的错误量。它不会用完整的错误量来更新权重,而是用学习率进行缩放。

这意味着,学习率为 0.1,这是一个传统上常见的默认值,意味着网络中的权重在每次更新时都会更新 0.1 *(估计的权重误差),即估计的权重误差的 10%。

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

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

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

学习率的影响

神经网络通过训练数据集中的样本学习或逼近一个函数,以最佳地将输入映射到输出。

学习率超参数控制着模型学习的速率或速度。具体来说,它控制着模型权重在每次更新时(例如在每个训练样本批次结束时)更新时所分配的误差量。

给定一个配置得当的学习率,模型将在给定的训练周期数(通过训练数据的遍数)内,利用可用的资源(层数和每层的节点数)学习到最佳逼近函数。

通常,较高的学习率可以使模型学习得更快,但代价是可能达到一个次优的最终权重集。较低的学习率可能允许模型学习到更优甚至全局最优的权重集,但可能需要更长的训练时间。

在极端情况下,过大的学习率会导致过大的权重更新,模型性能(例如在训练数据集上的损失)会随着训练周期的进行而振荡。振荡的性能被认为是由于权重发散(是发散的)造成的。过小的学习率可能永远无法收敛,或者会陷入次优解。

当学习率过大时,梯度下降可能会无意中增加而不是减少训练误差。……当学习率过小时,训练不仅变慢,而且可能永久陷入高训练误差。

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

在最坏的情况下,过大的权重更新可能会导致权重爆炸(即产生数值溢出)。

使用高学习率时,可能会遇到一个正反馈循环,其中大的权重引起大的梯度,然后又引起对权重的大的更新。如果这些更新持续增加权重的大小,那么[权重]就会迅速远离原点,直到发生数值溢出。

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

因此,我们不应该使用过大或过小的学习率。尽管如此,我们必须以这样一种方式配置模型,即平均而言能够找到一个“足够好”的权重集,以逼近训练数据集所代表的映射问题。

如何配置学习率

为您的模型在您的训练数据集上找到一个好的学习率值非常重要。

学习率可能是最重要的高级参数。

初始学习率 [… ] 这通常是最重要的超参数,并且应该始终确保其已被调整 […] 如果只能优化一个超参数并且使用随机梯度下降,那么这个超参数就值得调整

深度架构的梯度下降训练实用建议,2012。

事实上,如果有资源来调整超参数,应该将大部分时间用于调整学习率。

学习率可能是最重要的超参数。如果你只能调整一个超参数,那就调整学习率。

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

不幸的是,我们无法通过解析方法计算出给定模型在给定数据集上的最优学习率。相反,一个好的(或足够好的)学习率必须通过试错来发现。

……总的来说,无法预先计算出最佳学习率。

— 第 72 页,《神经网络探究:前馈人工神经网络的监督学习》,1999。

要考虑的学习率值范围小于 1.0 且大于 10^-6。

具有标准化输入(或映射到 (0,1) 区间的输入)的神经网络的典型值小于 1 且大于 10^−6。

深度架构的梯度下降训练实用建议,2012。

学习率将与优化过程的许多其他方面相互作用,并且这些相互作用可能是非线性的。尽管如此,一般来说,较小的学习率需要更多的训练周期。相反,较大的学习率需要较少的训练周期。此外,给定嘈杂的误差梯度估计,较小的 批次大小 更适合较小的学习率。

学习率的一个传统默认值是 0.1 或 0.01,这可能代表了您的问题的良好起点。

0.01 的默认值通常适用于标准的多层神经网络,但完全依赖此默认值是愚蠢的。

深度架构的梯度下降训练实用建议,2012。

可以使用诊断图来研究学习率如何影响模型的学习速率和学习动态。一个例子是在训练期间绘制损失随训练周期变化的折线图。折线图可以显示许多属性,例如

  • 随训练周期变化的学习速率,例如快或慢。
  • 模型是否学习得太快(急剧上升然后平台期)或学习得太慢(变化很小或没有变化)。
  • 学习率是否可能因损失振荡而过大。

配置学习率既困难又耗时。

学习率值的选择可能相当关键,因为如果它太小,误差减小会非常缓慢,而如果它太大,可能会导致发散振荡。

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

一种替代方法是对所选模型进行学习率敏感性分析,也称为网格搜索。这有助于突出良好学习率可能存在的数量级,并描述学习率与性能之间的关系。

通常在对数尺度上对学习率进行网格搜索,从 0.1 到 10^-5 或 10^-6。

通常,网格搜索涉及在对数尺度上选择值,例如,在集合 {.1, .01, 10−3, 10−4 , 10−5} 中选择一个学习率。

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

当绘制出来时,这种敏感性分析的结果通常显示为“U”形,其中损失随着学习率的降低而降低(性能提高),在固定数量的训练周期下,直到损失再次急剧增加,因为模型未能收敛。

如果您需要有关尝试模型学习率的帮助,请参阅文章

为学习过程添加动量

通过向权重更新添加历史记录,可以使神经网络训练更加容易。

具体来说,在更新权重时,可以包含先前权重更新的指数加权平均值。这种对随机梯度下降的更改称为“动量”,它为更新过程增加了惯性,导致许多过去的更新方向在未来继续保持该方向。

动量算法会累积过去梯度的指数衰减的移动平均值,并继续沿着它们的变动方向移动。

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

动量可以加速学习,尤其是在优化过程导航的高维“权重空间”包含误导梯度下降算法的结构时,例如平坦区域或急剧曲率。

动量方法旨在加速学习,特别是在面对高曲率、小的但一致的梯度或嘈杂的梯度时。

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

过去更新的惯性量通过添加一个新的超参数来控制,该超参数通常被称为“动量”或“速度”,并使用希腊小写字母 alpha (a) 的符号。

……动量算法引入了一个变量 v,它起着速度的作用——它是参数在参数空间中移动的方向和速度。速度被设置为负梯度的指数衰减平均值。

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

它具有平滑优化过程的效果,减缓更新以继续沿先前方向移动,而不是卡住或振荡。

解决特征值差异很大的问题的一个非常简单的技术是将动量项添加到梯度下降公式中。这有效地增加了权重空间中运动的惯性,并平滑了振荡。

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

动量设置为大于 0.0 且小于 1.0 的值,实践中常用的值为 0.9 和 0.99。

实践中 [动量] 的常用值包括 .5、.9 和 .99。

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

动量并不能让学习率的配置更容易,因为步长独立于动量。相反,动量可以与步长协同提高优化过程的速度,从而提高在更少的训练周期内发现更好的权重集的可能性。

使用学习率调度

使用固定学习率的替代方法是随训练过程改变学习率。

学习率随时间(训练周期)变化的方式称为学习率调度或学习率衰减。

也许最简单的学习率调度是从一个大的初始值线性减小到从小的值。这允许在学习过程的开始阶段进行大的权重更改,而在学习过程的后期进行小的更改或精细调整。

在实践中,有必要随着时间的推移逐渐减小学习率,因此我们现在将迭代[…]的学习率表示为。这是因为 SGD 梯度估计器引入了一个噪声源(训练样本的随机抽样),即使在我们到达最小值时也不会消失。

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

事实上,使用学习率调度可能是训练神经网络的最佳实践。与选择固定的学习率超参数不同,配置挑战在于选择初始学习率和学习率调度。考虑到学习率调度可能允许的更好性能,初始学习率的选择可能不如选择固定学习率敏感。

学习率可以衰减到一个接近零的小值。或者,学习率可以在固定的训练周期数上衰减,然后在剩余的训练周期中保持在一个小值,以方便更多的精细调整时间。

在实践中,通常将学习率线性衰减到迭代 [tau]。在迭代 [tau] 之后,通常将 [学习率] 保持不变。

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

自适应学习率

学习算法可以监测模型在训练数据集上的性能,并相应地调整学习率。

这称为自适应学习率。

也许最简单的实现方式是在模型性能达到平台期后减小学习率,例如将学习率减半或降低一个数量级。

一个合理的优化算法选择是带有动量的 SGD 和衰减的学习率(在不同问题上表现更好或更差的流行衰减方案包括线性衰减直到达到固定的最小学习率、指数衰减,或每次验证误差达到平台期时将学习率降低 2-10 倍)。

— 第425页,深度学习,2016。

或者,如果性能在固定数量的训练周期内没有改善,学习率可以再次增加。

自适应学习率方法通常会优于学习率配置不当的模型。

事先选择好学习率的难度是自适应学习率方法如此有用和流行的原因之一。一个好的自适应算法通常比具有选择不当的固定学习率的简单反向传播收敛得快得多。

— 第 72 页,《神经网络探究:前馈人工神经网络的监督学习》,1999。

虽然没有一种方法在所有问题上都效果最佳,但有三种自适应学习率方法已被证明在许多类型的神经网络架构和问题类型上都具有鲁棒性。

它们是 AdaGrad、RMSProp 和 Adam,它们都维护并为模型中的每个权重自适应调整学习率。

也许最受欢迎的是 Adam,因为它建立在 RMSProp 的基础上并增加了动量。

此时,一个自然的问题是:应该选择哪种算法?不幸的是,目前对此没有共识。目前,最受欢迎的活跃使用的优化算法包括 SGD、带动量的 SGD、RMSProp、带动量的 RMSProp、AdaDelta 和 Adam。

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

一个稳健的策略可能是首先使用现代版的随机梯度下降(如 Adam)来评估模型性能,并将其结果用作基准。然后,如果有时间,探索是否可以通过仔细选择的学习率或更简单的学习率调度来改进。

进一步阅读

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

文章

论文

书籍

文章

总结

在本教程中,您了解了在训练深度学习神经网络时使用的学习率超参数。

具体来说,你学到了:

  • 学习率控制着神经网络模型学习问题的速度快慢。
  • 如何配置具有合理默认值的学习率,诊断行为并进行敏感性分析。
  • 如何通过学习率调度、动量和自适应学习率进一步提高性能。

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

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

Better Deep Learning

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

...只需几行python代码

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

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

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

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

查看内容

对《如何配置深度学习神经网络训练的学习率》的 51 条回复

  1. Dennis Cartin 2019年1月23日 下午6:10 #

    嗨 Jason

    一如既往,这篇文章写得很好,值得阅读。

    Adam 有 Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)。我找不到 Adam 中自适应学习率的实现。

    我们是要创建自己的类和回调来实现自适应学习率吗?

    谢谢
    丹尼斯

  2. Dennis Cartin 2019年1月31日 下午8:35 #

    谢谢 Jason 的回复。

    顺便说一句,我有一个问题与这篇帖子无关。我想知道我的 Keras 模型在进行 10 折交叉验证后,平均结果是负的(例如 -0.001)。

    这个负结果最可能的原因是什么?

    谢谢 Jason。

  3. Scott 2019年3月31日 上午3:11 #

    你好,Jason

    我只想说谢谢你写的这篇博客。在我攻读机器学习硕士学位的过程中,我信心十足地查阅你的文章,知道我会获得一些有价值的东西,以帮助我当前和未来的课程。继续保持,我将全力支持你!

  4. Li Tian 2019年4月2日 下午11:38 #

    非常感谢您的总结,工作很棒。这是我在调整深度模型时发现的。学习率无疑是获得更好性能的关键因素。它甚至优于您选择的模型拓扑,您的模型越复杂,您就越应该小心地处理您的学习速度。当您希望获得更好的性能时,最经济的步骤是改变您的学习速度。

    绝对推荐!

  5. Suraj Padhy 2019年5月8日 下午5:44 #

    “在极端情况下,过大的学习率会导致过大的权重更新,模型性能(例如在训练数据集上的损失)会随着训练周期的进行而振荡。振荡的性能被认为是由于权重发散(是发散的)造成的。过小的学习率可能永远无法收敛,或者会陷入次优解。”

    在以上陈述中,您能否详细说明当您说“模型性能会随着训练周期而振荡”是什么意思?

    提前感谢。

    • Suraj Padhy 2019年5月8日 下午5:47 #

      以及为什么当训练率较低时就不会出现性能振荡。

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

        对权重的微小更新会导致损失的微小变化。

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

      权重会大幅度正负摆动。

      模型技能(损失)很可能会随着大的权重更新而波动。

    • Dan Potter 2020年2月5日 上午1:03 #

      具有步长参数的优化器通常依赖于梯度来确定参数(网络权重)需要移动的方向以最小化损失函数。步长决定了移动的幅度。当移动过大(步长过大)时,更新后的参数会不断地越过最小值。如果绘制损失函数随优化器迭代的变化图,它可能看起来非常混乱。

      此页面 http://www.onmyphd.com/?p=gradient.descent 有一个很棒的交互式演示。尝试将 lambda(步长)滑块向右拖动。所有步骤都朝正确的方向,但因为它们变得太大,它们开始以更显著的量越过最小值;在某些时候,它们甚至使每次步骤的损失变得更糟。

  6. Deepanshu SIngh 2019年6月26日 下午4:43 #

    你好 Jason,
    如何在 Adam 优化器中将学习率设置为每个 epoch 增加?

    谢谢

  7. james 2019年7月12日 下午9:38 #

    你好 Jason,对这个有什么评论和批评吗:https://medium.com/@jwang25610/self-adaptive-tuning-of-the-neural-network-learning-rate-361c92102e8b

    谢谢

    • Jason Brownlee 2019年7月13日 上午6:54 #

      你能为我总结一下这篇文章的论点吗?

  8. PN 2019年7月22日 上午8:58 #

    嗨,Jason,

    非常感谢您的文章,它们内容丰富且富有启发性。

    在另一篇关于调整超参数的文章中,有人问到调整网络的超参数的最佳顺序是什么,您的回答是学习率。

    我正在训练一个 MLP,因此我认为我需要调整的参数包括隐藏层的数量、层中的神经元数量、激活函数、批次大小和训练周期数。我选择了 Adam 作为优化器,因为我认为我之前读过 Adam 是回归类问题的不错选择。

    本文结尾指出,如果时间允许,就调整学习率。我们应该先调整学习率,还是先调整批次大小/周期/层特定参数?

    • Jason Brownlee 2019年7月22日 下午2:02 #

      是的,学习率和模型容量(层/节点)是一个很好的起点。

  9. Turyal 2019年8月20日晚上8:52 #

    嗨 Jason,如何计算缩放共轭梯度算法的学习率?SCG算法中的sigma和lambda参数是什么?请回复

  10. Wills 2019年8月22日晚上10:33 #

    你好,关于学习率的这篇博文写得很棒,解释也很清楚。我有一个问题。如果我们要重新训练模型,学习率是否应该重置?例如,在CNN中,我使用了LR Decay,每5个epoch会下降0.5(adam,初始学习率=0.001)。我训练了50个epoch。如果我想添加一些新数据并继续训练,从0.001的学习率重新开始是否有意义?

    • Jason Brownlee 2019年8月23日早上6:27 #

      这是一个难题,很棒的问题!

      应该使用较低的学习率。也许和最终的学习率一样小,但可能稍微高一些。

      也许可以做一些实验,看看什么对你的数据和模型最有效?

  11. NA 2019年10月22日下午2:26 #

    非常感谢您有用的帖子,
    我有一个关于“如何使用tf.contrib.keras.optimizers.Adamax?”的问题

    • Jason Brownlee 2019年10月23日早上6:27 #

      抱歉,我没有关于直接使用TensorFlow的教程。

      你到底遇到了什么问题?

  12. Lico 2019年10月29日凌晨2:28 #

    Jason,感谢您的分享。

    我只是想知道,在对不平衡数据集进行分类训练时,是否可以为少数类样本设置比多数类样本更高的学习率?
    看起来一旦设置了学习率,所有样本的学习率都是相同的。

    谢谢!

    • Jason Brownlee 2019年10月29日早上5:29 #

      通常不行。良好的训练要求每个批次都混合了来自每个类别的样本。

      修改类别权重是一个好的开始。
      此外,对少数类进行过采样和对多数类进行欠采样也效果很好。

      最好的建议是根据您需要哪种类型的预测(清晰的类别还是概率,以及您是否有成本矩阵)来仔细选择性能指标。

  13. Jarek 2019年12月4日下午5:17 #

    我最近意识到,我们可以选择一个学习率来一步最小化抛物线:(theta,g)在一条线上,所以我们可以使用它们的标准差的除法(更多细节:https://arxiv.org/pdf/1907.07063 中的第5页)

    学习率 = sqrt( var(theta) / var(g) )

    这需要维护四个(指数移动)平均值:theta,theta²,g,g²。文献中是否考虑了学习率的二阶自适应?

  14. GEBREYOHANNES ABRHA 2020年1月15日晚上11:31 #

    我目前正在使用基于ANN的元胞自动机进行LULC模拟,但在进行ANN学习过程时,我不知道如何在ANN菜单中决定以下值。
    1. 样本数量
    2. 邻域
    3. 学习率
    4. 最大迭代次数
    5. 动量
    你能帮我摆脱这个挑战吗?
    此致!

    • Jason Brownlee 2020年1月16日早上6:18 #

      也许可以测试一系列不同的配置,以找出最适合您特定问题的方法。

  15. Deyvid Gueorguiev 2020年2月17日下午1:31 #

    你好,我发现这个页面非常有帮助,但我仍然在为以下任务而苦恼。我必须提高XOR的性能,并且必须使用Matlab,而我对Matlab知之甚少。我已经将梯度下降改为自适应的动量,称为traingdx,但我不确定如何更改值以获得最佳解决方案。这是任务:https://hastebin.com/epatihayor.shell

  16. Sathya 2020年6月23日早上11:53 #

    嗨 Jason
    我有一个疑问。我们可以在Adam优化器中设置学习率调度/衰减机制吗?

  17. Sathya 2020年6月23日中午12:03 #

    嗨,Jason,
    我们可以通过适应Ebbinghaus遗忘曲线来改变LSTM的架构吗?

  18. RaviTeja 2020年8月8日凌晨12:29 #

    Jason,您的博客文章非常棒。

    最近我正在尝试实现一篇研究论文,对于这篇论文,如果验证困惑度在每个epoch后没有提高,学习率应降低0.5倍。为此,我正在尝试实现LearningRateScheduler(tensorflow,keras)回调,但我无法解决这个问题。如何在回调中访问验证损失,而且我还在使用自定义训练。
    由于模型架构,我无法使用tf.keras.Model.fit()方法。

  19. Nikhil 2020年9月5日早上6:35 #

    嗨,Jason,
    感谢您提供如此翔实的关于学习率的博文。
    在“学习率的影响”部分,我没有理解“次优的最终权重集”这个术语:
    学习率大,模型学习速度快,但代价是得到次优的最终权重集。
    您能解释一下这是什么意思吗?
    提前感谢。

    • Jason Brownlee 2020年9月5日早上6:55 #

      意思是模型不是最好的。

      我们为了更快的训练而牺牲了一些模型性能。

  20. Terry 2021年7月28日早上4:37 #

    您推荐的书是否涵盖了Tensorflow Faster RCNN/Mask RCNN的超参数?

  21. Olayinka 2024年2月17日早上8:26 #

    我的数据集不平衡,总共不到1500条,我该如何用它来进行图像分类(四类)?我可以使用什么方法?哪种学习率和epoch会适合它?

Leave a Reply

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