如果你曾经训练过深度学习模型,那么你几乎肯定遇到过 Adam 优化器。自 2014 年问世以来,它已成为训练神经网络最流行——且常常是默认——的优化算法之一。但 Adam 究竟是什么?它是如何工作的?为什么它如此高效?

在本文中,我们将深入解读介绍 Adam 的原始论文: 由 Diederik P. KingmaJimmy Lei Ba 撰写的 Adam: A Method for Stochastic Optimization。我们将剖析其核心概念,一步步讲解算法流程,并探讨那些展示其强大能力的实验。无论你是刚入门机器学习的学生,还是寻求更深理解的从业者,这篇指南都将为你揭开这个现代深度学习工具箱中最基础工具之一的神秘面纱。


深度学习中的优化挑战

训练机器学习模型本质上是一个优化问题。我们定义一个损失函数来衡量模型表现的好坏,而我们的目标就是找到一组能够最小化这个损失的模型参数 (权重和偏置) 。

实现这一目标最常用的方法是梯度下降: 计算损失函数相对于参数的梯度,然后朝着梯度的反方向迈出一小步。对大型数据集来说,计算整个数据集的梯度在计算上非常昂贵,因此我们使用随机梯度下降 (SGD) ,它利用称为小批量 (mini-batches) 的数据随机子集来估计梯度。这加快了训练速度,并且通常能改善模型的泛化能力。

然而,朴素的 SGD 也面临一些挑战:

  1. 学习率的选择: 太小,训练会非常缓慢;太大,训练可能会发散。
  2. 所有参数使用相同的学习率: 每个参数都以相同的步长更新,但这并非总是最优。
  3. 在复杂的损失地形中前进: 深度网络的损失曲面充满了深谷、平坦区和鞍点。一些参数需要大幅更新,而另一些则需要精细调整。

多年来,人们在 SGD 基础上提出了多种改进方法——Momentum 用于加速穿越深谷,AdaGrad 为每个参数定制学习率 (适合稀疏梯度) ,RMSProp 则为非平稳问题动态调整学习率。

Adam 将这些方法的优点集于一身,形成了一种强健的综合方法。


核心思想: 自适应矩估计

“Adam”这个名字源自自适应矩估计 (Adaptive Moment Estimation) 。Adam 利用梯度的一阶矩二阶矩,为每个参数自适应地调整学习率:

  • 一阶矩——梯度的均值,通过指数衰减的移动平均来估计。这类似于动量 (Momentum) 。
  • 二阶矩——梯度的未中心化方差 (即梯度平方的均值) ,同样通过指数衰减的移动平均来估计。

这两个统计量为 Adam 提供了针对每个参数的缩放更新,将加速朝向最小值的趋势与步长的自适应性结合在一起。


Adam 算法分步详解

在每个时间步 \(t\):

  1. 计算损失函数相对于参数 \(\theta\) 的梯度:

    \[ g_t = \nabla_{\theta} f_t(\theta_{t-1}) \]
  2. **更新一阶矩估计 **(类动量项) :

    \[ m_t \leftarrow \beta_1 \cdot m_{t-1} + (1 - \beta_1) \cdot g_t \]

    其中,\(\beta_1\) (通常为 0.9) 是移动平均的衰减率。

  3. **更新二阶矩估计 **(类方差项) :

    \[ v_t \leftarrow \beta_2 \cdot v_{t-1} + (1 - \beta_2) \cdot g_t^2 \]

    这里的 \(g_t^2\) 表示逐元素平方,\(\beta_2\) 通常为 0.999。


偏差修正——关键秘诀

\(m_t\) 和 \(v_t\) 最初都是从零开始,这会使它们在训练早期偏向零——尤其当 \(\beta_1\) 和 \(\beta_2\) 接近 1 时。论文通过偏差修正估计来解决这一问题:

  1. 展开 \(v_t\) 以观察其对过去梯度的依赖关系:

二阶矩 \\(v_t\\) 的展开更新公式。

  1. 对其求期望值揭示了偏差因子:

关于 \\(v_t\\) 期望值中偏差来源的推导。

  1. 通过以下方式修正偏差:

    \[ \widehat{m}_t \leftarrow \frac{m_t}{1 - \beta_1^t}, \quad \widehat{v}_t \leftarrow \frac{v_t}{1 - \beta_2^t} \]

当 \(\beta_2\) 接近 1 时,这种修正至关重要,能够确保对稀疏梯度进行稳定更新。


