在训练神经网络时,您通常会发现训练损失持续下降。这是合理的;模型在拟合训练数据方面表现越来越好。然而,如本章前面所说,仅仅最小化训练损失并非最终目标。我们希望模型能够良好地泛化到新的、未见过的数据。我们如何知道何时停止训练以达到最佳泛化效果?训练的轮次过少可能导致欠拟合,而训练的轮次过多常会导致过拟合。早期停止提供了解决此问题的简单而有效的方法。其主要思路是,在训练过程中,监控模型在单独验证集上的表现,并在验证集上的表现不再提升或开始变差时停止训练,即使训练损失仍在下降。监控验证表现在每个训练轮次之后(或有时在固定数量的批次之后),需要评估模型在训练数据和验证集上的表现。在验证集上,通常会追踪一个特定的衡量指标,最常见的是验证损失,但它也可以是准确率、F1分数或其他根据特定问题而定的相关指标。最初,随着模型学习,训练损失和验证损失都趋于下降。然而,在某个时刻,模型可能开始过度适应训练数据的特定模式和噪声。这是过拟合的开始。当这种情况发生时,您通常会发现训练损失继续下降,而验证损失趋于平稳,或者更明显地,开始上升。这种分歧是一个明确的信号,表明模型的泛化能力正在下降。下图说明了这种常见模式:{"layout": {"xaxis": {"title": "训练轮次"}, "yaxis": {"title": "损失"}, "title": {"text": "训练损失与验证损失对比"}, "legend": {"traceorder": "normal"}}, "data": [{"x": [1, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100], "y": [2.1, 1.5, 1.1, 0.8, 0.6, 0.45, 0.35, 0.3, 0.26, 0.23, 0.21, 0.19, 0.17, 0.16, 0.15, 0.14, 0.13, 0.12, 0.11, 0.1, 0.09], "mode": "lines", "name": "训练损失", "line": {"color": "#339af0"}}, {"x": [1, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100], "y": [2.2, 1.7, 1.3, 1.0, 0.8, 0.65, 0.55, 0.5, 0.46, 0.44, 0.43, 0.42, 0.415, 0.41, 0.415, 0.42, 0.43, 0.45, 0.47, 0.49, 0.51], "mode": "lines", "name": "验证损失", "line": {"color": "#fd7e14"}}, {"x": [65], "y": [0.41], "mode": "markers", "name": "最佳验证损失", "marker": {"color": "#f03e3e", "size": 10, "symbol": "x"}}]}训练损失通常随训练轮次增加而下降。验证损失最初下降,但当模型开始过拟合时会开始上升。早期停止的目标是在验证损失最小的点(由标记指示)附近停止训练。早期停止机制实施早期停止涉及几个重要的组成部分:监控指标: 选择一个在验证集上追踪的指标(例如,验证损失、验证准确率)。频率: 决定多久在验证集上评估一次模型(例如,每个训练轮次之后)。最佳表现追踪: 记录训练期间目前观察到的最佳验证指标值。模型检查点: 每当取得新的最佳验证表现时,保存模型的当前状态(权重和偏置)。这很重要,因为最佳模型可能不是停止前的最后一个训练轮次所对应的模型。容忍度: 引入一个“容忍度”参数。这是在停止训练前,等待验证指标提升的训练轮次数量。例如,如果容忍度设置为10,那么如果验证指标连续10个训练轮次没有提升,训练就会停止。容忍度有助于避免因验证指标的噪声波动而过早停止。停止标准: 如果监控的验证指标在指定的容忍度训练轮次内没有提升,则停止训练。恢复最佳权重: 训练停止后,丢弃最后一个训练轮次的模型权重,并加载训练期间观察到的与最佳验证表现相对应的已保存权重。这确保您最终得到泛化表现最好的模型。实践考量选择指标: 验证损失通常是一个好的默认选择,因为它与模型优化的目标函数直接相关。然而,如果某个特定的评估指标(如准确率或F1分数)对您的应用更重要,您可以选择监控该指标。请注意,像准确率这样的指标可能不如损失对微小提升那么敏感,尤其是在训练早期或不平衡数据集上。设置容忍度: 最佳的容忍度值取决于数据集、模型复杂度和批次大小。值过低可能导致训练过早停止;值过高可能在停止前允许过拟合发生。5到20之间的值是常见的起始点,但通常需要进行实验。最小变化量: 一些实现包含一个min_delta参数,它定义了监控量需要变化的最小值才能算作提升。这有助于忽略可能只是噪声的微不足道的提升。早期停止是一种广泛采用且效果好的方法,用于防止过拟合。它通过训练时长隐式地控制模型的容量,起到了一种正则化作用。它计算效率高,相对容易实现,并且通常在泛化表现上带来显著提升,且调优工作量较少,相比于明确添加$L1$或$L2$等正则化项。大多数深度学习框架提供了便于将早期停止集成到训练循环中的方式。