本节摘要:提前停止是成本最低的过拟合刹车。本节讲它在验证损失曲线上的触发逻辑、耐心的设定、以及"回滚到最佳点而非最后一个 epoch"的关键细节,并对比它与正则化的适用差异。
阅读完本节,你应当能够:
前一件武器(正则化)会给训练加成本、改模型权重形态。而这一件几乎不需要付出额外代价:在验证损失开始回升的那一跳前刹车。第四章监控里已经埋下了这条判据,本节把它正式化。提前停止最适合快速确认你正在过拟合的场景——你不需要重新设计模型,等训练到岔路,踩一脚刹车即可。
它的"省算力"属性在超参搜索里特别值钱:搜索上百组超参时,如果每组都训满成千上万个 epoch,总成本是不可接受的;而每组用提前停止尽早停,整体能省下好几倍的时间,且结果往往不差。可以说,提前停止是"最便宜的调参加速器"。
提前停止的观测对象永远是验证损失。前面一遍遍强调"训练损失不代表泛化",在这里直接落地:
"耐心"给一个容错窗口:因为验证曲线有噪声,某两轮不降不代表不会降回来。设个耐心(比如连续 5 或 10 个 epoch 不改善再停),能避免一有抖动就误杀。耐心太小容易砍掉仍在进步的后段;太大则回归"训到满"浪费算力。
要把提前停止读对,你得同时看两条曲线,而不要只盯验证一条。一个很有判断力的组合是:验证损失在涨、训练损失还在降——这是经典的过拟合信号,配合提前停止正好,说明你确实走到了"该刹车"的岔路;而如果训练和验证都降得很慢甚至都持平,那多半不是过拟合,而是学习率太小或模型容量不足,此时提前停止帮不上忙,你要去查的根本不是停车点而是"车本身"。同两张图,读法完全不同,别把它们混为一谈。
"耐心"的具体取值没有铁律,但可以这样掂量:验证曲线若平整、噪声小,耐心可以设小(比如 5);若曲线本身抖得厉害,耐心就得放大(比如 15-20),否则一两次真实的抖动就会把你及早停下,错过后面的进步。一条很实用的经验是"用图定参数":先跑几轮把验证曲线打出来看一眼波动幅度,再据此定耐心,而不是拍脑袋给个 7。要知道,耐心设得太小在超参搜索这种"每组都很快停"的模式里,会把"还在缓慢上涨的组"也误判成不提升,于是你搜出来的"最优"其实是没有充分训练的结果——那就不用谈泛化了。
提前停止正确做法是:训练过程中持续记下"验证最佳时"的参数检查点,一旦触发停止,把模型回滚到那个最佳点。因为触发停止的轮次往往已经多走了一段(开始过拟合),不回滚的话,你拿来交付的其实是"已经过拟合了一点的版本"。回滚,才是提前停止真正兑现泛化红利的那一步。上一章监控代码里那条 save_checkpoint(epoch) 就是为了这刻。
# 概念:提前停止 + 回滚最佳点 best_val, patience_counter, best_state = float("inf"), 0, None for epoch in range(max_epochs): train_one_epoch(model, loader) val = evaluate(model, val_loader) if val < best_val: best_val = val best_state = copy.deepcopy(model.state_dict()) # 记下最佳点 patience_counter = 0 else: patience_counter += 1 if patience_counter >= patience: # 连续耐心轮不改善 model.load_state_dict(best_state) # 回滚到最佳点 break
提前停止通常能和你手里的正则叠加:想让模型跑得更久再考虑停止,可以顺手上一哆嗦正则;反之,想要更省算力,就靠提前停止尽早刹车。但有一条红线要和前一节的教训并看——如果训练损失本来就下不去(欠拟合),提前停止不会救你,因为你压根没走到"开始背题"那一步。它是过拟合的刹车,不是欠拟合的解药。
一个具体的搭配例子:假设你的模型训练 200 个 epoch,验证损失在第 40 个 epoch 达到谷底、之后缓慢回升。给它设耐心 10(连续 10 个 epoch 不创新低就停),通常会在第 50 个 epoch 附近停下,然后回滚到第 40 个 checkpoint。相比训满 200 轮,你省下约四分之三的算力,还拿到了泛化更好的版本。而如果你加了一点点 L2 正则,噪声被压得更小,验证曲线会更平滑,你甚至可以把耐心调小一点,停得更干脆。
⚠️ 常见坑:把提前停止的“验证最佳”直接当成最终成绩在后续选型里到处引用——它只是单个实验的收敛点,跨实验比较仍要回到统一口径的最终测试/多次运行的分布上。
💡 关键直觉:提前停止同时是超参调优的好帮手——它让每个超参组合"训几次不算数"的决定里,多了一个和算力约束挂钩的锚点:算力紧就定小耐心、快跑多组;算力宽就放大耐心、每组磨久一点。
单一模型的能力到顶时,就轮到"以多胜众"——集成学习。