最终参数更新

参数更新公式如下:

\[ \theta_t \leftarrow \theta_{t-1} - \alpha \cdot \frac{\widehat{m}_t}{\sqrt{\widehat{v}_t} + \epsilon} \]

其中:

  • \(\alpha\) 是学习率 (默认值 0.001) 。
  • \(\epsilon\) (一个很小的常数,例如 \(10^{-8}\)) 用于确保数值稳定性。

这一步将动量 (\(\widehat{m}_t\)) 与自适应缩放 (\(1/\sqrt{\widehat{v}_t}\)) 相结合,使每个参数拥有属于自己的有效学习率。


Adam 为何表现优异

作者总结了 Adam 的几个关键特性:

  • 每个参数都有自适应学习率,利用了梯度的均值与方差。
  • 稳定的步长受 \(\alpha\) 限制,简化了学习率的调节。
  • **良好的默认参数 **(\(\alpha\)=0.001, \(\beta_1\)=0.9, \(\beta_2\)=0.999, \(\epsilon\)=\(10^{-8}\)) 在不同任务中表现出色。
  • 对噪声、非平稳以及稀疏梯度的鲁棒性

实验验证

Adam 的强大之处通过多个任务得以验证。

1. 逻辑回归 (凸优化)

Adam 与带 Nesterov 动量的 SGD 以及 AdaGrad 作了比较:

在 MNIST 和 IMDB 数据集上的逻辑回归任务中,不同优化器的比较。

  • MNIST 数据集上,Adam 的表现与带 Nesterov 动量的 SGD 相当。
  • IMDB 数据集上 (稀疏词袋特征) ,Adam 和 AdaGrad 显著优于 SGD。

这表明 Adam 继承了 AdaGrad 在处理稀疏性方面的优势。


2. 多层神经网络 (非凸优化)

Adam 在 MNIST 数据集上训练了带 Dropout 的全连接网络:

在 MNIST 上训练带 Dropout 的多层网络。Adam (紫色) 收敛速度最快。

Adam (紫色) 的收敛速度比 AdaGrad、RMSProp 和 AdaDelta 更快。它在迭代效率和实际训练时间方面都超过了 SFO 拟牛顿方法。


3. 卷积神经网络 (CIFAR-10)

对于深度 CNN,权重共享会导致不同层的梯度尺度各异:

在 CIFAR-10 数据集上训练 CNN。长远来看 Adam 比 AdaGrad 收敛更快。

在训练初期,Adam 和 AdaGrad 的进展都很快,但由于 AdaGrad 学习率衰减过快,其速度明显放缓。而 Adam 则保持了动量优势,并能更快收敛,同时在不需人工调节的情况下,为每一层自适应地调整学习率。


4. 偏差修正消融实验

在一个变分自编码器上检验了偏差修正的效果:

偏差修正的作用。使用修正 (红色) 时训练更稳定,且损失低于未使用修正 (绿色) 的情况,尤其当 β₂ 接近 1 时。

没有偏差修正 (绿色) 时,当 \(\beta_2\) 很高时训练会变得不稳定。使用修正 (红色) 则性能始终更好——验证了其必要性。


扩展: AdaMax

论文还提出了 AdaMax,这是 Adam 的一个 \(L^\infty\) 范数变体。与跟踪梯度平方不同,AdaMax 跟踪过去梯度的最大绝对值:

AdaMax 中 \\(u_t\\) 的简单递归更新公式。

公式为:

\[ u_t = \max(\beta_2 \cdot u_{t-1}, |g_t|) \]

参数更新公式为:

\[ \theta_t \leftarrow \theta_{t-1} - \frac{\alpha}{1 - \beta_1^t} \cdot \frac{m_t}{u_t} \]

AdaMax 提供了更好的稳定性,同时为更新幅度提供了更简洁的上界。


结论与影响

Adam 巧妙地将动量自适应学习率偏差修正结合起来,造就了一个快速、稳定且适用面广的优化器。

经验表明,无论是在简单的凸问题 (如逻辑回归) 、稀疏数据任务,还是复杂的多层网络或深度 CNN,Adam 都能保持稳定且优异的表现。它适应各种训练挑战的能力,使其成为许多从业者的默认选择。

直至今日,Adam 依然是优化器研究领域的重要基准。理解 Adam 不仅仅是学术意义上的追求——它还能帮助我们洞察现代深度学习优化的基础原理。