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