将优化算法的框架搬来. 首先定义符号. w为待优化参数, f(w)为目标函数, α为初始学习率.
在每步t中:
计算目标函数关于当前参数wt的梯度: gt=∇f(wt)
根据历史梯度g1,g2,⋯,gt计算一阶动量和二阶动量: mt=ϕ(g1,g2,⋯,gt); Vt=ψ(g1,g2,⋯,gt)
计算当前时刻的下降梯度: ηt=α⋅mt/Vt
根据下降梯度更新参数: wt+1=wt−ηt
Adam
Adam(Adaptive Moment Estimation)将一阶动量和二阶动量集合起来, Adam即Adaptive + Momentum.
一阶动量和二阶动量分别为:
mt=β1⋅mt−1+(1−β1)⋅gt
Vt=β2∗Vt−1+(1−β2)gt2
引入了两个超参数β1和β2, 分别控制一阶动量和二阶动量的影响. 实际使用过程中, 参数的经验值是:
β1=0.9,β2=0.999
为防止在训练起始阶段一阶二阶动量失真, 一般使用偏差修正过的指数移动平均值:
m~t=mt/(1−β1t)V~t=Vt/(1−β2t) Adam的优点
Adam继承了Adagrad自适应学习率的特性, 对于稀疏梯度处理较好. 对于大多情况, 可以使用Nadam取得更好的效果.
Adam的问题
显存占用过多
因为要计算一阶动量和二阶动量, 根据平滑更新的方法, 要保存当前时刻对应的值. 因此Adam占用的显存实际上是纯参数占用量的三倍. 这对于一些包含很多参数的大模型来说, 将会造成显存溢出.
可能不收敛
论文On the Convergence of Adam and Beyond探讨了Adam算法的收敛性, 通过反例证明了Adam在某些情况下可能会不收敛.
这是由于会发生学习率震荡的现象. 考虑优化算法的学习率为α/Vt, 只有在两种情况下, 学习率是单调递减的:
AdaGrad, 其二阶动量不断累积, 单调递增, 导致学习率单调递减
学习率是单调递减的, 最终收敛到0, 模型也得以收敛(虽然这种递减可能会引起训练提前停止的问题). 但Adam中的学习率主要是由二阶动量控制的, 二阶动量是固定时间窗口内的累积, 随着时间窗口的变化, 遇到的数据可能发生巨变, 使得Vt可能会时大时小, 不是单调变化. 这就可能在训练后期引起学习率的震荡, 导致模型无法收敛.
修正的方法, 对二阶动量的变化进行控制, 避免上下波动, 保证∥Vt∥≥∥Vt−1∥, 使得学习率单调递减:
Vt=max(β2∗Vt−1+(1−β2)gt2,Vt−1)
可能错过全局最优解
论文The Marginal Value of Adaptive Gradient Methods in Machine Learning讲到具有自适应学习率的优化算法, 可能会对前期出现的特征过拟合, 后期才出现的特征很难纠正前期的拟合效果.
论文Improving Generalization Performance by Switching from Adam to SGD在CIFAR-10数据集上进行了实验, 发现Adam在后期的学习率太低, 影响了有效的收敛. 对Adam的学习率的下界进行控制, 发现效果好了很多.
这是两种影响Adam错过全局最优解的原因.
一个有效的改进方法是: 在训练的前期使用Adam, 享受Adam快速收敛的优势, 后期切换到SGD, 慢慢寻找最优解. 这个切换点可以根据经验人工进行, 而论文Improving Generalization Performance by Switching from Adam to SGD也给出了一种自动切换的方法.
Adam+SGD
先用Adam快速下降, 再用SGD调优. 这种思路有两个技术问题:
切换算法以后用什么样的学习率. Adam用的是自适应学习率, SGD接着训练的话, 用什么样的学习率
切换后使用什么样的学习率?
对于第二个问题, Adam和SGD的下降方向分别为:
ηtAdam=(α/Vt)⋅mt
ηtSGD=αSGD⋅gt
那么ηtSGD必定可以分解为ηtAdam所在方向及其正交方向上的两个方向之和:
上图中p为Adam的下降方向, g为SGD优化算法求得的梯度方向, γ为SGD的学习率.
ηtSGD在ηtAdam方向上的投影, 就意味着SGD在Adam算法决定的下降方向上前进的距离, 而在ηtAdam正交方向上的投影是SGD在自己选择的修正方向上前进的距离. 因此, 如果SGD要走完Adam未走完的路, 需要先沿着ηtAdam方向走一步, 然后沿着其正交方向上再走一步.
那么SGD的学习率(步长)可以如下参考确定. SGD在Adam下降方向上的正交投影, 应该正好等于Adam的下降方向, 即:
projηtSGD=ηtAdam
求解上面的方程, 就能得到SGD的学习率:
αtSGD=((ηtAdam)TηtAdam)/((ηtAdam)Tgt)
为了减少噪声影响, 作者使用移动平均值来修正对学习率的估计:
λtSGD=β2⋅λt−1SGD+(1−β2)⋅αtSGDλ~tSGD=λtSGD/(1−β2t) 这里直接复用了Adam的β2超参数.
什么时候进行切换?
在整个优化过程中, 即使是使用Adam的阶段, 一直计算上式中的λ~tSGD. SGD的相应学习率的移动平均值基本不变的时候:
λ~tSGD−αtSGD<ε
那么就由Adam切换到SGD, 并以λ~tSGD的学习率继续训练.
Nadam
Adam集成了一阶动量和二阶动量, 具有很好的特性. Nadam是在Adam的基础上, 进一步集成了NAG(Nesterov Accelerated Gradient), Nadam = Nesterov + Adam.
gt=∇f(wt−α⋅mt−1/Vt−1)
参考资料