勘误: 关于 outlier 部分的讨论,将 AMSGrad 误写为 SGD,现已更正。
年初,自己还是个不太上道的菜鸟时,写了一篇 从 SGD 到 Adam —— 深度学习优化算法概览 (一),简单梳理了在深度学习发展历程中最为常用的几类优化算法。
我们知道,Adam 是其中综合性能出色的一种算法,自适应学习率的引入使得损失函数可以快速收敛。然而,实践证明,虽然在训练早期 Adam 拥有出色的收敛速度,使用其训练的模型的最终泛化能力却并不如使用朴素 SGD 训练的好(体现在 Adam 训练的模型最终收敛时的 test error 更大)。
近来有若干工作针对 Adam 的这一缺陷进行探索,其中有些工作也提出了一些可供尝试的修正方案,包括但不限于:
总结来看,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,时间也还比较合适。
如果有大佬也对这个方向有兴趣欢迎多多交流合作~
使用的过程中,发现 amsgrad 确实可以达到很好的效果
具体是什么任务呢?
以前做文本分类的时候竟然遇到过 sgd 不收敛。。。
讲道理我觉得这几个算法要说收敛我觉得肯定都是能收敛的… 不过不收敛的情况千千万,大部分时候感觉还是训练参数设错了
嗯对的,感觉在那个 task 里面可能是初始 lr 太过敏感了。
AMSGrad 感觉适用性不是特别好,效果和模型有关,调参需要的尝试可能大于 ADAM...
嗯后续多做一些实验比较应该就能看出来它的效果了
其一里面的去掉异常值和不去掉异常值都是同一个收敛结果,这个收敛结果和 SGD 有和没有的收敛结果比哪个更好呢?
作者给出的构造是很抽象的,并没有辅以现实例子来做进一步说明,所以不是特别好直接说哪个好哪个不好。如果按我的设想,作者的构造对应于有少量 outlier 的数据,并且本身数据不是那种合理的高 bias 特征的情况下,对 outlier 不敏感的 Adam 应该更好
另外不好意思我发现这个地方应该是 AMSGrad 不是 sgd,文章已经修改了
遇到过不少次再用 Adam 优化的时候,loss 在过了几千次 iteration 之后,loss 能在二十个 iteration 内突然从 0.6 降到 0.3 (binary cross entropy loss),然后再 test set 上的 performance 就抖然降低,我就很 naive 的以为是 overfitting 了,现在看来换个优化器说不定有效果
这确实是 overfit
但是有时候换一个超参配置,就不会,很玄学
小数据集上感觉 Adam 虽然前期收敛快,但后期感觉泛化能力差和训练变慢,sgd 会好不少
你好,请问一下 Adam 的证明是不是有错误,就是那个归纳法?
Hi, 最后有复现一下 [2] [3] 中的方法吗?目前看到有人做过类似实验,[2]不太好,[3]比较有效果,另外 [4] 也不错,不知这边结论是不是一致
全文完
《Adam 究竟还有什么问题 —— 深度学习优化算法概览 (二)》
原文:https://www.cnblogs.com/cx2016/p/12870306.html