前言
本文介绍从Adam切换至SGD的两篇工作。(很久没更新了,今天继续介绍优化器)
SWATS
我们在之前的文章中介绍到,Adam的初期收敛速度快但(某些任务上)泛化性不如SGD。故而训练前期使用自适应方法,后期使用SGD这样一种混合策略可以结合两者的优点。17年的Improving Generalization Performance by Switching from Adam to SGD提出的SWATS优化器便应运而生。
整个算法步骤流程如下:
算法本身很简单,不过有一点值得吐槽,作者把 $\boldsymbol{v}_k$换成了$\boldsymbol{a}_k$,更新量$\boldsymbol{p}_k$那里又搞了个$\boldsymbol{\alpha}_k$(应该是lr scheduler),有点混乱。作者比较trick的地方就是14行到24行这一部分。这一部分作者做了部分推导,让$\lambda_k/(1-\beta_2^k)$作为最后的切换learning rate。切换的判定就不展开了,详细内容参见原文。
AdaBound
SWATS论文中说从Adam到SGD转换的时机没有引入额外超参,但却有额外的判断计算量,对于现代深度学习而言是不能接受的。有没有一种自动的转换方法呢?ICLR 2019上一篇文章有一定的insight:Adaptive Gradient Methods with Dynamic Bound of Learning Rate。AdaBound并不是手动将Adam切换到SGD上,而是为学习率设置了一个动态的上下界:
关键在于第6步,AdaBound为$\alpha /\sqrt{\boldsymbol{v}_t}$设置了一个动态边界:$[\eta_l(t),\eta_u(t)]$。注意这个区间并没有随维度变化而变化,而是统一的,这便是AdaBound的精髓所在。此外论文中的算法与实际代码有一定的区别:(1)论文中裁剪后的步长还除以了$\sqrt{t}$,这是为了证明收敛性方便,实际实现的时候没有;(2)实际代码中还引入了Adam的bias correction。为了看的更清楚我们把代码中的算法用我们熟悉的记号写出来:
$$ \begin{align} m^{(\tau)}_i&=\beta_1\cdot m_i^{(\tau-1)}+(1-\beta_1)\cdot g^{(\tau)}_i\\ v^{(\tau)}_i&=\beta_2\cdot v_i^{(\tau-1)}+(1-\beta_2)\cdot \left(g_i^{(\tau)} \right)^2\\ \Delta_i&=\frac{\eta^{(\tau)}\cdot \frac{\sqrt{1-\beta_2^\tau}}{1-\beta_1^\tau}}{\sqrt{v_i^{(\tau)}}+\varepsilon}\\ \theta^{(\tau+1)}_i&=\theta^{(\tau)}_i-\text{Clip}(\Delta_i,\alpha_l^{(\tau)},\alpha_u^{(\tau)}) \cdot m^{(\tau)}_i \end{align}\tag{1} $$
其中$\eta^{(\tau)}$为LR scheduler,$\alpha_l^{(\tau)},\alpha_u^{(\tau)}$为上下界,在代码中作者推荐:
$$ \begin{align} \alpha_l^{(\tau)}&=\eta^{(SGD)}\cdot\left[1-\frac{1}{\gamma\cdot \tau+1} \right]\\ \alpha_u^{(\tau)}&=\eta^{(SGD)}\cdot\left[1+\frac{1}{\gamma\cdot \tau} \right]\\ \end{align}\tag{2} $$
其中$\eta^{(SGD)}$为最终切换到SGD时的学习率;$\gamma$为边界的衰减速度超参,可以理解为从自适应方法向SGD切换的速度。
总体下来AdaBound提出了自动切换方法理论上有一定insight,算从自适应切换到SGD这个idea上一篇不错的工作。但是引入的超参有点多,具体使用的时候调参难度可能有点大,而且一些比较有代表性的实验没有做(BERT、ImageNet等)。收敛性的分析同样是基于在线凸优化框架,这里就不展开了。
小结(一)
我们介绍了SWATS与AdaBound两篇工作,这两者都是基于Adam的初期收敛速度快而SGD泛化性能更好这一现象,设计了一种过渡算法,手动指定或逐渐估计出一个fixed learning rate,将$v_i^{(\tau)}$逐渐固定下来。还有一个NosAdam也可归为这一类:从机制上结合了Adam与SGD。可能有读者觉得不过瘾:这些方法大都缺少较为严谨的理论支撑,有没有在理论上结合Adam与SGD的优化器?为了深入理解这个问题我们还需要一些预备知识,在下一篇文章中再介绍。
References
- (SWATS) Improving Generalization Performance by Switching from Adam to SGD, Nitish Shirish Keskar, Richard Socher,arXiv 2017 [[PDF]](https://arxiv.org/pdf/1712.07628.pdf) [[PyTorch Implementation]](https://github.com/Mrpatekful/swats)
- (AdaBound) Adaptive Gradient Methods with Dynamic Bound of Learning Rate, Liangchen Luo, Yuanhao Xiong, Yan Liu, Xu Sun, ICLR 2019 [[ICLR PDF]](https://openreview.net/pdf?id=Bkg3g2R9FX) [[Official PyTorch Implementation]](https://github.com/Luolc/AdaBound)