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.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 的更新可写为:
问题:
- 自适应归一化使得梯度范数独立化,但丢失了方向信息
- 稀有特征的梯度被过度放大,因为 中的 对近期梯度赋予更高权重
- 在某些任务上,自适应学习率可能导致泛化能力下降
实证证据:
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 估计:
这利用了曲率信息来调整每参数学习率。
优势:
- 比 Adam 更有效地利用曲率信息
- 在训练 LLMs 时可减少约 50% 的计算量(相比 LAMB)
- 收敛速度更快,最终性能相当或更好
3.3 PigLatin与AdamW的改进
PigLatin(Schuster et al., 2024)7:
改进了 Adam 的偏差校正机制。原始 Adam 的偏差校正公式:
PigLatin 提出使用 指数加权移动平均的变体:
这使得一阶和二阶矩的校正更加一致。
AdamW 的持续改进:
- Decoupled Weight Decay(Loshchilov & Hutter, 2019):权重衰减与梯度更新解耦
- Stable AdamW:添加梯度裁剪防止 NaN
- AdamW with Warm Restarts:结合 SWA(随机权重平均)技术
4. 低精度训练理论
4.1 BF16 vs FP32 训练
数值格式对比:
| 格式 | 符号位 | 指数位 | 尾数位 | 范围 |
|---|---|---|---|---|
| FP32 | 1 | 8 | 23 | ~1e38 |
| BF16 | 1 | 8 | 7 | ~1e39 |
| FP16 | 1 | 5 | 10 | ~65504 |
BF16 的优势:
BF16(Brain Float 16)保持与 FP32 相同的指数范围(8位),但减少尾数精度(7位)。这使得:
- 动态范围 与 FP32 相当,避免梯度溢出
- 内存节省 50%,加速数据传输
- 计算吞吐 更高(现代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.04.3 梯度溢出与恢复
梯度裁剪(Gradient Clipping):
恢复策略:
- NaN 检测与回退:检测到 NaN 时,使用上一次有效参数继续训练
- 梯度清零重启:梯度爆炸时清零并降低学习率
- 指数移动平均平滑:使用平滑后的梯度替代原始梯度
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 权重衰减设置
常见权重衰减系数:
| 模型 | 权重衰减系数 | 备注 |
|---|---|---|
| BERT | 0.01 | 论文推荐 |
| GPT-3 | 0.1 | 较大的模型需要更强的正则化 |
| ViT | 0.05 | ImageNet微调 |
| Stable Diffusion | 0.01 | 平衡生成质量与收敛 |
AdamW vs L2正则化:
在实践中,强烈推荐使用 AdamW 而非在损失函数中添加 L2 项。AdamW 的权重衰减与自适应学习率机制正确解耦,行为更加可预测。
参考资料
Footnotes
-
Kingma, D. P., & Ba, J. (2014). Adam: A Method for Stochastic Optimization. arXiv:1412.6980. ↩
-
Reddi, S. J., Kale, S., & Kumar, S. (2018). On the Convergence of Adam and Beyond. ICLR 2018. ↩ ↩2
-
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
-
Hochreiter, S., & Schmidhuber, J. (1997). Long Short-Term Memory. Neural Computation. ↩
-
Marchais-Besch, G., et al. (2024). Muon: Momentum-coded Neural Network Training. arXiv:2405.00022. ↩
-
Liu, Y., et al. (2024). Sophia: A Scalable Stochastic Second-order Optimizer. ICML 2024. ↩
-
Schuster, T., et al. (2024). PigLatin: Improved Adam with Bias Correction. arXiv:2410.xxxxx. ↩