深度学习中 Adam 优化算法的温和介绍

为深度学习模型选择优化算法,可能会影响在几分钟、几小时或几天内获得良好结果的差异。

Adam优化算法是随机梯度下降的一种扩展,最近在计算机视觉和自然语言处理的深度学习应用中得到了更广泛的应用。

在这篇文章中,你将获得关于在深度学习中使用Adam优化算法的入门介绍。

阅读本文后,你将了解:

  • Adam算法是什么,以及使用该方法优化模型的优点。
  • Adam算法如何工作,以及它与相关的AdaGrad和RMSProp方法有何不同。
  • Adam算法如何配置以及常用的配置参数。

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

让我们开始吧。

什么是Adam优化算法?

Adam是一种优化算法,可以替代经典的随机梯度下降过程,根据训练数据迭代更新网络权重。

Adam由OpenAI的Diederik Kingma和多伦多大学的Jimmy Ba在其2015年的ICLR会议论文(海报)《Adam: A Method for Stochastic Optimization》中提出。在这篇文章中,我将大量引用他们的论文,除非另有说明。

该算法名为Adam。它不是首字母缩写,也不是写成“ADAM”。

……Adam这个名字来源于自适应矩估计(adaptive moment estimation)。

在介绍该算法时,作者们列出了在非凸优化问题中使用Adam的吸引人之处,如下所示:

  • 易于实现。
  • 计算效率高。
  • 内存需求少。
  • 对梯度的对角重缩放具有不变性。
  • 非常适合数据量大和/或参数量大的问题。
  • 适用于非平稳目标。
  • 适用于梯度非常嘈杂/或稀疏的问题。
  • 超参数具有直观的解释,通常需要很少的调整。

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

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

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

Adam是如何工作的?

Adam与经典的随机梯度下降不同。

随机梯度下降为所有权重更新维护一个单一的学习率(称为alpha),并且学习率在训练过程中不改变。

为每个网络权重(参数)维护一个学习率,并随着学习的进行而单独调整。

该方法根据梯度的第一和第二矩的估计值,为不同参数计算单独的自适应学习率。

作者们将Adam描述为结合了另外两个随机梯度下降扩展的优点。具体来说:

  • 自适应梯度算法(AdaGrad),它维护一个每参数学习率,在梯度稀疏的问题(例如自然语言和计算机视觉问题)上能提高性能。
  • 均方根传播(RMSProp),它也维护每参数学习率,该学习率根据权重最近梯度的平均幅度(例如它改变的速度)进行调整。这意味着该算法在在线和非平稳问题(例如嘈杂)上表现良好。

Adam实现了AdaGrad和RMSProp两者的优点。

与RMSProp根据平均一阶矩(均值)来调整参数学习率不同,Adam还利用了梯度二阶矩(未中心化的方差)的平均值。

具体来说,该算法计算梯度和平方梯度的指数移动平均值,而参数beta1和beta2控制这些移动平均值的衰减率。

移动平均值和beta1、beta2值接近1.0(推荐)的初始值会导致矩估计值偏向于零。通过先计算有偏估计,然后再计算无偏估计来克服这种偏差。

这篇论文非常易读,如果你对具体的实现细节感兴趣,我鼓励你阅读它。

如果你想学习如何在Python中从头开始编写Adam代码,请参阅教程

Adam是有效的

Adam是深度学习领域中一个流行的算法,因为它能快速获得良好的结果。

实证结果表明,Adam在实践中效果良好,与其他随机优化方法相比具有优势。

在原始论文中,Adam通过实证进行了演示,以表明其收敛性符合理论分析的预期。Adam被应用于逻辑回归算法在MNIST数字识别和IMDB情感分析数据集上,以及多层感知机算法在MNIST数据集上,还有卷积神经网络在CIFAR-10图像识别数据集上。他们得出结论:

使用大型模型和数据集,我们证明Adam可以有效地解决实际的深度学习问题。

Comparison of Adam to Other Optimization Algorithms Training a Multilayer Perceptron

Adam与其他优化算法的比较:训练多层感知机
摘自《Adam: A Method for Stochastic Optimization》, 2015。

Sebastian Ruder撰写了一篇关于现代梯度下降优化算法的综合性综述,题为《An overview of gradient descent optimization algorithms》,最初发表为博客文章,随后在2016年作为技术报告发布。

这篇论文基本上是现代方法的概览。在其题为“选择哪个优化器?”的部分,他推荐使用Adam。

总而言之,RMSprop、Adadelta和Adam是非常相似的算法,在相似的情况下表现良好……其偏差修正有助于Adam在优化后期,随着梯度变得稀疏,略微优于RMSprop。总而言之,Adam可能是最佳的总体选择。

在斯坦福大学关于深度学习在计算机视觉领域的课程“CS231n: Convolutional Neural Networks for Visual Recognition”中,由Andrej Karpathy等人开发,Adam算法再次被推荐为深度学习应用的默认优化方法

