阶段:S5-参数调优 | 预计耗时:60-75 分钟(9 组自动跑)| 前置:S5-02 优化器与 batch 代码:本篇代码要你自己敲成
model-learn/s5_grid_search.py
学习目标
- 掌握调参的三级方法论:单变量实验 → 网格搜索 → 随机搜索,知道各自适用场景
- 写一个自动网格搜索脚本:3 个 lr × 3 个 batch,自动跑完出排行榜
- 建立"何时停止调参"的判断——收益递减就收手
核心知识
1. 三级方法论
| 级别 | 做法 | 适用 |
|---|---|---|
| 单变量实验 | 一次改一个,如 S1~S5 的所有实验 | 理解每个旋钮的作用 |
| 网格搜索 | 选 2-3 个关键旋钮,每个取 2-3 档,全组合跑一遍 | 组合少(≤20 组)、算力便宜时 |
| 随机搜索 | 在区间里随机采样 | 组合空间大时(每档效果差距不大) |
2. 网格搜索的纪律(缺一条就变成玄学)
- 只在验证集上调——测试集碰都不碰(S2-02 的铁律)
- 每组固定种子,可复现
- 记录所有组合结果,不只记最好的——失败的组合同样有信息量
- 收益递减就停:最优组与次优组差距 < 噪声水平(参考 S6-02 的 std)就收手
3. 本机规模
2000 样本 × 2 epoch × 9 组 ≈ 5-10 分钟。先用小规模搜索,找到方向后再在全量数据上验证一次——这也是工程惯例(小数据探路,大数据定音)。
实验任务
任务 1:写网格搜索脚本(35 分钟)
# s5_grid_search.py —— 3×3 自动搜索 + 排行榜
import itertools
LRS, BATCHES = [1e-4, 1e-3, 1e-2], [32, 128, 512]
leaderboard = []
for lr, bs in itertools.product(LRS, BATCHES):
torch.manual_seed(42)
# ... 2000 样本训 2 epoch(复用你写熟的代码)
leaderboard.append((lr, bs, val_acc, test_acc, seconds))
leaderboard.sort(key=lambda r: -r[2])
print("排名 lr batch val_acc test_acc 耗时")
for i, (lr, bs, va, ta, t) in enumerate(leaderboard, 1):
print(f"{i:2d} {lr:g} {bs:4d} {va:.4f} {ta:.4f} {t:4.0f}s")
任务 2:跑 9 组并解读排行榜(20 分钟)
- 前 3 名的 lr 集中在哪个数量级?(呼应 S5-01 的黄金区间)
- val 最高组的 test 是不是也最高?若不一致——排序差异说明什么?(val 噪声;这正是 S6-02 交叉验证的动机)
- 最差组和最好组差几个点?调参收益 vs 换数据收益哪个大?
任务 3:方法升级思考(10 分钟)
如果参数变成 lr × batch × dropout × weight_decay 各 3 档 = 81 组,网格还行吗?说说你会怎么办(答要点:先单变量粗筛 → 只留敏感参数做网格 → 或转随机搜索)。
验收标准
衔接下一阶段
会搜了,但"搜出来的分"可信吗 → S6-01 混淆矩阵与类别指标:进入评估阶段,先看准确率怎么骗人。