Adam 究竟还有什么问题 —— 深度学习优化算法概览(二)

Adam 究竟还有什么问题 —— 深度学习优化算法概览(二)

勘误: 关于 outlier 部分的讨论,将 AMSGrad 误写为 SGD,现已更正。


年初,自己还是个不太上道的菜鸟时,写了一篇 从 SGD 到 Adam —— 深度学习优化算法概览(一),简单梳理了在深度学习发展历程中最为常用的几类优化算法。

我们知道,Adam 是其中综合性能出色的一种算法,自适应学习率的引入使得损失函数可以快速收敛。然而,实践证明,虽然在训练早期 Adam 拥有出色的收敛速度,使用其训练的模型的最终泛化能力却并不如使用朴素 SGD 训练的好(体现在 Adam 训练的模型最终收敛时的 test error 更大)。

相关工作

近来有若干工作针对 Adam 的这一缺陷进行探索,其中有些工作也提出了一些可供尝试的修正方案,包括但不限于:

  1. The Marginal Value of Adaptive Gradient Methods in Machine Learning. 作者给出了一个有趣的二分类问题构造,证明了在此构造下 SGD 可以收敛至最优解而 Adaptive 方法会收敛至一个泛化能力很差的结果(模型对所有输入都会始终预测为 true);并在若干个经典任务上实验证实 SGD 方法都达到了最低的 test error。
  2. On the Convergence of Adam and Beyond. ICLR 2018 best paper。文章包含了大量理论推导,证明了在特定初始条件下 Adam 存在收敛问题,并将问题归因于更新步长不是单调下降的;作者给出了一个修正方案保证了单调性,声称可以达到更低的 training loss。
  3. Improving Generalization Performance by Switching from Adam to SGD. 该文章指出了 Adam 最终的 test error 往往小于 SGD 的现象,给出一个先用 Adam 在初期进行训练加速收敛,并在合适时机切换为 SGD,追求更好的最终泛化能力的训练策略。
  4. Fixing Weight Decay Regularization in Adam. 这篇文章 ICLR 2018 被拒了 (8 7 4)。文章指出了一个非常小的点在于,目前主流框架对于 Adaptive 方法中 L2 regularization 的实现是错误的:L2 regularization 对于大小相同的参数值应当以同样的规模进行 weight decay,但在 Adaptive 方法下梯度较大的那一个 decay 的幅度会更小;作者同时在原算法上给出了简单的修正方案。
  5. Normalized Direction-preserving Adam. 文章提出了一种名为 ND-Adam 的 Adam 修正方案,将参数更新的方向和大小分别对待。本文 ICLR 2018 被拒 (5 5 4),文章本身还有所欠缺。

收敛和泛化能力

总结来看,Adam 的缺陷主要需要从两方面来看待:收敛性和泛化能力。

[2] 主要攻击的是 Adam 有可能无法收敛至全局最优解。虽然本文荣获 ICLR 2018 best paper,但个人认为这篇 paper 的意义十分有限,同时有很大误导性

其一,作者通过构造一个非常极端的例子证明 Adam 可能不收敛,但该构造是极其极端且不应该在实际情况中出现的:拥有少量频次非常低的、梯度却非常大的数据点的数据 —— 在实际应用中,这些点难道不就是 outlier 么?如果按作者的构造,一百份数据中才有一组这样的数据,而如果这本身不是由于数据的 bias 造成的,那模型理应去拟合数量多的数据以达到更好的泛化能力。同时,在作者的构造下,如果去除这些罕见数据点,那么 Adam 会与不去除一样收敛到相同位置;而 AMSGrad (作者提出的新方法) 则会因为罕见数据点是否存在的不同而收敛到完全不同的结果。个人认为这个构造反而是证明了 Adam 比 AMSGrad 更能应对 outlier 值,极端构造下的收敛性,并不意味着什么。

其二,作者的实验中用修正方法 AMSGrad 和原始 Adam 进行比较,证明修正方案可以获得比 Adam 更低的 training loss。然而,training loss 的意义对于一个模型是十分有限的。模型的 test loss 和 test performance (通常用与 loss function 不同的评价指标反映,例如分类问题中使用 accuracy 而不是 cross entropy) 远比 training loss 重要。事实上,Adam 很多时候都能在训练集上获得比 SGD 更低的 loss 却在测试集上表现更差。 追求低的 training loss 很有可能是本末倒置的。有同样质疑的人也对文章进行了复现,博客 Experiments with AMSGrad 也通过实验打脸作者 claim 的 「AMSGrad training loss 低也带来 test loss 低」的说法是错误的。

其三,最后说作者的修正方案,是通过手动维护二阶动量单调增从而使得更新步长单调减。而这与我的实验直觉是相悖的:Adam 最后的步长往往不是过大而是过小了。事实上,[3] 中的实验也证明了 Adam 训练末期过小的步长是导致泛化性能差的重要原因。


相对于收敛性,泛化能力,也即模型在未知数据(狭义的讲,即测试集)上的 performance 对模型而言才是更加重要的性质。

[1] 推测 Adaptive 方法泛化能力不强的原因是各个参数的更新步长不同所致;[3] 实验表明训练后期更新步长过小也是原因之一。综上而言,在训练后期通过限制更新步长下界并且想办法使得各个参数更新步长相近,是修正 Adam 的大的方向。先用 Adam 后切 SGD 固然是可行的,但仍然显得不够优雅,如果能用一个统一的迭代算法兼顾 Adam 的快速收敛能力和 SGD 的好的泛化能力那就很棒了。

后续

结束 EMNLP 投稿之后到期末之前没有什么太具体的新的研究任务。打算最近尝试复现一下 [2] [3] 中的方法,亲自验证一下本文上述判断是否合理。

在此基础上也希望按上文提到的大方向思考一下 Adam 有何更加优雅的改进方案,如果实验顺利可以考虑做一篇工作投 ICLR 2019,时间也还比较合适。

如果有大佬也对这个方向有兴趣欢迎多多交流合作~

编辑于 2018-05-30 16:33