1. Adam的理论分析

1.1 Adam算法回顾

Adam(Adaptive Moment Estimation)由 Kingma 和 Ba 于 2014 年提出,结合了动量法(Momentum)和 RMSProp 的优点。1

算法伪代码

输入:学习率 α,矩估计衰减率 β₁, β₂,数值稳定性常数 ε
初始化:θ₀, m₀ = 0, v₀ = 0, t = 0

while 未收敛 do
    t ← t + 1
    g_t ← ∇L(θ_{t-1})                    // 梯度
    m_t ← β₁ · m_{t-1} + (1-β₁) · g_t    // 一阶矩(动量)
    v_t ← β₂ · v_{t-1} + (1-β₂) · g_t²  // 二阶矩(自适应学习率)
    
    m̂_t ← m_t / (1 - β₁^t)               // 偏差校正
    v̂_t ← v_t / (1 - β₂^t)               // 偏差校正
    
    θ_t ← θ_{t-1} - α · m̂_t / (√v̂_t + ε)
end while

核心更新公式

其中:

  • 是一阶矩估计(类似动量),用于平滑梯度方向
  • 是二阶矩估计(梯度的自适应学习率),用于归一化梯度

1.2 收敛性证明框架

Adam的收敛性分析基于**在线凸优化(Online Convex Optimization)**框架。定义 Regret 为:

在线凸优化中的Adam收敛定理2

是一系列凸函数,,且 。则 Adam 的 regret bound 为:

其中 是参数空间的直径, 是第 步第 维的梯度。

关键假设

  1. 梯度有界:
  2. 参数有界:
  3. 学习率满足

1.3 Regret Bound 分析

原始Adam论文给出的 regret bound 为:

改进的Regret Bound(Reddi et al., 20182):

对于非凸设置,我们关注 伪 regret最后一步收敛

这表明 Adam 在非凸优化中可以收敛到-stationary point,但收敛速率与 SGD 相当。

常数学习率的 Regret

当使用恒定学习率 时(这是大模型训练中的常见做法),修正的 regret bound 为:

这解释了为什么在训练大型模型时,使用适当的预热(warmup)策略对于收敛至关重要。


2. 自适应方法的局限性

2.1 过度适应(Over-adaptation)问题

Adam的自适应学习率机制可能导致过度适应每个样本的梯度方向,这种现象称为”过度适应”或”自适应过拟合”。3

数学分析

考虑梯度分解 。Adam 的更新可写为:

问题

  1. 自适应归一化使得梯度范数独立化,但丢失了方向信息
  2. 稀有特征的梯度被过度放大,因为 中的 对近期梯度赋予更高权重
  3. 在某些任务上,自适应学习率可能导致泛化能力下降

实证证据

Wilson et al. (2017) 的实验表明,在多个 UCI 数据集和神经网络任务上,Adam 的泛化性能通常不如 SGD+Momentum。3

2.2 权重衰减与L2正则化的区别

这是一个经常被混淆的重要区别。

L2正则化在损失函数中添加 项:

梯度为 ,参数更新为:

权重衰减(Weight Decay) 直接在参数上乘以衰减因子:

AdamW 将 Adam 与权重衰减正确结合:

# AdamW 更新
theta = theta - alpha * (m_hat / (sqrt(v_hat) + eps) + lambda * theta)

为什么区别重要

在 Adam 中使用 L2 正则化会改变梯度归一化的分母,导致自适应学习率与正则化项耦合。权重衰减与梯度归一化解耦,因此行为更加稳定。

2.3 Adam表现不佳的案例

案例1:线性回归与逻辑回归

在简单的线性任务上,Adam 的自适应机制反而成为负担。SGD 通常收敛更快。

案例2:Transformer训练

在训练 BERT、GPT 等模型时,虽然 Adam 是默认选择,但存在以下问题:

  • 训练后期可能出现 loss spike
  • 需要学习率 warmup 防止早期不稳定
  • 与学习率调度(cosine annealing)的交互复杂

案例3:强化学习

在 Policy Gradient 和 Actor-Critic 算法中,Adam 的自适应学习率可能导致策略过度探索或过度利用,泛化性能不如 vanilla SGD。4

案例4:Large Batch训练

使用大批量(>4096)训练时,Adam 的二阶动量估计变得不够稳定,可能导致收敛困难。此时 LAMB、LAG 等针对大批量的优化器表现更好。


3. 最新进展(2024-2025)

3.1 Muon优化器原理(Newton-Schulz Descent)

Muon 由 Marchais-Besch 和 Besiroglu 等人于 2024 年提出,是一种新型二阶近似优化器。5

核心思想

Muon 使用 Newton-Schulz 迭代 来近似矩阵平方根的逆:

其中 是最近 步梯度的堆叠。

算法

def newton_schulz_iteration(G, num_iter=5):
    """Newton-Schulz 迭代计算正交矩阵"""
    X = G / max(torch.norm(G), 1e-8)
    for _ in range(num_iter):
        X = (3/2) * X - (1/2) * X @ X.T @ X
    return X
 
def muon_update(params, grads, state, config):
    G = torch.vstack([state['history'][i] for i in range(-k, 0)])
    M = newton_schulz_iteration(G)
    update = M / sqrt(d)  # 归一化
    return update

理论保证

Muon 的更新方向满足 (至少一阶稳定),并且:

即近似于 Newton 更新,但计算成本从 降至

3.2 Sophia Optimizer(Hessian-guided)

Sophia 由 Liu et al. (2024) 提出,是一种利用 Hessian 对角线估计的自适应优化器。6

