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

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.Adam 的 weight_decay 是 L2 惩罚加到梯度上。SGD 的 weight_decay 同样是 L2 惩罚路径。混用 Adam 加 L2 正则再加 AdamW 式衰减会双重计数,表现成「正则很强但不知道为什么」。
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. 参数分组与微调分层学习率
微调时骨干网络和分类头应分组:骨干已收敛,学习率宜小;头是随机初始化,学习率宜大。一次全解冻加统一大学习率容易毁掉预训练特征,表现为训练集很快过拟合、验证集不涨。
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,把选型理由写进实验日志;新人接手时应能从配置直接复现,而不是依赖口头约定。
相关
也可以看看
- ·3 分钟阅读
grad_norm spike 与 misclass grid
只看 train loss 不够——要 log lr、grad norm、val slice、GPU 利用率和样例可视化,异常通常是 loss 曲线先以外的信号。
- ·5 分钟阅读
beta=0.999 与 eval 权重
训练时对参数做指数滑动平均,验证和部署常用 EMA 权重——曲线更顺,有时泛化更好,但要与 optimizer 步和 checkpoint 策略一致。
- ·5 分钟阅读
use_reentrant=False 粒度
Gradient checkpointing 用重算 forward 换显存——训练大模型或高分辨率输入时 OOM 的常用解法,wall-clock 涨 20–40% 要算进预算。
johan's blog