在实践中,Adam目前被推荐为默认使用的算法,并且通常比RMSProp效果稍好。然而,尝试SGD+Nesterov动量作为替代也是值得的。

随后更直白地说:

推荐使用的两种更新方式是SGD+Nesterov动量或Adam。

Adam正在被改编用于深度学习论文中的基准测试。

例如,它被用于关于图像字幕生成中注意力的论文“Show, Attend and Tell: Neural Image Caption Generation with Visual Attention”和关于图像生成的论文“DRAW: A Recurrent Neural Network For Image Generation”中。

你知道Adam的其他例子吗?在评论中告诉我。

Adam配置参数

  • alpha。也称为学习率或步长。权重更新的比例(例如0.001)。较大的值(例如0.3)会在学习率更新前导致更快的初始学习。较小的值(例如1.0E-5)会大大减慢训练过程中的学习速度。
  • beta1。一阶矩估计的指数衰减率(例如0.9)。
  • beta2。二阶矩估计的指数衰减率(例如0.999)。在梯度稀疏的问题(例如NLP和计算机视觉问题)上,此值应设置为接近1.0。
  • epsilon。一个非常小的数字,用于防止在实现中出现任何除以零的情况(例如10E-8)。

此外,学习率衰减也可以与Adam一起使用。论文中使用了衰减率alpha = alpha/sqrt(t),每过一个epoch(t)更新一次,用于逻辑回归演示。

Adam论文建议:

在测试的机器学习问题中,良好的默认设置是alpha=0.001,beta1=0.9,beta2=0.999,epsilon=10−8。

TensorFlow文档建议对epsilon进行一些调整:

epsilon的默认值1e-8可能不是一个好的通用默认值。例如,在ImageNet上训练Inception网络时,一个好的选择是1.0或0.1。

我们可以看到,流行的深度学习库通常使用论文推荐的默认参数。

  • TensorFlow:learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-08。
    Keras:lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0。
  • Blocks:learning_rate=0.002, beta1=0.9, beta2=0.999, epsilon=1e-08, decay_factor=1。
  • Lasagne:learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-08
  • Caffe:learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-08
  • MxNet:learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-8
  • Torch:learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-8

你知道Adam的其他标准配置吗?在评论中告诉我。

进一步阅读

本节列出了学习Adam优化算法的更多资源。

你知道关于Adam的其他好资源吗?在评论中告诉我。

总结

在这篇文章中,你了解了用于深度学习的Adam优化算法。

具体来说,你学到了:

  • Adam是用于训练深度学习模型的随机梯度下降的替代优化算法。
  • Adam结合了AdaGrad和RMSProp算法的最佳特性,提供了一种能够处理稀疏梯度和嘈杂问题的优化算法。
  • Adam相对容易配置,并且默认配置参数在大多数问题上都表现良好。

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

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

Better Deep Learning

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

...只需几行python代码

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

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

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

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

查看内容

