返回 Ultralytics 术语表
Overfitting
过拟合是指模型连同噪声一起记住训练数据,导致无法处理新数据。了解如何识别过拟合,以及防止过拟合的方法。
当机器学习模型对训练数据拟合得过于紧密,以至于除了真实模式之外,还学到了特定样本中的噪声和偶然特征时,就会发生过拟合。过拟合模型在训练数据上得分很高,在新数据上的表现却明显更差,这种差距的大小反映了过拟合的严重程度。从偏差-方差的角度来看,过拟合属于高方差:模型的预测过度依赖它碰巧见过的具体样本。
识别过拟合#
典型迹象是训练集与验证集表现之间的差距不断扩大。按训练轮次绘制的学习曲线中,训练损失会持续下降,而验证损失先趋于平稳、随后上升;平均精度均值(mAP)等验证指标则会停滞或下降。一个经典的小规模演示是:对从正弦波中采样的 12 个含噪点拟合两个不同次数的多项式:
import numpy as np
from numpy.polynomial import Polynomial
rng = np.random.default_rng(0)
# 12 noisy training points from a sine wave, plus clean test points
x_train = rng.uniform(0, 1, 12)
y_train = np.sin(2 * np.pi * x_train) + rng.normal(0, 0.2, 12)
x_test = np.linspace(0, 1, 200)
y_test = np.sin(2 * np.pi * x_test)
for degree in (3, 9):
fit = Polynomial.fit(x_train, y_train, degree)
train_mse = np.mean((fit(x_train) - y_train) ** 2)
test_mse = np.mean((fit(x_test) - y_test) ** 2)
print(f"Degree {degree:2d}: train MSE {train_mse:.4f}, test MSE {test_mse:.4f}")9 次多项式有足够的灵活性来贴合噪声,使训练误差从 0.0356 降至 0.0148,但测试误差却增加了十倍,从 0.0182 升至 0.1859。
过拟合与欠拟合#
欠拟合则是相反的问题:模型过于简单或训练时间过短,无法捕捉数据中的模式,因此在训练数据和验证数据上的表现都很差。比较两种误差可以区分这两种情况,并指出不同的解决方法。
常见原因#
- 模型容量相对于数据量过大:一个拥有数百万参数的神经网络可以直接记住几百张图像。
- 噪声数据或错误标注的数据:缺失的框、错误的类别和离群值会让模型去拟合现实世界中并不存在的错误。
- 训练时间过长:学到有用模式后,继续训练的轮次大多只会拟合剩余噪声。
- 训练数据范围狭窄:仅使用单个摄像头的白天图像训练的检测器,可能会依赖该摄像头的背景和光照特征,从而漏掉新地点的目标。
防止过拟合#
- 增加更多样的数据:增加真实样本是最直接的解决方法,而数据增强则通过翻转、缩放、重新着色和混合现有图像来增加多样性。
- 正则化:权重衰减会惩罚较大的权重,而丢弃法会在训练过程中随机停用单元,避免任何单一特征变得不可或缺。
- 使用更小的模型或预训练模型:较小的模型不容易记住数据,而使用冻结早期层的迁移学习可以减少需要从小型数据集中学习的权重数量。
- 提前停止:每个训练轮次后都在验证数据上评估,一旦分数不再提升就停止训练,可以避免模型继续拟合噪声。
- 诚实评估:在小型数据集上,交叉验证能更可靠地估计泛化误差,而独立的测试集则能发现模型在超参数调优过程中对验证数据的过拟合。
Ultralytics YOLO 训练通过 patience 参数实现提前停止:如果验证集适应度(检测任务中的 mAP50-95)连续指定轮数没有提升,训练就会结束;即使训练运行到最后,它也会将最佳轮次的权重保存为 best.pt。
from ultralytics import YOLO
# 加载预训练的 YOLO26n 模型
model = YOLO("yolo26n.pt")
# 最多训练 100 个轮次,但验证指标连续 20 个轮次没有提升时就停止
results = model.train(data="coco8.yaml", epochs=100, patience=20)默认值为 patience=100;对于少于 1,000 张图像的数据集,YOLO26 的微调指南建议使用 epochs=50 和 patience=20。










