Adam,即自适应矩估计(Adaptive Moment Estimation)的缩写,是一种迭代优化算法,广泛用于训练神经网络和其他Machine learning模型。它由Diederik P. Kingma和Jimmy Ba在2014年发表的论文《Adam: A Method for Stochastic Optimization》中提出。Adam结合了两种其他随机梯度下降扩展的优点:自适应学习率(如AdaGrad)和动量(如RMSProp)。它根据梯度的第一矩和第二矩估计,为每个参数计算单独的自适应学习率,使其非常适合处理大数据集和高维参数空间的问题。
该算法是随机梯度下降(SGD)的一种变体,而SGD本身是一种通过用随机选择的数据子集估计真实梯度来最小化目标函数的迭代方法。Adam已成为Deep learning框架中的默认优化器,并广泛用于训练Transformer (architecture)模型,包括大型语言模型。
算法
Adam为每个参数维护两个移动平均:梯度的第一矩(均值)和梯度的第二矩(非中心方差)。在每次迭代\(t\)中,给定损失相对于参数的梯度\(g_t\),更新计算如下:
- 更新有偏第一矩估计:\(m_t = \beta_1 m_{t-1} + (1 - \beta_1) g_t\)
- 更新有偏第二矩估计:\(v_t = \beta_2 v_{t-1} + (1 - \beta_2) g_t^2\)
- 计算偏差校正估计:\(\hat{m}_t = m_t / (1 - \beta_1^t)\)和\(\hat{v}_t = v_t / (1 - \beta_2^t)\)
- 更新参数:\(\theta_t = \theta_{t-1} - \alpha \hat{m}_t / (\sqrt{\hat{v}_t} + \epsilon)\)
这里,\(\alpha\)是学习率(步长),\(\beta_1\)和\(\beta_2\)是矩估计的指数衰减率(通常为0.9和0.999),\(\epsilon\)是一个小常数(例如\(10^{-8}\)),用于防止除以零。偏差校正步骤在早期迭代中至关重要,因为此时矩估计初始化为零,该步骤抵消了向零的偏差。
偏差校正
由于\(m_t\)和\(v_t\)都初始化为零向量,前几次迭代产生的估计会偏向零。Adam通过分别将矩估计除以\((1 - \beta_1^t)\)和\((1 - \beta_2^t)\)来解决这个问题。随着\(t\)的增长,这种校正变得不那么显著,因为分母趋近于1。偏差校正是Adam区别于早期自适应方法的关键特征,并有助于其稳定的收敛行为。
超参数
Adam引入了除学习率之外的几个超参数:
- 学习率(\(\alpha\)):控制步长。常见默认值为0.001。
- \(\beta_1\):第一矩估计的指数衰减率。默认值为0.9。
- \(\beta_2\):第二矩估计的指数衰减率。默认值为0.999。
- \(\epsilon\):用于数值稳定性的小常数。默认值为\(10^{-8}\)。
在实践中,默认值在许多任务中表现良好,但通常需要调整学习率。一些实现还支持学习率调度,如预热和衰减,这在训练Transformer (architecture)模型中很常见。
变体和扩展
已经提出了几种Adam的变体来解决特定局限性:
- AdamW:将权重衰减与梯度更新解耦,直接应用于参数。这提高了泛化能力,现已成为许多Deep learning库中的标准。
- Nadam:将Adam与Nesterov动量结合,可以加速收敛。
- AMSGrad:修改第二矩估计以确保学习率不增加,解决了某些设置中的收敛问题。
- Adamax:使用第二矩的无穷范数,使其对较大梯度更鲁棒。
- RAdam:校正自适应学习率的方差,减少对预热的依赖。
这些变体在特定场景中使用,但原始Adam仍被广泛采用。
应用
Adam用于Artificial intelligence和Machine learning的许多领域。它是许多框架(包括TensorFlow和PyTorch)中的默认优化器。它已应用于训练神经网络,用于图像分类、自然语言处理、语音识别和强化学习。特别是,Adam是训练基于Transformer (architecture)模型的首选优化器,例如由OpenAI、Anthropic和Google DeepMind等组织开发的大型语言模型。
Adam的流行源于其对超参数设置的鲁棒性以及处理稀疏梯度和噪声数据的能力。它还具有内存效率高的特点,每个参数仅需两个额外变量。
理论性质
Adam并不总是收敛到全局最小值,尤其是在非凸目标下,但在某些条件下已证明能收敛到临界点。由于自适应学习率,Adam的收敛分析比普通SGD更复杂。一些研究表明,Adam在某些凸设置中可能无法收敛,这促使了AMSGrad和其他修复方法的开发。
经验上,Adam在训练早期通常比SGD收敛更快,但在某些任务中,其泛化性能可能略逊于带动量的SGD。这导致了混合方法,例如在训练过程中从Adam切换到SGD。
与随机梯度下降的比较
随机梯度下降(SGD)使用单个样本或小批量更新参数,学习率固定或衰减。Adam根据梯度历史为每个参数调整学习率。这使得Adam对学习率的选择不那么敏感,通常需要更少的调整。然而,带动量的SGD有时可以达到更好的最终性能,尤其是在精心设计学习率调度的情况下。
Adam与SGD的不同之处还在于,它通过第二矩的平方根对梯度进行归一化,这可以在存在大或小梯度时带来更稳定的更新。
实际考虑
使用Adam时,通常将学习率设置为0.001,beta值设置为默认值。对于大规模训练,例如大型语言模型,通常采用带预热的的学习率调度。推荐使用权重衰减(如AdamW)进行正则化。
内存使用是一个考虑因素:Adam为每个参数存储两个额外值,对于具有数十亿参数的模型来说,这可能很显著。这促使了对内存高效优化器的研究,例如Adafactor,它用低秩因子近似第二矩。
参见
- stochastic-gradient-descent
- Deep learning
- Neural network
- Transformer (architecture)
参考文献
- Kingma, D. P., & Ba, J. (2014). Adam: A Method for Stochastic Optimization. arXiv:1412.6980.
- Loshchilov, I., & Hutter, F. (2017). Decoupled Weight Decay Regularization. arXiv:1711.05101.
- Reddi, S. J., Kale, S., & Kumar, S. (2018). On the Convergence of Adam and Beyond. ICLR.