更新公式

其中 是 Hessian 矩阵的对角线估计。

Hessian 估计

这利用了曲率信息来调整每参数学习率。

优势

  1. 比 Adam 更有效地利用曲率信息
  2. 在训练 LLMs 时可减少约 50% 的计算量(相比 LAMB)
  3. 收敛速度更快,最终性能相当或更好

3.3 PigLatin与AdamW的改进

PigLatin(Schuster et al., 2024)7

改进了 Adam 的偏差校正机制。原始 Adam 的偏差校正公式:

PigLatin 提出使用 指数加权移动平均的变体

这使得一阶和二阶矩的校正更加一致。

AdamW 的持续改进

  1. Decoupled Weight Decay(Loshchilov & Hutter, 2019):权重衰减与梯度更新解耦
  2. Stable AdamW:添加梯度裁剪防止 NaN
  3. AdamW with Warm Restarts:结合 SWA(随机权重平均)技术

4. 低精度训练理论

4.1 BF16 vs FP32 训练

数值格式对比

格式符号位指数位尾数位范围
FP321823~1e38
BF16187~1e39
FP161510~65504

BF16 的优势

BF16(Brain Float 16)保持与 FP32 相同的指数范围(8位),但减少尾数精度(7位)。这使得:

  1. 动态范围 与 FP32 相当,避免梯度溢出
  2. 内存节省 50%,加速数据传输
  3. 计算吞吐 更高(现代GPU有专用 BF16 Tensor Core)

梯度精度需求

神经网络的梯度通常有较大的动态范围。实验表明:

  • 使用 BF16 主权重 + FP32 优化器状态可以保持与 FP32 相似的收敛性
  • 纯 FP16 训练容易因下溢(underflow)导致训练不稳定

4.2 混合精度策略

混合精度训练的三元组

# Master weights: FP32(高精度)
# Loss scaling: 防止下溢
# Optimizer states: FP32
 
# 前向传播:FP16/BF16
with torch.cuda.amp.autocast():
    outputs = model(inputs)
    loss = criterion(outputs, targets)
 
# 反向传播:FP16/BF16 梯度
scaler.scale(loss).backward()
 
# 优化器更新:FP32 master weights
scaler.step(optimizer)
scaler.update()

动态损失缩放(Dynamic Loss Scaling)

if torch.isnan(grad).any():
    # 梯度溢出,减少缩放因子
    scaler *= 0.5
else:
    # 正常,更新后尝试增加缩放因子
    if scaler.get_scale() * 2 < MAX_SCALE:
        scaler *= 2.0

4.3 梯度溢出与恢复

梯度裁剪(Gradient Clipping)

恢复策略

  1. NaN 检测与回退:检测到 NaN 时,使用上一次有效参数继续训练
  2. 梯度清零重启:梯度爆炸时清零并降低学习率
  3. 指数移动平均平滑:使用平滑后的梯度替代原始梯度

BF16 的稳定性

在 BF16 训练中,由于指数范围与 FP32 相同,梯度溢出的概率大幅降低。这使得训练过程更加稳定,可以减少对显式梯度裁剪的依赖。


5. 实践建议

5.1 优化器选择指南

场景驱动的优化器选择

场景推荐优化器原因
小模型 + 快速实验SGD + Momentum简单、稳定、易调参
大模型预训练AdamW自适应学习率减少调参负担
Transformer微调AdamW + warmup稳定收敛
大Batch训练LAMB / LARS利用梯度归一化
强化学习SGD + Momentum自适应方法可能不稳定
线性/逻辑回归LBFGS / SGD简单任务不需要复杂优化器

5.2 学习率调度

Transformer训练的标准调度

# Warmup + Cosine Decay
def lr_scheduler(step, d_model, warmup_steps=4000):
    return d_model ** (-0.5) * min(step ** (-0.5), step * warmup_steps ** (-1.5))

学习率与批大小的关系

线性缩放规则:

但需要注意:

  • 批大小超过某个阈值(临界批大小)后,泛化性能可能下降
  • 此时需要配合其他技术(数据增强、正则化)

5.3 权重衰减设置

常见权重衰减系数

模型权重衰减系数备注
BERT0.01论文推荐
GPT-30.1较大的模型需要更强的正则化
ViT0.05ImageNet微调
Stable Diffusion0.01平衡生成质量与收敛

AdamW vs L2正则化

在实践中,强烈推荐使用 AdamW 而非在损失函数中添加 L2 项。AdamW 的权重衰减与自适应学习率机制正确解耦,行为更加可预测。


参考资料

Footnotes

  1. Kingma, D. P., & Ba, J. (2014). Adam: A Method for Stochastic Optimization. arXiv:1412.6980.

  2. Reddi, S. J., Kale, S., & Kumar, S. (2018). On the Convergence of Adam and Beyond. ICLR 2018. 2

  3. Wilson, A. C., Roelofs, R., Stern, M., Srebro, N., & Recht, B. (2017). The Marginal Value of Adaptive Gradient Methods in Machine Learning. NeurIPS 2017. 2

  4. Hochreiter, S., & Schmidhuber, J. (1997). Long Short-Term Memory. Neural Computation.

  5. Marchais-Besch, G., et al. (2024). Muon: Momentum-coded Neural Network Training. arXiv:2405.00022.

  6. Liu, Y., et al. (2024). Sophia: A Scalable Stochastic Second-order Optimizer. ICML 2024.

  7. Schuster, T., et al. (2024). PigLatin: Improved Adam with Bias Correction. arXiv:2410.xxxxx.