返回专辑
·Johan·3 分钟阅读

先过拟合一小撮

连 50 张训练子集都学不会,加数据和大模型没用——先 overfit tiny set 验证实现、标签和 loss 正确。

先过拟合一小撮

1. 小集学不会,大集没意义

新 segmentation pipeline 训三天 val 不动,我先用五十张过拟合实验——train loss 卡在 0.5 下不去。查下来是 mask 与 image resize 不同步,等于随机标签。修完增广后五十张二十 epoch 内 loss 近零。连 tiny set 都学不会,加数据、换大模型、调正则都没意义——先证明实现、标签和 loss 正确。

这是排查 bug 的第一招,不是 optional trick。团队若跳过这步直接调超参,常在错误 pipeline 上浪费数周算力。

2. 怎么做 tiny overfit

固定五十到二百张(或一个 batch 重复),关 dropout、减 weight decay、必要时增大 LR。目标:train loss → 0(CE < 0.01)、train acc/IoU → 100% 或接近。

python
tiny = torch.utils.data.Subset(dataset, list(range(50)))
loader = DataLoader(tiny, batch_size=10, shuffle=True)

过拟合小集 OK 但全量不收敛 → 正常,加数据/正则/调 capacity。小集不过 → 实现 bug,别调超参,查下面清单。

3. 小集不过的常见原因

标签错:mask/bbox/keypoint 与 image 变换不同步。loss 符号或 reduction 错。augment 破坏标签。num_classes、ignore_index 与数据 mismatch。忘记 optimizer.zero_grad()。学习率过小或 schedule 过早 decay。BatchNorm 在 tiny batch 上噪声过大(可换 GroupNorm 或 freeze BN 做 debug)。

逐项单变量排除,不要同时改五项超参。

4. 与 sanity check 的配合

overfit tiny set 通过后,再跑:单 batch 过拟合(同一 batch 重复一百次,loss 应趋零)、梯度检查(finite difference 或 torch.autograd.gradcheck 对小模块)、train/val 同一批 forward 对比 output shape。

5. 案例:resize 不同步

某分割项目 fifty 张过不了——可视化发现 mask 被 nearest 缩到错误尺寸。改 bilinear 对齐 image 后十分钟过小集。这种 bug 全量训练永远暴露不出来「学不会」,只会表现为「涨不动」。

6. 验收

  • 五十张内 train loss 近 0,acc/IoU 近 100%。
  • 小集不过时先查 label/augment/loss,不调 LR 和 model size。
  • 小集通过后全量训练才启动。
  • debug 时记录 tiny set 的 fixed seed 和 sample id。
  • 过拟合实验关 dropout、减正则,与生产训练配置分开。

7. 落地与衔接

新流水线合入主干前强制跑五十张过拟合门槛:固定随机种子与样本编号写入持续集成,训练损失近零才允许开全量训练。调试配置与生产配置分文件存放,避免把关闭随机失活的小集实验误当默认。可视化增广叠加图与单批次重复实验纳入入职清单,新人第一天就能排除标签同步类错误。全量训练启动前在合并请求里附小集曲线截图,便于审查者快速判断 pipeline 是否可信。

8. 案例复盘

某语义分割项目全量训三天验证不动,五十张过拟合卡在零点五——叠加图发现掩码最近邻缩放与图像双线性不同步。修对齐后小集二十分钟损失近零,全量训练次日验证正常上涨。团队此后把微小集过拟合写进合并模板,省掉多次调学习率调骨干的空转。这类错误在全量上只会表现为涨不动,不会自动指向流水线。该案例已纳入培训材料,强调先证伪实现再谈数据量。

先过拟合一小撮是训练前的契约测试。实现错了,数据 pipeline 错了,后面所有实验都是在错误基础上堆噪声。把 overfit gate 当成和数据 lint 同级的合并条件,比事后翻 log 猜原因可靠得多。小集通过后仍要保留固定难例,供后续增广或结构改动时快速回归。全量训练启动前在合并请求里附小集曲线。团队培训强调全量训练前先过微小集门槛,任何跳过该步骤的合并须说明理由并由负责人签字。

← 全部文章

johan's blog