相同的指标,迥异的性能

在深度学习的炼丹过程中,我们常常会遇到一些看似相同、实则暗藏玄机的现象。最近,我在使用YOLO模型进行物体检测训练时,就遇到了这样一个“谜题”:两次训练,验证集上的各项指标(如 mAP、Loss)几乎一模一样,但其中一个模型在全新未见过的数据上的泛化能力却远超另一个。这背后到底发生了什么?

起初的困惑:两次训练,相似的“成绩单”

我的训练经历如下:

  1. 第一次训练(下称 train4:使用了YOLO的默认配置,没有特意调整 patience 参数(该参数决定了当验证指标在一定周期内不再提升时,训练还能容忍继续多少个周期)。训练在112个epochs后自动停止,模型在验证集上的准确率达到了88%左右。
  2. 第二次训练(下称 train5:吸取经验(或许是为了追求极致),将 patience 参数设置为了一个较大的值——500。令人意外的是,训练结束后,验证准确率依然是88%左右,各项损失值和mAP等评估指标,与第一次训练的结果相比,几乎没有显著差异。

然而,当我用这两个模型去检测一批全新的、从未参与过训练或验证的图片时,train5 的表现(高 patience 值)远胜于 train5。明明“考试成绩”差不多,为什么“实际应用能力”却有天壤之别?

按图索骥:从损失曲线中寻找蛛丝马迹

为了解开疑惑,我们首先查看了两次训练的损失函数曲线。通常,这些曲线能告诉我们模型学习的动态过程。

(图表描述1:训练与验证损失曲线)

  • 图上半部分:训练集损失 (train/dfl_loss, train/cls_loss, train/box_loss)
  • 图下半部分:验证集损失 (val/dfl_loss, val/cls_loss, val/box_loss)
  • 曲线:绿色线代表 train4,橙色线代表 train5。横轴为训练步数(Step)。

Untitled.png

关键观察点:

  1. 训练时长train4(绿色)的曲线在约300个Steps处戛然而止,而train5(橙色)则持续到了500个Steps甚至更远。这印证了train5因高patience而训练了更长时间。
  2. 训练集损失train5由于训练更久,其各项训练损失最终都略低于或持平于train4,符合预期。
  3. 验证集损失 (Val Loss)——玄机所在

    • val/dfl_loss (Distribution Focal Loss,对边界框定位精度影响较大):对于train4,此损失在约200-250 Steps达到低点后,开始有轻微回升的趋势,随后训练便停止了。这暗示着模型可能在该损失分量上刚要开始或已经轻微过拟合。
    • 对于train5val/dfl_loss同样在早期下降后进入波动,并在250 Steps后也呈现缓慢上升。但关键在于,尽管该损失不再改善甚至变差,由于高patience值,训练得以继续。
    • val/cls_loss (分类损失) 和 val/box_loss (边界框回归损失):两者在两次训练中都快速下降并进入平稳期。train5的平稳期更长,最终值与train4停止时相差无几。

初步猜想:
train4可能因为patience不足,在某个验证损失(如val/dfl_loss)刚有“风吹草动”(开始过拟合的迹象)时,或者整体评估指标(如mAP,通常是早停的依据)在短期内没有突破,就“明哲保身”地停止了。而train5则凭借其“耐心”,得以在损失函数的复杂地貌中进行更长时间的探索。

深入求证:评估指标曲线的启示

单看损失曲线还不够,我们还需要结合模型在验证集上的实际评估指标(Metrics)来分析。

(图表描述2:评估指标曲线)

  • 包含:metrics/recall(B) (召回率), metrics/precision(B) (精确率), metrics/mAP50-95(B) (COCO主要评估指标), metrics/mAP50(B)
  • 曲线:绿色线代表 train4,橙色线代表 train5

Untitled-1.png

关键观察点:

  1. 指标高度相似:这些图表完美印证了我的初始观察——在train4停止训练的时刻(约300 Steps),其各项评估指标(Recall, Precision, mAP50-95, mAP50)的数值,与train5在后续更长训练周期中维持的平台期水平几乎完全一致!都在一个相当高的水平。
  2. 平台期train5在各项指标达到高点后,进入了一个漫长的“平台期”,指标值虽有小幅波动,但没有显著的进一步突破。

分析与原理:patience与“平坦最小值 (Flatter Minima)”

如果各项关键评估指标在train4停止时已经和train5的平台期水平相当,那train5更好的泛化能力从何而来?

这里就要引入一个深度学习优化中的重要概念—— 损失函数的平坦最小值 (Flatter Minima)

  • train4可能遇到的情况train4因为较小的patience,当验证指标(如mAP50-95)在短期内没有提升时便停止了。它可能找到了一个在验证集上表现不错的点,但这个点可能位于损失函数地形图中的一个“尖锐 (sharp)”的谷底。这样的“尖锐最小值”对训练/验证数据的拟合很好,但对数据分布稍有不同的新样本可能非常敏感,导致泛化能力不足。
  • train5的优势所在train5凭借其高达500的patience,在验证指标进入平台期后,并没有立即停止,而是继续“探索”了数百个Steps。这段在高性能平台期内的额外训练,即使没有带来指标数值上的显著提升,也给予了优化器充分的时间去“打磨”模型权重,使其更有可能收敛到一个更宽广、更平坦的最小值区域

    • 处于“平坦最小值”的模型,对于输入数据的微小扰动不那么敏感,其决策边界通常更鲁棒。这意味着即使面对全新的、与训练数据分布略有差异的数据,模型也能保持较好的性能,即拥有更好的泛化能力

因此,虽然train4train5在验证集上取得了相似的“分数”,但train5找到的解更可能位于一个更“安全”、更“通用”的区域。

峰回路转:last.pt vs best.pt 的抉择

在分析过程中,李明还观察到一个有趣的现象:在他的train5的Metrics图表中,所有评估指标在训练结束的最后一个周期都有一次明显的跳跃式提升。这让他产生了一个疑问:“这是否意味着我应该使用训练结束时保存的last.pt权重,而不是通常推荐的best.pt(在验证集上取得历史最佳指标的权重)呢?”

这是一个非常实际的问题。通常情况下,我们仍然推荐优先使用 best.pt,原因如下:

  1. best.pt 的核心价值best.pt保存的是模型在整个训练过程中,在验证集上泛化能力被评估为最佳的那个时刻的权重。早停机制和best.pt的引入,主要目的就是为了防止过拟合,并捕捉到模型泛化性能的峰值。
  2. 最后一个周期“跳跃”的潜在风险

    • 随机性/噪声:验证集的评估本身可能存在一定的随机性。最后一次评估恰好遇到有利的样本组合或随机条件,导致指标偶然性地冲高,但这并不一定代表模型真实、稳定泛化能力的提升。
    • “昙花一现”:这种跳跃可能只是暂时的,如果继续训练,指标很可能会回落。它没有经过后续周期的验证来证明其稳定性。
  3. patience的意义patience参数的存在,就是为了确保只有持续的、稳定的改进才被认为是真正的“最佳”。如果最后一个周期的跳跃是真实且可持续的巨大进步,那么patience应该尚未耗尽,best.pt也应该在那时被更新。

何时可以考虑 last.pt

  • 如果验证指标在整个训练过程中都呈现单调稳定上升的趋势,从未出现平台期或下降,那么last.pt自然就是best.pt
  • 如果训练因为达到最大设定的epochs数而停止,并且验证指标在最后阶段确实处于一个持续上升或稳定在高位的新平台,last.pt值得考虑。

最可靠的判断方法:始终是使用一个完全独立的测试集 (test set) 来评估best.ptlast.pt的真实性能。实践是检验真理的唯一标准。

结论与启示

李明的这个案例生动地展示了:

  1. 表面指标相似,内涵可能不同:仅仅比较验证集上的峰值指标,可能无法完全反映模型的真实泛化能力。
  2. patience 不仅仅是“耐心”:它不仅控制训练时长,更深层次地影响模型能否找到更鲁棒的解。足够大的patience允许模型在达到一个不错的性能平台后,继续进行“精细打磨”,从而有机会收敛到损失函数更平坦的区域,这通常与更好的泛化性相关。
  3. 坚守 best.pt 的普遍适用性:除非有充分证据(如独立测试集验证),best.pt通常是更安全、更可靠的选择,它代表了模型在验证阶段被证明的最佳状态。

在我们的深度学习“炼丹”之旅中,理解这些超参数背后的机制,并结合细致的实验观察,才能不断提升模型的真实效能。希望这次的案例分析能给你带来一些启发!


Airy
2.4k 声望69 粉丝

github.com/airylinus