更新于 2026年6月28日

6.9 Adam算法#

在前面几节内容中我们陆续介绍了动量法、AdaGrad和AdaDelta等优化算法。除了动量法以外,其它几种算法都能够分别为每个权重参数自适应计算得到一个学习率,以此来实现对不同的权重参数以不同的尺度进行更新。在本节内容中我们将介绍最后一种通过利用一阶矩和二阶矩信息来自适应各权重参数学习率的优化算法。

6.9.1 Adam动机#

动量法在更新参数的过程中不仅会考虑当前梯度的方向同时也会考虑历史梯度的方向,以此来解决目标函数梯度来回震荡的问题;AdaGrad算法在更新参数的过程中通过考虑数据样本特征出现的频次来自适应不同的权重参数所对应的学习率,以此来提高目标函数的收敛速度;AdaDelta和RMSprop算法在更新参数的过程中通过梯度的移动平均来解决AdaGrad中学习率衰减过快的问题,并同时实现了无序手动指定全局学习率。

结合AdaGrad算法和RMSprop算法各自的优点,金马(Kingma)[1]等人提出了一种新的学习率自适应算法自适应矩估计(Adaptive Moment Estimation, Adam)。Adam算法可以根据每个参数梯度的趋势性和稳定性在训练的不同阶段自适应调整学习率,使得Adam在处理非平稳(Non-Stationary)的目标函数时仍然能表现良好,同时在面对梯度稀疏的情况下Adam算法也能够有效地进行处理。

6.9.2 Adam原理#

Adam算法通过考虑梯度的一阶矩和二阶矩来动态调整学习率,使得它能够在不同参数和不同时间步上提供更为平滑和稳定的参数梯度,然后对权重参数进行学习更新。具体地,设目标函数在第$t$时刻关于所有权重参数的梯度为$g_t$,梯度的一阶矩为$m_t$且$m_0=0$,梯度的二阶矩为$v_t$且$v_0=0$,移动平均的衰减系数分别为$\beta_1\in[0,1)$和$\beta_2\in[0,1)$,权重参数为$\theta_t$,则第$t+1$时刻的结果$\theta_{t+1}$可通过如下步骤进行计算

$$ \begin{aligned} m_{t+1}&=\beta_1m_t+(1-\beta_1)g_{t+1}\\[1ex] v_{t+1}&=\beta_2v_t+(1-\beta_2)g_{t+1}\odot g_{t+1}\\[1ex] \hat{m}_{t+1}&=\frac{m_{t+1}}{1-\beta_1^{t+1}}\\[1ex] \hat{v}_{t+1}&=\frac{v_{t+1}}{1-\beta_2^{t+1}}\\[1ex] \theta_{t+1}&=\theta_t-\frac{\gamma \hat{m}_{t+1}}{\sqrt{\hat{v}_{t+1}}+\epsilon} \end{aligned} \tag{6-33} $$

其中$\odot$表示按位乘,$\gamma$为学习率,$\beta^t_i$中$t$表示幂次,$\epsilon$为平滑项。

在式(6-33)中,Adam算法通过移动平均来分别估计第$t+1$时刻梯度的一阶矩$m_{t+1}$和二阶矩$v_{t+1}$即梯度的均值和近似方差。一阶矩估计可以更好的帮助算法适应目标函数梯度的整体趋势。二阶矩估计则可以用于捕捉梯度的方差或波动性,如果目标函数表面上存在平坦区域或高曲率区域时,则此时梯度的方差可能变化很大,将其作为分母便可以减小学习率以提高稳定性;相反则会增加算法的学习率以提高收敛速度。

同时,由于在训练初期$m_0$和$v_0$的初始值均为0,所以一阶矩$m_t$和二阶矩$v_t$的估计可能偏离真实值。为了减小这种偏差,Adam算法引入了偏差校正,即校正后的结果分别为$\hat{m}_{t+1}$和$\hat{v}_{t+1}$。根据式(6-33)可以看出,随着迭代次数$t$的增加$\beta_i^t$将会逐渐趋于0,并且当$t$足够大之后矩估计值便近似等于校正值。

总体来说,Adam算法结合了梯度的一阶矩和二阶矩的信息,通过自适应地调整学习率既能够适应不同参数的梯度变化,又能够在训练过程中保持算法的稳定性。这种自适应性使得Adam在深度学习等领域取得了良好的优化效果,也是目前深度学习中使用最为频繁优化算法之一。

6.9.3 使用示例#

在介绍完Adam算法的基本原理以后,我们再来看如何使用这一优化算法。在PyTorch框架中,我们可以通过torch.optim.Adam()模块来使用Adam优化算法。下面分别对其中的几个关键参数进行介绍。

1 class Adam(Optimizer):
2     def __init__(self, params, lr=1e-3, betas=(0.9, 0.999), eps=1e-8):
3         pass

在上述代码中,第2行lr是学习率,通常情况下可直接使用默认值;betas中的两个元素分别指式(6-33)中的$\beta_1$和$\beta_2$,算法作者建议大多数情况下使用该默认值即可。最后,我们只需要在模型训练时指定优化器为Adam便可使用Adam算法来最小化目标函数。

6.9.4 小结#

在本节内容中,我们首先简单总结了前面几节内容中各优化算法的整体思想和Adam算法提出的动机;然后详细介绍分析了Adam算法的基本原理;最后介绍了如何在PyTorch框架中使用Adam优化算法来最小化目标函数。

引用#

[1] Kingma D P, Ba J. Adam: A method for stochastic optimization[J]. arXiv preprint, 2014, arXiv:1412.6980.

您当前阅读的内容现已出版,点击右侧了解

10章教学课件,400余幅示意插图、40个示例源代码,助力读者轻松迈入深度学习的大门!

查看详情
阅读 --