• 《Adam 那么棒,为什么还对 SGD 念念不忘 (2)—— Adam 的两宗罪》


    Adam 那么棒,为什么还对 SGD 念念不忘 (2)—— Adam 的两宗罪

    上篇文章中,我们用一个框架来回顾了主流的深度学习优化算法。可以看到,一代又一代的研究者们为了我们能炼(xun)好(hao)金(mo)丹(xing)可谓是煞费苦心。从理论上看,一代更比一代完善,Adam/Nadam 已经登峰造极了,为什么大家还是不忘初心 SGD 呢?

    举个栗子。很多年以前,摄影离普罗大众非常遥远。十年前,傻瓜相机开始风靡,游客几乎人手一个。智能手机出现以后,摄影更是走进千家万户,手机随手一拍,前后两千万,照亮你的美(咦,这是什么乱七八糟的)。但是专业摄影师还是喜欢用单反,孜孜不倦地调光圈、快门、ISO、白平衡…… 一堆自拍党从不 care 的名词。技术的进步,使得傻瓜式操作就可以得到不错的效果,但是在特定的场景下,要拍出最好的效果,依然需要深入地理解光线、理解结构、理解器材。

    优化算法大抵也如此。在上一篇中,我们用同一个框架让各类算法对号入座。可以看出,大家都是殊途同归,只是相当于在 SGD 基础上增加了各类学习率的主动控制。如果不想做精细的调优,那么 Adam 显然最便于直接拿来上手。

    但这样的傻瓜式操作并不一定能够适应所有的场合。如果能够深入了解数据,研究员们可以更加自如地控制优化迭代的各类参数,实现更好的效果也并不奇怪。毕竟,精调的参数还比不过傻瓜式的 Adam,无疑是在挑战顶级研究员们的炼丹经验!

    最近,不少 paper 开怼 Adam,我们简单看看都在说什么:

    Adam 罪状一:可能不收敛

    这篇是正在深度学习领域顶级会议之一 ICLR 2018 匿名审稿中的 On the Convergence of Adam and Beyond,探讨了 Adam 算法的收敛性,通过反例证明了 Adam 在某些情况下可能会不收敛。

    回忆一下上文提到的各大优化算法的学习率:

    其中,SGD 没有用到二阶动量,因此学习率是恒定的(实际使用过程中会采用学习率衰减策略,因此学习率递减)。AdaGrad 的二阶动量不断累积,单调递增,因此学习率是单调递减的。因此,这两类算法会使得学习率不断递减,最终收敛到 0,模型也得以收敛。

    但 AdaDelta 和 Adam 则不然。二阶动量是固定时间窗口内的累积,随着时间窗口的变化,遇到的数据可能发生巨变,使得 可能会时大时小,不是单调变化。这就可能在训练后期引起学习率的震荡,导致模型无法收敛。

    这篇文章也给出了一个修正的方法。由于 Adam 中的学习率主要是由二阶动量控制的,为了保证算法的收敛,可以对二阶动量的变化进行控制,避免上下波动。

    通过这样修改,就保证了 ,从而使得学习率单调递减。

    Adam 罪状二:可能错过全局最优解

    深度神经网络往往包含大量的参数,在这样一个维度极高的空间内,非凸的目标函数往往起起伏伏,拥有无数个高地和洼地。有的是高峰,通过引入动量可能很容易越过;但有些是高原,可能探索很多次都出不来,于是停止了训练。

    近期 Arxiv 上的两篇文章谈到这个问题。

    第一篇就是前文提到的吐槽 Adam 最狠的 The Marginal Value of Adaptive Gradient Methods in Machine Learning。文中说到,同样的一个优化问题,不同的优化算法可能会找到不同的答案,但自适应学习率的算法往往找到非常差的答案。他们通过一个特定的数据例子说明,自适应学习率算法可能会对前期出现的特征过拟合,后期才出现的特征很难纠正前期的拟合效果

    另外一篇是 Improving Generalization Performance by Switching from Adam to SGD,进行了实验验证。他们 CIFAR-10 数据集上进行测试,Adam 的收敛速度比 SGD 要快,但最终收敛的结果并没有 SGD 好。他们进一步实验发现,主要是后期 Adam 的学习率太低,影响了有效的收敛。他们试着对 Adam 的学习率的下界进行控制,发现效果好了很多

    于是他们提出了一个用来改进 Adam 的方法:前期用 Adam,享受 Adam 快速收敛的优势;后期切换到 SGD,慢慢寻找最优解。这一方法以前也被研究者们用到,不过主要是根据经验来选择切换的时机和切换后的学习率。这篇文章把这一切换过程傻瓜化,给出了切换 SGD 的时机选择方法,以及学习率的计算方法,效果看起来也不错。

    到底该用 Adam 还是 SGD?

    所以,谈到现在,到底 Adam 好还是 SGD 好?这可能是很难一句话说清楚的事情。去看学术会议中的各种 paper,用 SGD 的很多,Adam 的也不少,还有很多偏爱 AdaGrad 或者 AdaDelta。可能研究员把每个算法都试了一遍,哪个出来的效果好就用哪个了。

    而从这几篇怒怼 Adam 的 paper 来看,多数都构造了一些比较极端的例子来演示了 Adam 失效的可能性。这些例子一般过于极端,实际情况中可能未必会这样,但这提醒了我们,理解数据对于设计算法的必要性。优化算法的演变历史,都是基于对数据的某种假设而进行的优化,那么某种算法是否有效,就要看你的数据是否符合该算法的胃口了。

    算法固然美好,数据才是根本。

    另一方面,Adam 之流虽然说已经简化了调参,但是并没有一劳永逸地解决问题,默认参数虽然好,但也不是放之四海而皆准。因此,在充分理解数据的基础上,依然需要根据数据特性、算法特性进行充分的调参实验,找到自己炼丹的最优解。而这个时候,不论是 Adam,还是 SGD,于你都不重要了。

    少年,好好炼丹吧。

    关于优化算法的选择和 tricks,欢迎继续移步阅读:

    Adam 那么棒,为什么还对 SGD 念念不忘 (3)

    ————————————————————

    行有所思,学有所得,陋鄙之言,请多指教。

    欢迎关注我的微信公众号 Julius-AI

    写下你的评论...
     

    adam 这一流太消耗存储空间了,而且使用不得当,很容易破坏其它正则化的理论要求环境,因为存下的记忆不仅带有 loss 本身的信息,还有其它约束 xx 正则化啥的信息。。。

    adam 这一流太消耗存储空间了,而且使用不得当,很容易破坏其它正则化的理论要求环境,因为存下的记忆不仅带有 loss 本身的信息,还有其它约束 xx 正则化啥的信息。。。

    楼主棒棒哒 支持一下 期待后续文章!

    谢谢支持!

    已更新~

    Api 工程师表示很开心能看到这类文章,期待后续

    谢谢支持!

    已更新第三篇哈

    adam 实际用下来性能总是差 SGD 一截,我不在乎多训几个小时,能达到 state-of-the-art 才能发论文啊!

    其实。。三层的 SRCNN 上真的能观察到这一点,虽然 SGD 收敛慢很多但是性能比 adam 高到不知道哪里去了(但是 adam 初始收敛是真的快啊

    请教一下,话说 SGD 比 adam 能高多少 db 左右呢?

    太久远了忘记了

    adam 强制中断重启,是我屡试不爽的炼丹大法,哈哈

    adam with warm restarts?

    我用 adam 在训练集上收敛超快,但是验证集上效果却比 adadelta 差不少,可能是我使用的姿势不对?

    最近那个说给 adam 修复 weight decay 的文章呢?

    我觉得那个观点还是比较有意思的,说大家 adam 有时候效果不好是因为 adam 配 weight decay 的通常实现是错的……

    请问是哪一篇文章啊?

    "fixing weight decay regularization in adam"

    写得真不错!

    谢谢支持,已更新第三篇

    请问一阶动量和二阶动量的物理含义是什么?更号下二阶动量为什么不能用一阶动量替代?

    一阶动量(梯度的移动加权平均)是在方向上相互抵消来防止震荡(震荡即走弯路),因为一阶是一个向量有不同方向。二阶动量(梯度平方的移动加权)是在向量的模上累加,然后放在分母上以减小学习率(迭代步长)来减小震荡(步长小就不会来回走那么远),所以分母上用的是二阶动量而不是一阶动量

    刚发现 ADAM 在 non-smooth case 下不太 work 的回来点个赞

    请问 对于第一点:Adam 法就不能用 lr_scheduler 来 lr decay 了吗? 二阶动量项只是用来区分不同参数的 lr 的小的呀 并不是全局 lr 的限制。

    对于第二点,类似高原的地带,SGD 比 Adam 好在哪里呢?不也是走不出去才对吗

    Adam 的第一个问题中, Adam 的收敛性证明中学习率采用了 alpha = alpha / sqrt(T) 的形式, 到训练后期 T 非常大时震荡不一定会太大。

    学习率震荡为何会导致不收敛?梯度收敛应该也可以让模型收敛吧

    学习率震荡如出现极端学习率(如学习率即步长很大)时,可能会步子太长扯着蛋,所以即使梯度收敛很小,极端学习率很大也可能导致跑过最优点继而到了一个很放荡不羁的位置然后越跑越骗

    看了 pytorch 的官方 adam 实现,没有看到固定时间窗口内累积这块的代码,只看到 moving average, 还是我理解的姿势不对

    动量意指利用前面时刻的惯性,前一时刻是往左跑,下一时刻如果是往右跑(左右左右即出现了震荡),那么利用前一时刻的向左的惯性,我这次就不会往右跑太多,即减小了震荡,具体的迭代式子叫做 moving weighted exponentially average,这个移动加权平均就是近似对前面一段时间窗口的累积平均。因为固定时间窗口的话我们需要储存前面几个窗口的值,而利用移动加权平均则只需要迭代一步即可。具体的思想去百度下移动加权平均就知道了

    谢谢楼主,话说使用 Adam 时也可以同时使用学习率衰减呀,到后期这样震荡应该也不是很明显?

    请教下,感觉 adadelta 和 rmspro 这种计算的都是二阶动量的 running average,这样计算的二阶动量和不一定是一直增大的,您说 “这就可能在训练后期引起学习率的震荡,导致模型无法收敛。”,我怎么觉得,不止后期,甚至全程的自适应学习率都不会下降,模型根本不会收敛,也更不会 earlystop。。。是我哪里理解不到位么?。

    炼(xun)好(hao)金(mo)丹(xing)这块的文字和拼音反过来是不是更好

     

    Adam 罪状一:可能不收敛Adam 罪状二:可能错过全局最优解

    到底该用 Adam 还是 SGD?

  • 相关阅读:
    [USACO08OCT]Watering Hole
    [USACO08OCT]Watering Hole
    Mininet系列实验(七):Mininet脚本实现控制交换机行为
    IIS与TOMCAT协同工作---在IIS下运行JSP页面
    代码与编程题
    JAVA面试题集
    Jquery测试题
    Java---SSH(MVC)面试题
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
  • 原文地址:https://www.cnblogs.com/cx2016/p/12870085.html
Copyright © 2020-2023  润新知