Adam 算法中 β₁、β₂ 与 ε 的调参技巧

在深度学习任务中,Adam(Adaptive Moment Estimation)是一种广泛使用的自适应学习率优化算法。它通过估计梯度的一阶矩(均值)和二阶矩(方差)来调整每个参数的学习率。Adam 的核心参数包括:

  • β₁:一阶矩估计的指数衰减率,控制历史梯度的权重。
  • β₂:二阶矩估计的指数衰减率,控制历史梯度平方的权重。
  • ε:一个很小的数值常数,用于防止分母为零的数值不稳定问题。

这些参数的选择直接影响优化器的收敛速度、稳定性和最终性能。下面我将逐步解释每个参数的作用、默认值,并提供实用的调参策略。调参时,建议结合具体任务(如计算机视觉、自然语言处理)进行实验,并监控验证集损失。

1. 参数的作用与数学背景

Adam 算法的更新公式如下(其中 $g_t$ 表示第 $t$ 步的梯度,$\eta$ 是学习率):

  • 一阶矩估计:$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 = \frac{m_t}{1 - \beta_1^t}$,$\hat{v}_t = \frac{v_t}{1 - \beta_2^t}$
  • 参数更新:$$\theta_t = \theta_{t-1} - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \hat{m}_t$$

在这个框架下:

  • β₁:影响一阶矩的平滑程度。值越大(接近 1),历史梯度权重越高,更新更稳定但可能对噪声不敏感;值越小(接近 0),更新更依赖当前梯度,响应更快但可能振荡。
  • β₂:影响二阶矩的平滑程度。值越大,梯度方差的估计更平滑,适合平稳问题;值越小,估计更敏感于近期梯度变化,适合非平稳任务。
  • ε:作为分母的偏移量,确保 $\sqrt{\hat{v}_t} + \epsilon \neq 0$。值过小可能导致数值不稳定(如梯度爆炸),值过大可能削弱自适应学习率的效果。
2. 默认值与适用场景
  • β₁ 的默认值:0.9
    适用于大多数任务,如图像分类(ResNet)或序列建模(LSTM)。它平衡了稳定性和适应性。
  • β₂ 的默认值:0.999
    广泛用于标准深度学习模型(如 Transformer 或 CNN),能有效处理梯度方差的变化。
  • ε 的默认值:$10^{-8}$
    在绝大多数情况下无需调整,因为它已足够小以避免除以零问题。

这些默认值在 Adam 原论文中被提出,并在实践中被广泛验证。如果您的任务数据分布稳定(如 MNIST 或 CIFAR-10),使用默认值通常能获得良好效果。

3. 调参策略:何时与如何调整

调参的核心原则是:优先调整学习率 $\eta$ 和 batch size,再考虑 β₁、β₂;ε 通常保持不变。β₁ 和 β₂ 的调整应基于任务特性(如梯度噪声水平或非平稳性)。以下策略基于经验研究和实验总结:

  • β₁ 的选择策略(范围:0.8 到 0.99):

    • 何时调整:如果梯度噪声大(如强化学习或小 batch size 任务),或模型收敛慢时,可尝试降低 β₁ 以加速早期收敛。反之,如果训练不稳定(如损失振荡),可增加 β₁ 以平滑更新。
    • 具体技巧:
      • 对噪声敏感任务(如 GAN 训练):尝试 β₁ = 0.8 或 0.85,以更快适应变化梯度。
      • 对平稳任务(如预训练模型微调):保持 β₁ = 0.9 或提高到 0.99,以增强稳定性。
      • 实验建议:在固定其他参数下,网格搜索 β₁ ∈ [0.8, 0.95],步长 0.05。监控训练损失曲线:β₁ 过低可能导致前期震荡,过高可能导致后期停滞。
  • β₂ 的选择策略(范围:0.98 到 0.9999):

    • 何时调整:如果任务高度非平稳(如在线学习或动态环境),或梯度方差变化大时,可降低 β₂ 以更快更新二阶矩估计。反之,对于平稳数据(如静态数据集),保持高 β₂。
    • 具体技巧:
      • 非平稳任务(如 RNN 处理长序列):尝试 β₂ = 0.99 或 0.999,避免默认值 0.999 的滞后效应。
      • 高精度需求任务(如优化理论测试):可提高到 β₂ = 0.9999,但需注意计算开销。
      • 实验建议:在固定 β₁ 和 η 下,测试 β₂ ∈ [0.99, 0.999]。观察验证集性能:β₂ 过低可能导致学习率调整过于激进,过高可能使自适应学习率失效。
  • ε 的选择策略(范围:$10^{-8}$ 到 $10^{-4}$):

    • 何时调整:几乎无需调整。仅在极端情况下,如梯度极小(例如某些损失函数接近零时)导致数值溢出,才考虑增加 ε。
    • 具体技巧:
      • 保持 ε = $10^{-8}$ 作为起点。如果出现 NaN 错误或训练崩溃,可逐步增大到 $10^{-6}$ 或 $10^{-4}$,但不要超过 $10^{-4}$,否则会破坏自适应机制。
      • 实验建议:仅在调试时测试 ε,优先检查梯度裁剪或学习率设置。
4. 一般调参建议与注意事项
  • 实验流程:

    1. 始终从默认值(β₁=0.9, β₂=0.999, ε=$10^{-8}$)开始。
    2. 调整学习率 $\eta$(如 0.001 到 0.0001)和 batch size 后,再微调 β₁ 和 β₂。
    3. 使用小规模实验(如 10% 数据)快速测试参数组合,监控训练损失和验证准确率。
    4. 结合可视化工具(如 TensorBoard)分析梯度分布:如果梯度均值波动大,优先调 β₁;如果方差变化剧烈,优先调 β₂。
  • 任务特定建议:

    • 计算机视觉(CNN):β₁=0.9, β₂=0.999 效果稳定。对复杂数据集(ImageNet),可尝试 β₁=0.95。
    • 自然语言处理(Transformer):β₁=0.9, β₂=0.98 有时更好(参考 BERT 训练),以适应序列的不平稳性。
    • 强化学习:降低 β₁ 到 0.8-0.85,以处理高噪声梯度。
  • 潜在陷阱:

    • 避免过度调整:β₁ 和 β₂ 的微小变化(如 ±0.05)通常足够;大改动可能导致性能下降。
    • 与学习率交互:高 β₁ 或 β₂ 可能需降低学习率 $\eta$ 以补偿平滑效应。
    • 硬件考虑:在低精度计算(如 FP16)中,ε 保持 $10^{-8}$ 即可,增大它可能无帮助。

总之,在大多数深度学习任务中,Adam 的默认参数已足够优秀。优先聚焦于数据预处理、模型架构和学习率调整。如果必须调参 β₁ 或 β₂,建议基于任务特性进行小范围实验,并记录消融研究以确保可靠性。最终,调参应以验证集性能为准绳,而非盲目追求理论最优。

更多推荐