对《深度学习Adam优化算法入门指南》的123条回复

  1. Adam 2017年7月3日 下午3:57 #

    这个名字有点奇怪。AdaMomE有什么问题?缩写名字只有在包含名字,即自适应矩估计时才有意义。我认为写有用论文的一部分是想出一个不会让领域内其他人感到恼火的缩写,比如任何叫Adam的人。

    • Jason Brownlee 2017年7月6日 上午9:58 #

      Adam这个名字朗朗上口。

    • known but unknown 2020年8月5日 上午1:52 #

      呵呵,你的名字叫亚当。

    • Adam’s Dad 2021年5月27日 下午3:06 #

      哈哈!你为什么把它看作是针对你个人呢?嗯,你看上去像《亚当斯一家》里的一个角色。值得思考!

      • Adam's Daughter 2022年1月11日 上午6:15 #

        是的,当然了,爸爸,有什么问题吗?🙁 我喜欢你的名字,我觉得它在这个时代也很高效;)

    • Le frère d'Adam 2022年8月5日 上午12:23 #

      你好,兄弟!不要否认你的名字,给有心人。

  2. Gerrit Govaerts 2017年7月3日 下午6:23 #

    已经使用一年了,找不到任何理由使用其他东西。我对深度学习的主要问题仍然是,由于神经网络存在大量冗余的对称性,导致存在多个等效的局部最优,因此损失了大量效率。一定有一种数学方法来解决这个问题。这让我很困惑,为什么没有人做过任何事情。如果你在组合学(旅行商问题类型的问题)中做过这个,这将被视为一个糟糕的模型配方。

    • Jason Brownlee 2017年7月6日 上午10:00 #

      能看到你在这方面有什么发现会很棒。神经网络已经被一些非常聪明的人研究了很长时间。

      • Gerrit Govaerts 2017年7月6日 下午5:29 #

        那些聪明人可能在统计学方面很出色,但非线性非凸优化是一个非常专业的领域,其他非常聪明的人在那里表现出色。整数和组合优化也是如此:非常专业的领域。 the days of “homo universalis” are long gone。顺便说一句,虽然我印象深刻于深度学习的最新成果,但我不那么佩服这项技术。它只是一个无约束的非常大的非线性优化问题,那又怎样?而且,你不应该尝试去寻找真正的最优值,因为那百分之百会过拟合。所以,最后,我们不得不得出结论,真正的学习(泛化)与优化某个目标函数不同,基本上,我们仍然不知道“学习是什么”,但我们知道它不是“深度学习”。我有一种预感,这种(深度学习)通往“通用人工智能”的方法将会失败。

        • Jason Brownlee 2017年7月9日 上午10:27 #

          我倒是认为深度学习方法只解决了人工智能的感知部分。

        • Peter Boos 2017年7月20日 下午8:30 #

          但你描述的是使用过多节点的结果,你担心过拟合。
          使用适当数量的节点,它们不会成为冗余逻辑的“野兽”。
          但我猜很多人都忽略了该训练什么、使用什么数据以及为该任务使用最佳神经网络的问题。

          我刚读了一篇文章,其中有人改进了自然语言到文本的转换,因为他考虑了这些事情,结果他不需要深度网络,而且他还能轻松地为任何语言(而非最常见的5种)进行训练。并且获得了更好的语音到文本评分。

          我认为随着硬件的发展,人们常常忘记了“优雅”的高效编码,这同样适用于神经网络设计。

          • Jason Brownlee 2017年7月21日 上午9:34 #

            我常常说,最有影响力的点在于问题的设定。

          • Joni Dambre 2018年2月15日 上午12:12 #

            你能分享一下参考文献吗?

      • Michael 2021年7月30日 上午3:44 #

        也许“彩票假说”在这里是相关的?

    • Eric Parker 2018年4月14日 上午12:15 #

      @Gerrit 我也一直在思考同样的问题——是否有办法找到对称性或规范形式,从而显著减小搜索空间?除了可能加速学习之外,这种表示法也许能带来更好的迁移学习,或者给我们带来对学习的一般性洞察。深度学习的理论似乎远远落后于实践。我必须说,结果通常是惊人的,但我不满意这种几乎完全是经验性的方法。

  3. Danilo 2017年7月4日 下午1:36 #

    嗨 Jason。感谢您提供的精彩教程。我已经阅读了一些,并正在将一些内容付诸实践。就像网上许多其他博客一样,我通过搜索“如何训练模型后预测数据”找到了您的博客,因为我正在尝试使用LSTM做一个个人项目。当然,我遇到了您内容丰富的好博客。

    我想评论的一件事是,您提到不必获得博士学位就能成为机器学习大师,我认为这是一个有偏见的说法,完全取决于读者的目标。然而,我在网上发现的大多数博士毕业生——例如,您本人、您在这篇文章中推荐的Sebastian、Andrew Ng、Matt Mazur、Michael Nielsen、Adrian Rosebrock,以及我关注并撰写了精彩内容的一些人,都拥有博士学位。排除Siraj,他是一位现任的YouTube博主,制作了很棒的机器学习视频——他是我迄今为止见过为数不多的没有博士学位,甚至没有学士学位的人之一。我的观点和问题是……没有博士学位,您会有能力制作出您网站上所有这些内容吗?我指的不仅仅是精通AI这个主题,还有撰写精彩的深度主题、为网站创建出色的设计、为他人提供书籍,甚至编写干净的Python代码吗?

    另外,关于我自己,在过去的十年里,我的职业一直在信息技术领域。我目前是一家中型企业的系统管理员,但在过去三年里,自从我上大学以来,我对编程产生了热情,这最终发展到了机器学习。我沉迷于神经网络及其反向传播,现在正沉迷于学习更多关于LSTM的知识。我一直在测试您的一个代码。虽然我仍然在预测数据方面遇到困难。如果不能预测数据,我感觉自己迷失了方向。例如,我找到的大多数文章,包括您的文章(如果我还没有在您的网站上找到答案,我很抱歉),只展示了如何训练数据和测试数据。所以,例如,我发现的是:

    x= 0001 y= 0010
    x= 0010 y= 0011
    x[m1,,,,,,m]
    y[m1,,,,,,m]
    —通常我得到的输出是—

    但是至今,我还没有学会如何将未知数据输入神经网络并预测下一个未知输出,例如:

    如果 x== 0100,那么 ‘y’会是什么?也就是说,不向神经网络输入下一个可能的输出,而是应该根据之前学习的模式来告诉我?

    如果训练集==m,测试集也==m,那么我应该能够请求结果==n。也许你可以指导我朝着正确的方向前进?

    我现在是一名计算机科学学士的第一学期学生,我一直在心里想着一路攻读博士学位,也就是成为我自己机器学习领域内容的杰出作家——不仅仅是成为一个“还行”的数据科学家,尽管我离达到那个水平还很远。坦率地说,真正吸引我攻读高等学位的是,学校里学的数学很难作为爱好来掌握。而我的情况是;这是我每天的爱好。

    谢谢您 Jason,现在该继续阅读您的博客了…… :-p。

  4. Sophie 2017年7月4日 下午10:16 #

    嘿 Jason!Nadam 和 Adam 相比怎么样?
    Nadam 是 Keras 中的一个优化器,它本质上是“Adam”+ Nesterov 动量。

    另外,什么是 Nesterov 动量?
    我们如何为特定问题找出合适的 epsilon?

    非常感谢!

  5. Enzo Maritati 2017年7月7日 上午8:41 #

    https://i.stack.imgur.com/wBIpz.png

    希望这有帮助 :)

    在这里 http://cs229.stanford.edu/proj2015/054_report.pdf 你可以找到这篇论文。

  6. Xu Zhang 2017年7月7日 上午8:53 #

    感谢您的精彩文章。如果我使用Adam作为优化器,我还需要在训练过程中进行学习率调度吗?

    非常感谢

    • Jason Brownlee 2017年7月9日 上午10:34 #

      不,我不这么认为。

      • Rushikesh Jachak 2020年4月1日 下午6:15 #

        在MNIST的特定案例中,我使用adam+学习率调度器(测试精度99.71)取得了比仅使用Adam(测试精度99.2)更好的结果。

        • Jason Brownlee 2020年4月2日 上午5:45 #

          我不确定这是否合理,因为Adam中的每个权重都有自己的学习率。

          • Michael Lohmann 2020年8月8日 上午3:41 #

            我也曾这样想过,但后来我对不同的学习率(未调度)进行了一些优化,它对收敛速度有显著影响。这有点像,因为我可以这样说:“任何(全局)学习率都会被个体学习率补偿”。这样来看:

            如果你看实现,你提到的“个体学习率”(在原始论文中是(m/sqrt(v))_i)是由梯度的幅度构成的。这与学习率完全无关!(当然,前提是前几步的梯度相同)。但不同的学习率在相同的梯度历史下会缩放所有步长,从而使alpha越大,步长就越大。

            想象一下:你正在优化一个线性斜率。动量被拾取,但有一个最大值,因为之前的步长具有指数级的较少影响。假设论文中的“m”趋向于1。这与“learning_rate”是无关的。这意味着,改变它会改变收敛速度(是的,在这种情况下“x”趋向于无穷大,但忘掉它……)。让我们回到一个有解决方案的问题:这意味着“learning_rate”会在开始时限制最大的收敛速度。但在接近解决方案时,一个大的学习率会增加实际的步长(尽管m/sqrt(v)很小),这仍然可能导致过冲。当然不会像没有自动适应那样大。

            我使用了OperatorDiscretizationLibrary (ODL: https://github.com/odlgroup/odl),它具有与原始论文(或Tensorflow)中提到的相同的默认参数。

          • Jason Brownlee 2020年8月8日 上午6:06 #

            感谢分享。

  7. James Salsman 2017年8月21日 下午5:21 #

    作为一名潜在的作者,很可能会建议一位名叫Adam的先生作为可能的审稿人,我拒绝作者的“Adam”拼写,而使用ADAM,我称之为“通过平均矩衰减的算法”(Algorithm to Decay by Average Moments),它使用了原作者“衰减”(decay)一词来表示Tensorflow称之为“损失”(loss)的。

  8. Tyler 2017年9月16日 上午2:00 #

    这里的方差似乎不正确。我不是说不正确,而是说它似乎不能真正地代表方差;方差不应该也考虑到均值吗?

    这里看起来方差在整个训练过程中都会持续增长。我们不希望方差在遇到变化很小的超曲面时缩小,而在遇到不稳定的超曲面时增加方差吗?

  9. SG 2017年11月4日 下午1:14 #

    H2o深度学习包使用ADADELTA作为默认自适应学习率。

    它有rho、epsilon和rate参数。

    rho:指定自适应学习率时间衰减因子。此参数
    类似于动量,并与先前权重更新的记忆相关。
    典型值在0.9到0.999之间。默认值为0.99。有关
    自适应学习的更多详细信息,请参阅。
    epsilon:启用时,指定自适应学习率的两个超参数中的第二个。
    此参数类似于初始训练期间的学习率退火
    以及后期阶段的动量,因为它有助于进步。
    典型值在1e-10到1e-4之间。此参数仅在
    自适应学习率启用时才有效。默认值为1e-8。有关
    自适应学习的更多详细信息,请参阅。
    rate:指定学习率。较高的值导致模型不稳定,
    而较低的值会导致收敛缓慢。默认值为0.005。

    我们可以将rho映射到beta2,将rate映射到alpha吗?
    这些参数如何影响自适应学习率?(成正比还是反比?)

    • Jason Brownlee 2017年11月5日 上午5:12 #

      好问题,我一时不确定,也许可以稍微尝试一下?

  10. Daniel 2017年11月23日 上午7:46 #

    每次我尝试理解某个机器学习主题时,很高兴找到这个博客。我可以获得如此简洁有用的信息,这让我恢复了对人类的信心。谢谢!

  11. Nadavb 2018年1月16日 上午1:24 #

    你写道:“在梯度稀疏的问题上,应将其设置为接近1.0”。“稀疏梯度”的定义是什么?

    • Jason Brownlee 2018年1月16日 上午7:37 #

      具有大量零值的梯度,例如平坦区域。

  12. Mitja 2018年1月19日 下午10:56 #

    “与RMSProp根据平均一阶矩(均值)来调整参数学习率不同,Adam还利用了梯度二阶矩(未中心化的方差)的平均值。”

    这不应该是

    “与RMSProp根据平均二阶矩(未中心化的方差)来调整参数学习率不同,Adam还利用了梯度一阶矩(均值)的平均值。”

    我认为RMSprop使用的是二阶矩,还是我弄混了?

  13. Vikram 2018年1月30日 上午1:43 #

    我期待在这个页面的开头看到一些壁纸:)
    那张壁纸很重要。看起来你忘了把它放在这里。

  14. Florian 2018年4月18日 下午6:22 #

    嗨,Jason,

    感谢这篇精彩的文章,它帮助了我很多:)
    供您参考,我正在使用Keras和Python 2.7,默认epsilon设置为1e-7而不是1e-8(我知道我很挑剔)。
    此外,还有一个“decay”参数,我不太理解。您知道如何设置它吗?(默认是None…如果这有帮助的话)

    再次感谢!
    弗洛里安

    • Jason Brownlee 2018年4月19日 上午6:28 #

      谢谢。

      抱歉,我对衰减参数没有好的建议。也许论文中提到了衰减,可以提供一些想法?

      • Florian 2018年4月24日 下午10:37 #

        不,不幸的是。它没有。

        如果这对某人有帮助,我研究了代码,发现“decay”参数允许“learning_rate”参数消失。当前的衰减值计算为1 / (1 + decay*iteration)。然后,当前学习率简单地乘以这个当前衰减值。
        结果是,步长越来越小以收敛。

        弗洛里安

  15. manal 2018年4月24日 下午9:59 #

    谢谢你付出的巨大努力
    我有一个问题,请关于优化器.adam的衰减,例如

    optimizer.adam(lr=0.01, decay=1e-6) 这里的衰减是指权重衰减,也用作正则化吗?!

    先谢谢了

  16. sangram 2018年5月2日 下午7:55 #

    嗨,Jason,

    您能否像为随机梯度下降一样,也提供一个 ADAM 在 Python 中的实现(最好是自制的)?这将有助于初学者理解 ADAM 优化。

    感谢您提供的精彩摘要。

  17. Rupert 2018年5月20日 上午7:24 #

    Python 使用优化器 = Adam
    https://github.com/llSourcell/How_to_simulate_a_self_driving_car/blob/master/model.py

  18. chris 2018年6月15日 上午9:07 #

    我的理解对吗:在反向传播训练期间,我的激活函数的梯度是通过Adam或Adaelta等进行优化的,而随机梯度下降也是像Adam或Adaelta这样的方法,或者这如何影响反向传播?

    • Jason Brownlee 2018年6月15日 下午2:50 #

      权重通过一种称为随机梯度下降的算法进行优化。

      一种有效的梯度下降版本是Adam。

      权重更新是通过一种称为“误差反向传播”或简称反向传播的方法执行的。

      • Shahar 2018年12月22日 上午10:23 #

        你好,据我所知,Adam优化器也负责更新权重。它可能会使用一种像反向传播的方法来实现。

  19. Ive Kohnenkamp 2018年12月7日 上午12:40 #

    Adam用于“使用电子健康记录进行可扩展和准确的深度学习”,在此处描述:https://ai.googleblog.com/2018/03/making-healthcare-data-work-better-with.html。然而,对Adam的引用是在论文的补充材料中,https://static-content.springer.com/esm/art%3A10.1038%2Fs41746-018-0029-1/MediaObjects/41746_2018_29_MOESM1_ESM.pdf

  20. Viktoria Schwarz 2018年12月30日 上午3:41 #

    Adam也用于Codevilla、Müller、Lopez等人的“End-to-end driving via Conditional Imitation Learning” https://arxiv.org/pdf/1710.02410.pdf

  21. Vince 2019年2月4日 下午10:04 #

    嗨 Jason,感谢这篇文章!
    我有个部分没弄懂。

    你说:“为每个网络权重(参数)维护一个学习率,并随着学习的进行而单独调整。”

    论文说:“该方法根据梯度的第一和第二矩的估计值,为不同参数计算单独的自适应学习率。”

    我不确定我是否真正理解它:算法基本上为每个权重计算一个特定的学习率,所以如果我们有一个拥有2.55亿个参数的网络,它会计算2.55亿个学习率吗?
    但这是如何可能的?我们有 alpha,这就是学习率……

    查看论文中的伪代码,我猜测它可能是这样工作的:它使用学习率alpha作为静态值,乘以(mt/(vt + e)),这在实践中会为算法的特定迭代生成一个新的学习率,但我不确定。

    我完全不理解这一部分:“并随着学习的进行而单独调整。”

    你能更清楚地解释一下吗?

    谢谢!

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

      很抱歉造成困惑。

      我强调的是,确实,为每个参数维护一个单独的学习率,并且每个学习率根据在该点流过网络的特定梯度进行调整——例如,与该权重相关,即学习率是单独调整的。

      这是基于我对论文的阅读。

      这有帮助吗?

      • Vince 2019年2月7日 下午9:31 #

        也许,我将尝试解释我的想法
        基本上,我们有一个学习率 alpha(我们手动设置),然后我们有另一个学习率 alpha2 在算法内部,当权重更新时,它会考虑我们的学习率 alpha(固定)以及为这个特定迭代计算的学习率(alpha2)。
        下一个迭代,我们有我们的固定学习率 alpha,但之前的学习率 alpha2 将被更新为另一个值,所以我们丢失了 alpha2 的先前值。

        这是一个正确的解释吗?

        顺便说一句,在寻找“alpha2”时,我注意到伪代码(https://arxiv.org/pdf/1412.6980.pdf,第2页)唯一让我想到 alpha2 是 mt/(root(vt) – epsilon),否则我不知道它可能是什么。

  22. Niko 2019年3月7日 上午8:56 #

    我使用Keras为回归问题构建了一个经典的BP ANN,它有两个隐藏层,神经元数量很少(每个层最多8个)。我使用的优化器是ADAM。用于训练和验证的样本量为20000,分别分为90%和10%。

    这些图有什么问题吗?

    https://i.imgur.com/wrP18WR.jpg

    在VAL_LOSS开始时出现这种下降是正常的吗?批次大小太小(目前是128)?是否存在过拟合/欠拟合?

  23. Chris Bishop 2019年4月30日 上午5:48 #

    嗨,Jason,

    感谢对 Adam 的介绍。它非常有帮助且易于理解。

    我目前正在使用 MATLAB 神经网络工具来分类光谱。您知道

    (i)MATLAB 是否为使用 Adam 进行分类生成模板?
    (ii)在使用基于 Adam 的系统对光谱进行分类时,是否有任何首选的起始参数(alpha、beta 1、beta 2)?

  24. Magnus 2019年5月10日 下午9:36 #

    嗨,Jason,

    我希望你能对一些优化器进行比较,例如 SGD、Adam 和 AdaBound,使用不同的批次大小、学习率、动量等。
    目前我正在为这三者进行网格搜索。我将 AdaBound 用于 Keras
    https://github.com/titu1994/keras-adabound

  25. Rahul Talari 2019年6月26日 下午9:49 #

    你好 Jason,由于 Adam 除以 √v,哪些模型参数会获得更大的更新?这可能如何帮助学习?

    澄清一下,为什么在更新学习参数时,一阶矩要除以二阶矩的平方根?

  26. sharifza 2019年9月6日 下午8:05 #

    嗨 Jason,感谢您一如既往的精彩文章。简短的问题是,如果 Adam 会自己调整学习率,那么初始学习率的设置有什么区别?似乎每个参数的个体学习率甚至没有上限为1,所以无论如何它都不应该有什么大的影响,对吧?感谢您的回答。

  27. Sher 2019年9月28日 下午3:42 #

    嗨,Jason,
    感谢您的帖子。我有一些基本问题让我很困惑。
    1)对于Adam,我们的损失函数是什么?它将是(1/N)(交叉熵)还是仅仅交叉熵,如果N是批次大小。
    2)我遵循了这篇文章,作者使用了批次大小,但在更新参数时,他没有使用参数的平均值,也没有使用总和。也许我没有完全理解。你能帮帮我吗。
    3)Adam在较大的批次大小下效果好吗?

    • Jason Brownlee 2019年9月29日 上午6:09 #

      Adam可以与你喜欢的任何损失函数一起使用。

      Adam可以与你喜欢的任何批次大小一起使用。

      Adam只是优化过程,是一种具有自适应学习率的随机梯度下降。

  28. Sher 2019年9月28日 下午3:46 #

    我忘了再问一个问题。在Adam优化过程中,我们需要衰减lambda(权重的惩罚项)和学习率吗?

    • Jason Brownlee 2019年9月29日 上午6:09 #

      你可以尝试使用 Adam,可以带或不带权重惩罚。

  29. Tanveer 2019年10月7日 下午7:33 #

    你好 Jason
    请告诉我如何在 Python 中添加“Adam 版随机梯度下降”

  30. Naresh 2019年10月14日 下午6:44 #

    你好先生,

    祝您有美好的一天!

    目前我在我的 CNN 模型中使用 adam 进行图像分类。
    我能否在 CNN 中自定义 adam 或使用某些特征/数据作为优化器?是否可能或不可能?
    请帮忙。

    • Jason Brownlee 2019年10月15日 上午6:09 #

      我不确定我的意思,你具体指的是什么?

      Adam只是一个优化算法。它不使用特征。

      • Naresh 2019年10月15日 下午3:19 #

        先生,实际上我计算了我 CNN 模型中的特征相关性损失,并想将其用作优化器以提高模型精度。所以这是否可能?

  31. Alex 2019年10月16日 下午8:26 #

    嗨,Jason,

    Beta1、Beta2和epsilon的超参数调整的合理范围是什么?

    非常感谢您分享的所有精彩内容!

    • Jason Brownlee 2019年10月17日 上午6:28 #

      很好的问题。

      学习率(lrate)可能以对数尺度进行调整。
      beta1 可能以 0.1 为增量,在 0.5 到 0.9 之间。
      beta2 可能以 0.01 为增量,在 0.90 到 0.99 之间?
      eps – 无。

      学习率(Lrate)是最有影响力的——这只是我的猜测。

  32. mingxing 2019年12月24日 下午7:00 #

    在句子“Adam优化算法是随机梯度下降的扩展”中,“随机梯度下降”应该是“mini-batch梯度下降”,对吗?

    • Jason Brownlee 2019年12月25日 上午10:35 #

      不完全是。Mini-batch/batch梯度下降只是随机梯度下降的配置。

  33. ananth 2020年3月12日 下午11:36 #

    dragonfly优化器可以在Keras编译器上使用吗?
    我的意思是 model.compile(loss=’binary_crossentropy’,optimizer=’adam’,metrics=[‘accuracy’])
    使用这一行(optimizer=’adam’)。

    • Jason Brownlee 2020年3月13日 上午8:18 #

      什么是“dragonfly优化器”?

      • ananth 2020年3月13日 下午3:08 #

        Dragonfly是一个开源的Python库,用于可扩展的贝叶斯优化。
        贝叶斯优化用于优化黑盒函数,其评估通常成本高昂。除了普通的优化技术外,Dragonfly还提供了一系列工具,可将贝叶斯优化扩展到昂贵的、大规模的问题。这些工具包括特别适用于高维优化(优化大量变量)、同步或异步并行评估(并行执行多个评估)、多保真度优化(使用廉价的近似值来加速优化过程)以及多目标优化(同时优化多个函数)的功能。

        https://github.com/dragonfly/dragonfly
        https://dragonfly-opt.readthedocs.io/en/master/getting_started_py/

        • Jason Brownlee 2020年3月14日 上午8:04 #

          感谢分享!

          • ananth 2020年3月14日 下午5:39 #

            这是否可能

          • Jason Brownlee 2020年3月15日 上午6:12 #

            不,不直接。您需要自己集成,而且我预计它不会表现得很好。

  34. Johnny Maghzal 2020年6月4日 上午4:54 #

    你好 Jason,

    说Adam只优化“学习率”公平吗?如果不是,您能否简要说明除了学习率本身之外,它还触及了哪些其他领域?

  35. Walid 2020年6月9日 上午12:03 #

    嗨 Jason,对复杂主题的清晰阐述

    您提到“与RMSProp根据平均一阶矩(均值)来调整参数学习率不同,Adam还利用了梯度二阶矩(未中心化的方差)的平均值”。

    我相信RMSProp是那个“利用了梯度二阶矩(未中心化的方差)的平均值”。

    我这样做对吗?

  36. Arthur 2020年9月11日 上午5:22 #

    查看方差计数平衡的替代方案。
    https://www.worldscientific.com/doi/abs/10.1142/S0218213020500104

  37. Andreas 2020年10月13日 上午12:20 #

    “再次,根据问题的具体情况,可以将列分成X和Y分量,这可以任意选择,例如,如果var1的当前观测值也作为输入提供,而只有var2需要被预测。”

    在我们要预测var2(t)并且var1(t)也可用时。

    var1(t-2),var2(t-2),var1(t-1) ,var2(t-1),var1(t),var2(t)

    LSTM网络需要3D输入。我们应该为train_X提供什么形状?

    我是否必须提供形状[X,1,5]?

    如果我们有一个偶数train_X(当我们没有var1(t)时),我们就必须这样塑形,

    [X,2,2]

    但现在它不是偶数,我不能这样塑形,因为我们有5个特征用于train_X

    唯一的解决方案是提供形状[X,1,5]吗?

    *X为数据集长度

  38. Vitomir 2020年11月4日 下午7:39 #

    我喜欢你解释事物的方式——它非常专注、简短且精确。
    继续做,谢谢。

  39. kiki 2020年12月30日 下午5:12 #

    模型大小与不同的优化器相比有巨大差异,对吗?Adam训练的模型比SGD模型大得多。Adam模型比SGD模型更好,除了模型大小问题。我想知道你对此问题有什么建议。

    • Jason Brownlee 2020年12月31日 上午5:21 #

      模型的大小在不同的优化器下不会改变。

      优化器的作用是使用固定的训练数据集在一个固定大小的模型中找到一组参数(权重)。

  40. Brando Miranda 2021年2月12日 上午3:41 #

    Adam需要学习率衰减吗?

    • Jason Brownlee 2021年2月12日 上午5:48 #

      是也不是,它会自动为每个参数调整学习率,并且这种自动调整的一部分涉及一些动量衰减。

  41. Saige 2021年2月20日 下午9:01 #

    谢谢。您真是我解答了所有问题的老师。

  42. Maha 2021年3月12日 上午8:22 #

    如果我想为我的深度学习模型选择最佳优化器(从ADAM、Sgdm等中选择),我该如何比较它们之间的性能?是否有任何建议可以比较它们,通过图表、数值等?
    而且,我应该先选择学习率还是优化器?

    实际上,我该如何为模型选择最佳学习率和最佳优化器,先选择谁,以及如何选择??

    • Jason Brownlee 2021年3月12日 下午1:22 #

      也许可以逐一测试每种优化器,并尝试多种配置,看看哪种能带来最佳性能的模型。

      先运行一次Adam,然后运行SGD并对其进行调整,看看它是否能做得更好,这可能更具成本效益。

  43. Kam 2021年4月26日 上午9:21 #

    你好!你的书《Better Deep Learning》中是否涵盖了Adam?如果没有,你是否在你的另一本书中涵盖了它?

    • Jason Brownlee 2021年4月27日 上午5:11 #

      不,还没有。我希望将来能有一本专门关于“优化”的书。

  44. Ayhan 2021年4月27日 上午5:47 #

    谢谢。非常好的文章。

  45. Prakash M Nadkarni 2021年7月30日 上午12:01 #

    您的文章一如既往地清晰地阐述了主题。存在一些小小的拼写错误。
    “Adam是一种优化算法,可以代替经典的随机梯度下降过程,通过训练数据迭代地更新网络权重。”
    您是指“iterativeLY based ON training data”(基于训练数据迭代地)吗?

  46. Prakash M Nadkarni 2021年7月30日 上午12:16 #

    您的文章一如既往地清晰地阐述了主题。存在一些小小的拼写错误。

    “Adam是一种优化算法,可以代替经典的随机梯度下降过程,通过训练数据迭代地更新网络权重。”
    您是指“iterativeLY based ON training data”(基于训练数据迭代地)吗?

    “Adam与经典的随机梯度下降不同。”
    我猜您是指“FROM classical…”(不同于经典…)?

    “为每个网络权重(参数)维护一个学习率,并随着学习的进行进行单独调整。”——建议添加“使用Adam,一个学习率…”

    “updted each epoch”(每个epoch更新)->“updated”(更新)

  47. Shah 2021年12月24日 下午7:21 #

    尊敬的Jason Brownlee先生
    感谢您提供精彩的内容。
    我有一个问题,正如原始论文所述,每个权重都有自己的学习率,但我使用Adam + 学习率调度器(ReduceLROnPlateau)得到了更好的结果。

    您可以在此处查看:https://imgur.com/a/P2mkQWy
    理论上没有材料可以证明这一点,您能解释一下可能的原因吗?
    谢谢你。

  48. Zuheer 2022年1月3日 下午3:41 #

    嗨,Jason,

    感谢您提供精彩的文章。
    我想告诉您,我正在使用学习调度器(Adam配合ReduceLROnPlateau)。我清楚地看到,它确实影响了模型的性能。您可以通过访问以下链接进行查看。

    https://imgur.com/a/P2mkQWy

    您能解释一下背后的逻辑吗?

    我将非常感谢您

    此致,

    • James Carmichael 2022年1月4日 上午10:46 #

      你好Zuheer,

      我可以更好地协助您解决关于我们材料中提出的概念的具体问题。

      此致,

  49. Zuheer 2022年1月4日 下午5:22 #

    好的,明白了。

    非常感谢。

  50. Daniel Kleine 2022年4月28日 下午9:52 #

    “Sebastian Ruder开发了一篇题为《梯度下降优化算法概述》的关于现代梯度下降优化算法的全面综述,最初发表为博客文章,然后于2016年发表为技术报告。”
    -> 博客文章的链接不起作用。这是正确的链接吗?
    https://ruder.io/optimizing-gradient-descent/

留下回复

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