返回专辑
·Johan·3 分钟阅读

Adam 与 SGD

AdamW 收敛快、对 LR 不敏感;不少视觉任务里调好的 SGD+momentum 泛化更好——按数据规模和预算选,别迷信默认 optimizer。

Adam 与 SGD

1. 默认 AdamW 跑通,SGD 才刷榜

ImageNet 微调 ResNet50,AdamW 前三十个 epoch 验证集损失已接近平台,SGD 带动量还在缓慢爬坡——但同样墙钟预算下,调好的 SGD 余弦退火有时最终 top-1 略高。这不是「Adam 不好」,是优化器与任务、数据规模、训练预算的契约不同:Adam 为每个参数自适应学习率,对超参不敏感;SGD 需要学习率调度配合,但轨迹更平滑,泛化有时更好。

我默认 AdamW 做快速迭代和消融,要刷榜或数据量够大时再切 SGD。混用两种优化器的权重衰减语义是常见坑,团队里若有人用 Adam 有人用 AdamW,对比实验往往不可比。

2. 权重衰减:AdamW 与 SGD 语义不同

PyTorch 里 AdamW 的 weight_decay 是解耦 L2——直接衰减权重,不进入梯度;而 torch.optim.Adamweight_decay 是 L2 惩罚加到梯度上。SGD 的 weight_decay 同样是 L2 惩罚路径。混用 Adam 加 L2 正则再加 AdamW 式衰减会双重计数,表现成「正则很强但不知道为什么」。

python
opt_adamw = torch.optim.AdamW(model.parameters(), lr=1e-3, weight_decay=0.01)
opt_sgd = torch.optim.SGD(
    model.parameters(), lr=0.1, momentum=0.9,
    weight_decay=1e-4, nesterov=True)

Adam 默认 betas=(0.9, 0.999)eps=1e-8;混合精度下有时改 eps=1e-6 防除法问题。bias_correction=True 时前几步有效学习率较小,大学习率训练常配 warmup,否则初期 loss 会抖。

3. 参数分组与微调分层学习率

微调时骨干网络和分类头应分组:骨干已收敛,学习率宜小;头是随机初始化,学习率宜大。一次全解冻加统一大学习率容易毁掉预训练特征,表现为训练集很快过拟合、验证集不涨。

python
optimizer = torch.optim.AdamW([
    {'params': model.backbone.parameters(), 'lr': 1e-4, 'weight_decay': 0.01},
    {'params': model.head.parameters(), 'lr': 1e-3, 'weight_decay': 0.01},
])

ImageNet 经典配方:SGD 学习率 0.1、动量 0.9、权重衰减 1e-4,配余弦退火。Transformer 预训练默认 AdamW 学习率 1e-4、权重衰减 0.01,加线性 warmup 和余弦。调度粒度也不同:Transformer 常按 step;ResNet 有时按 epoch。

4. 失败模式与排查

Adam 训 Transformer 时 loss 震荡——查学习率是否过大、是否缺 warmup、GradScaler 缩放是否异常。SGD 训不动——查学习率是否过小、是否缺动量、批大小是否太小导致批归一化噪声大。微调验证集不升——查参数组学习率是否生效,日志里每步打印 optimizer.param_groups[i]['lr']

同一随机种子对比验证曲线,记录墙钟时间到目标指标,不只看最终 epoch 数。Adam 通常收敛更快;最终验证差距因任务而异。视觉大数据集 SGD 有时最终泛化略好;小数据集 AdamW 更省心。

5. 案例:迭代速度换最终精度

快速实验阶段用 AdamW 默认学习率 1e-3,三天内跑完消融矩阵。定稿冲榜时换 SGD 余弦,多训若干 epoch,最终 top-1 有时多零点几个点,但墙钟多百分之三十。按项目阶段选,不迷信框架默认。

6. 验收

  • 前一百步训练损失应下降;Adam 通常比 SGD 快。
  • 参数组里不同学习率在日志中可核对。
  • 同预算对比墙钟到目标指标,记录优化器类型与调度。
  • 混合精度下若出现 NaN,查 eps 与 GradScaler,不盲目换优化器。
  • 微调时分层学习率加逐层解冻,不一次全解冻加大学习率。

7. 落地与衔接

把优化器选型写进训练配置清单:记录类型、基础学习率、权重衰减、调度器与 warmup 步数。切换优化器时不要直接 resume 旧动量状态,应新开 run 或重置 optimizer。对比实验固定随机种子与 epoch 预算,同时记录墙钟到目标验证指标的时间。微调与从头训分开存 checkpoint,便于团队复现与交接。

优化器是训练契约的一部分。AdamW 换迭代速度,SGD 换最终泛化潜力——按预算和数据规模选,别迷信框架默认。发版前用同一验证切片横向对比 checkpoint,把选型理由写进实验日志;新人接手时应能从配置直接复现,而不是依赖口头约定。

← 全部文章

johan's blog