首页 › S 模型训练 › S5 参数调优 › 02

S5-02 · 优化器与 batch:Adam 和 SGD 的取舍

实战阶段约 240 分钟阶段:S5 参数调优

阶段:S5-参数调优 | 预计耗时:60-75 分钟(2×2 四组)| 前置:S5-01 学习率系统实验 代码:本篇代码要你自己敲成 model-learn/s5_optimizer_batch.py

学习目标

  1. 理解 SGD(沿梯度下山)与 Adam(自适应步长)的核心区别,以及 lr 不能共用的原因
  2. 实测 batch size 16 vs 256 的速度/内存/收敛差异
  3. 建立"默认配置"决策表:拿到新任务先用哪套组合

核心知识

1. 两大优化器

SGD Adam
直觉 盲人下山,只看当前坡度 加了"动量惯性"(SGD+momentum)+ 每个参数自适应步长
lr 起点 1e-2 ~ 1e-1(大) 1e-3(小)
调参成本 高(对 lr 敏感) 低(多数任务默认就好)
最终成绩 调好后常略胜(传统 CV) 快出结果(LLM 时代事实标准)

关键坑:SGD 的 lr≈0.1、Adam 的 lr≈1e-3,两者不能互换——Adam 里 lr 已经除过梯度方差量级。

2. batch size 的三个权衡

  • 大 batch:每步更稳、GPU/CPU 利用率高,但同样的 epoch 下更新次数变少,收敛"步数"不足
  • 小 batch:更新频繁带噪声——噪声有时反而帮助泛化(业界共识),代价是单 epoch 耗时更长
  • 本机:batch 大小也影响内存(64×784×4B 微不足道,但养成意识)

3. 本机实验设计

2×2 网格:{SGD lr=0.1, Adam lr=1e-3} × {batch 16, batch 256},5000 样本 × 2 epoch,全部固定 seed 42。

实验任务

任务 1:写 2×2 脚本(30 分钟)

# s5_optimizer_batch.py —— 优化器×batch 交叉实验
GRID = [("SGD", 0.1, 16), ("SGD", 0.1, 256), ("Adam", 1e-3, 16), ("Adam", 1e-3, 256)]
for name, lr, bs in GRID:
    torch.manual_seed(42)
    # SGD 组记得 torch.optim.SGD(model.parameters(), lr=lr, momentum=0.9)
    # 记录:每 epoch 用时、末 loss、test_acc
# 输出四行对比表

任务 2:填表并解读(20 分钟)

组合 每epoch耗时 末loss test_acc
SGD + 16
SGD + 256
Adam + 16
Adam + 256

解读三问:① 同 epoch 数下 batch 16 vs 256 谁的分高,为什么?② SGD 和 Adam 谁对 lr 更挑剔?③ 你的"默认配置"选哪组?

任务 3:换算意识(10 分钟)

5000 样本、batch 16 → 每 epoch 313 次更新;batch 256 → 20 次。把"更新次数"也算出来写进表——很多"batch 大效果差"其实是更新次数没对齐。想公平对比就要让 batch 256 组多跑几个 epoch。

验收标准

衔接下一阶段

单变量实验都会了 → S5-03 调参方法论:把多个变量组织成系统搜索。

小测验(2 题)

答完立即判分,错题给解析;得分存本地。实验与实操题不上网测:回对话找老师验收。