Early Stopping
当验证性能停滞时,提前停止会结束训练,从而减少不必要的计算并避免过拟合,同时保留模型表现最佳的检查点。
提前停止是一种训练技术:当受监控的性能指标不再改善时,它会结束一次迭代式机器学习运行。它让验证性能决定学习持续的时长,从而减少不必要的计算并限制过拟合。直观地说,当继续训练不再提升模型处理留出样本的能力时,训练就会停止。在机器学习之外,“提前停止”只是指在计划完成之前结束一项活动。
提前停止的工作原理#
训练期间,优化器会使用训练数据更新模型。模型会定期使用单独的验证数据进行评估。训练损失可能持续下降,而验证性能却逐渐变差:这表明出现了过拟合,也就是模型越来越贴合训练样本特有的细节。提前停止会根据留出数据上的性能选择停止点,以限制这一过程。
典型实现会跟踪最佳验证分数,保存对应的模型权重,并统计连续多少次检查没有达到足够的提升。一旦有提升,计数器就会重置;达到配置的耐心值后,训练就会结束。恢复最佳检查点可以保留观测到的最佳验证结果,而这个结果可能出现在最后一个训练步骤之前。
Nelson Morgan 和 Hervé Bourlard 在他们1989 年关于泛化与参数估计的研究中,为前馈神经网络引入了基于验证的停止方法。他们的实验包括语音分类,并展示了如何通过监控独立数据来选择训练时长。
指标、耐心值与最佳权重#
停止规则取决于几个设置:
- 监控指标:验证损失衡量预测误差,目标是最小化;验证准确率衡量预测正确的比例,目标是最大化。
- 耐心值与训练时长:耐心值指定训练最多容忍多少次未成功的检查。一个周期是对训练数据集的一次完整遍历。
- 提升阈值:Keras 将其称为
min_delta,即被视为进步的最小绝对变化量。它的restore_best_weights=True设置会恢复与监控值最佳时对应的权重。 - 验证检查频率:PyTorch Lightning 按验证检查次数计算耐心值。每十个周期检查一次、耐心值设为三,意味着在最佳检查之后的三十个周期内,最多允许三次未成功的检查。
耐心值和提升阈值属于超参数:在权重更新过程之外选择的设置。较小的耐心值会更早结束停滞的训练;较大的耐心值则允许更长时间的暂时停滞。预热期会延迟监控,让初始学习趋于稳定。这些设置会与学习率相互作用,学习率决定优化更新的幅度。
应用场景与可运行示例#
提前停止适用于神经网络和梯度提升树。在使用scikit-learn 进行梯度提升时,每个阶段都会添加一棵树,而基于验证的停止方法会控制阶段数。加利福尼亚房价示例使用 validation_fraction 留出数据,并使用 n_iter_no_change 在验证进展停滞后停止。
以下示例使用 scikit-learn 内置的糖尿病数据集,并输出实际拟合的提升阶段数:
from sklearn.datasets import load_diabetes
from sklearn.ensemble import GradientBoostingRegressor
X, y = load_diabetes(return_X_y=True)
# Reserve an internal validation split and monitor progress.
model = GradientBoostingRegressor(
n_estimators=1000,
validation_fraction=0.2,
n_iter_no_change=10,
random_state=42,
)
model.fit(X, y)
print(f"Boosting stages fitted: {model.n_estimators_}/1000")拟合阶段数显示停止条件在 1,000 个阶段的上限内何处结束了树的构建。
Ultralytics YOLO 在模型训练期间应用提前停止,包括YOLO26,通过 patience 参数统计验证适应度没有提升的周期数。对于目标检测,适应度使用 mAP50–95;训练器会将最佳检查点保存为 best.pt。
提前停止与相关概念#
提前停止是一种控制训练时长的正则化方法。权重衰减会惩罚较大的权重,而 dropout 会在训练期间随机禁用单元。这些机制可以同时使用。过早停止会导致欠拟合,使模型无法学到有用的模式。
检查点保存模型状态;提前停止则决定何时结束优化。交叉验证会轮换留出分区来评估模型选择,而单独的测试数据则用于最终评估。由于停止决策会根据验证结果选择模型,因此所选检查点的验证分数也是模型选择的一部分。
在 Keras 中,restore_best_weights 默认为 False,因此仅启用提前停止会使模型保留最后一步的权重。










