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

S5-01 · 学习率系统实验:训练第一超参数

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

阶段:S5-参数调优 | 预计耗时:60-75 分钟(5 个 lr 自动连跑)| 前置:S4 全部验收通过 代码:本篇代码要你自己敲成 model-learn/s5_lr_scan.py

学习目标

  1. 用一次扫描 5 个数量级的方式系统认识学习率:1e-7 → 1e-5 → 1e-3 → 3e-2 → 1.0
  2. 画出"lr vs 最终准确率"关系,找到本任务的最优区间
  3. 学会学习率调度器(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:另外两个全局旋钮。

小测验(2 题)

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