阶段:S5-参数调优 | 预计耗时:60-75 分钟(5 个 lr 自动连跑)| 前置:S4 全部验收通过 代码:本篇代码要你自己敲成
model-learn/s5_lr_scan.py
学习目标
- 用一次扫描 5 个数量级的方式系统认识学习率:1e-7 → 1e-5 → 1e-3 → 3e-2 → 1.0
- 画出"lr vs 最终准确率"关系,找到本任务的最优区间
- 学会学习率调度器(StepLR)的用法——"先大步走、后小步微调"
核心知识
1. 学习率的三个区间(你已在 S1 见过两端)
太小(1e-7) 合适(1e-3附近) 太大(>0.1)
├─ loss 几乎不动 ─┼─ 稳定下降 ─────────────┼─ 震荡/NaN ─┤
白费电 黄金区间 事故区
- 每个任务/模型/优化器的黄金区间都不同——所以有"扫一遍"的流程,不是背数字
- 经验法则:Adam 从 1e-3 起步,SGD 从 1e-2~1e-1 起步,然后按扫描结果微调
2. 学习率调度:不同阶段用不同步长
StepLR(opt, step_size=2, gamma=0.5):每 2 个 epoch 步长减半。类比:下山时远处的路迈大步,接近谷底小碎步防冲过头。S8 CIFAR 项目会真用它。
3. 本机扫描规模
5000 样本 × 3 epoch × 5 个 lr ≈ 10 分钟自动连跑。脚本自动循环、自动制表——调参的本质就是"有纪律的搜索",不是玄学手感。
实验任务
任务 1:写扫描脚本(30 分钟)
# s5_lr_scan.py —— 一次扫 5 个数量级
LRS = [1e-7, 1e-5, 1e-3, 3e-2, 1.0]
results = []
for lr in LRS:
torch.manual_seed(42) # 每个 lr 都重置种子,公平
model = build_small_cnn() # 从 01_mnist_cnn.py 抄
opt = torch.optim.Adam(model.parameters(), lr=lr)
# ... 5000 样本训 3 epoch(复用你已写熟的五行训练)
results.append((lr, final_loss, test_acc, seconds))
for lr, loss, acc, t in sorted(results, key=lambda r: -r[2]):
print(f"lr={lr:g} acc={acc:.4f} 末loss={loss:.4f} {t:.0f}s")
任务 2:跑扫描并制图(20 分钟)
把 lr(对数轴)与 acc 画成折线图存档(matplotlib 的 plt.semilogx)。找到"悬崖两端"和"高原区"。
任务 3:调度器初体验(15 分钟)
黄金区间里选一个 lr(比如 3e-2),加 StepLR 后重跑同配置,对比固定 lr 的曲线——高点有没有更高?
验收标准
衔接下一阶段
lr 摸透 → S5-02 优化器与 batch:另外两个全局旋钮。