Adam优化器结合了AdaGrad和RMSProp两种优化算法的优点。对梯度的一阶矩估计(First Moment Estimation,即梯度的均值)和二阶矩估计(Second Moment Estimation,即梯度的未中心化的方差)进行综合考虑,计算出更新步长。
- 实现简单,计算高效,对内存需求少。
- 参数的更新不受梯度的伸缩变换影响。
- 超参数具有很好的解释性,且通常无需调整或仅需很少的微调。
- 更新的步长能够被限制在大致的范围内(初始学习率)。
- 能自然地实现步长退火过程(自动调整学习率)。
- 很适合应用于大规模的数据及参数的场景。
- 适用于不稳定目标函数。
- 适用于梯度稀疏或梯度存在很大噪声的问题。
计算t时刻的梯度:
然后计算梯度的指数移动平均数, m 0 m_{0} m0?初始化为0。
类似于Momentum算法,综合考虑之前累积的梯度动量。
β 1 \beta_{1} β1?系数为指数衰减率,控制动量和当前梯度的权重分配,通常取接近于1的值。默认为0.9。
接着,计算梯度平方的指数移动平均数, v 0 v_{0} v0?初始化为0。
β 2 \beta_{2} β2?系数为指数衰减率,控制之前的梯度平方的影响情况。默认为0.999。
类似于RMSProp算法,对梯度平方进行加权均值。
由于 m 0 m_{0} m0?初始化为0,会导致 m t m_{t} mt?偏向于0,尤其在训练初期阶段。
所以,此处需要对梯度均值 m t m_{t} mt?进行偏差纠正,降低偏差对训练初期的影响。
同时 v 0 v_{0} v0?也要进行偏差纠正:
最后总的公式如下所示:
其中默认学习率 α = 0.001 \alpha = 0.001 α=0.001, ε = 1 0 ? 8 \varepsilon = 10^{-8} ε=10?8避免除数变为0。
从表达式中可以看出,对更新的步长计算,能够从梯度均值和梯度平方两个角度进行自适应地调节,而不是直接由当前梯度决定。
虽然Adam算法目前成为主流的优化算法,不过在很多领域里(如计算机视觉的对象识别、NLP中的机器翻译)的最佳成果仍然是使用带动量(Momentum)的SGD来获取到的。Wilson 等人的论文结果显示,在对象识别、字符级别建模、语法成分分析等方面,自适应学习率方法(包括AdaGrad、AdaDelta、RMSProp、Adam等)通常比Momentum算法效果更差。