阶段:S5-参数调优 | 预计耗时:60-75 分钟(2×2 四组)| 前置:S5-01 学习率系统实验 代码:本篇代码要你自己敲成
model-learn/s5_optimizer_batch.py
学习目标
- 理解 SGD(沿梯度下山)与 Adam(自适应步长)的核心区别,以及 lr 不能共用的原因
- 实测 batch size 16 vs 256 的速度/内存/收敛差异
- 建立"默认配置"决策表:拿到新任务先用哪套组合
核心知识
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 调参方法论:把多个变量组织成系统搜索。