阶段:S4-训练过程 | 预计耗时:75-90 分钟(四组对照)| 前置:S4-01 loss 曲线解读(用到那张过拟合图当靶子) 代码:本篇代码要你自己敲成
model-learn/s4_regularization.py
学习目标
- 掌握四大正则化药方的原理与代价:更多数据/增强、早停、Dropout、权重衰减
- 在同一个过拟合场景上逐一试药,用 val 准确率评出最划算的药
- 理解正则化的共同本质:牺牲一点训练集成绩,换泛化能力
核心知识
1. 四大药方对比
| 药 | 原理 | 代价 | 一句话写法 |
|---|---|---|---|
| 更多数据/增强 | 根治:题海无边,背不完 | 要多花数据/算力 | S2-03 已做过 |
| 早停 early stopping | val 一开始升就停车 | 几乎免费 | 监控 val, patience=N |
| Dropout | 训练时随机丢一部分神经元,防"合谋背题" | 收敛稍慢 | nn.Dropout(0.5) + 记得 eval() |
| 权重衰减 weight decay | 参数越大罚越重 → 学得太复杂的代价高 | 几乎免费 | Adam(..., weight_decay=1e-4) |
2. Dropout 与 eval() 的关系(呼应 S3-03)
Dropout 只在训练时生效——这就是推理前必须 model.eval() 的真正原因。你的 SmallCNN 原版没有 Dropout,本篇加药后这个开关立刻有实际作用。
3. 本机实验设计
统一靶场:200 样本 / 30 epoch / lr=1e-3(S4-01 确认会过拟合的配置)。四组:无药对照 / 早停 / Dropout / weight decay。每组记 val 最高点及其 epoch。
实验任务
任务 1:写四合一脚本(40 分钟)
# s4_regularization.py —— 同一靶场逐一试药
# 基座 = S4-01 的 overfit 配置,加 --drug none|early|dropout|decay 参数
# dropout 组: 模型隐层后插 nn.Dropout(0.5)
# decay 组 : Adam(..., weight_decay=1e-4)
# early 组 : val_acc 连续 5 个 epoch 不再创新高就 break
# 输出格式:药物 | 最高val_acc | 达到它的epoch | 最终test_acc
任务 2:跑四组填表(20 分钟)
| 药 | 最高 val_acc | 对应 epoch | test_acc |
|---|---|---|---|
| 无药 | |||
| 早停 | |||
| Dropout 0.5 | |||
| weight decay 1e-4 |
任务 3:两个思考题(15 分钟)
- 哪个药"最便宜"?哪个改变了模型结构?(自由药:早停;动刀:Dropout)
- 把 200 样本换成 2000 样本再跑无药组——过拟合减轻了吗?数据是不是最强的正则化?
验收标准
衔接下一阶段
训练过程的病都会治了 → S5-01 学习率系统实验:进入调参阶段,把第一超参数摸透。