Ultralytics YOLO27:
Get Started

Ultralytics YOLO超参数调优指南#

Ultralytics YOLO 中的超参数调优是一种自动化、迭代式搜索,通过优化学习率、损失权重和增强强度等设置,最大化机器学习模型的准确率、精确率和召回率等性能指标。Ultralytics YOLO 不会手动逐一测试这些值,而是使用遗传算法探索超参数空间,在多次短时训练中对候选配置进行变异和评估。



观看: 如何调整超参数以提升模型性能 🚀

什么是超参数?#

超参数是算法的高级结构设置。它们在训练阶段开始前设定,并在训练过程中保持不变。以下是 Ultralytics YOLO 中一些常见的调优超参数:

  • 学习率 lr0:决定每次迭代朝损失函数最小值移动时的步长。
  • 批量大小 batch:一次前向传播中同时处理的图像数量。
  • 轮数 epochs:一个轮次是对所有训练样本进行一次完整的前向传播和反向传播。
  • 架构细节:例如通道数、层数、激活函数类型等。这些内容位于模型 YAML 配置中,而不是训练参数中。

在这四项中,默认搜索空间仅包含学习率:batch、epochs 和架构保持不变。调优器还会对下方列出的调度策略、损失增益和增强进行变异。

Hyperparameter optimization search space visualization

如需查看 YOLO26 中使用的完整增强超参数列表,请参阅配置页面。

遗传演化与变异#

Ultralytics YOLO 使用遗传算法优化超参数。遗传算法的灵感来自自然选择和遗传机制。

  • 选择:每次迭代都会从适应度最高的最多九个配置中按适应度加权选取一个。结果达到 30 个后,所有结果中适应度最高的 20%(最多 30 个)也会用于估算参数协方差;随着精英样本证据不断积累,其影响也会增大。
  • 变异:每次迭代使用按搜索范围归一化的高斯步长,对大约一半的参数进行变异。协方差启用后,置信度加权的部分变异(最多 40%)会采用相关步长,并通过反射将这些步长限制在边界内,不会累积被截断的值。若多次试验持续没有改进,步长会在 25 次试验内线性缩小,最多缩小 20%;找到新的最佳结果时,步长会重置。第 1 次迭代没有父代,使用默认训练超参数作为基线。

准备超参数调优#

开始调优前,请务必:

  1. 确定指标:内置调优器(use_ray=False)按任务的 fitness 分数对试验进行排名,而 use_ray=True 使用任务指标。确定要检查哪些辅助指标,例如 AP50 或 F1 分数。
  2. 设定调优预算:确定你愿意分配多少计算资源。超参数调优可能会消耗大量计算资源。

调优循环的工作方式#

每次迭代中,内置调优器都会重复执行以下循环:

  1. 初始化超参数 — 从合理的基线开始,可以使用 Ultralytics YOLO 设置的默认超参数,也可以采用基于领域知识或先前实验确定的值。
  2. 变异超参数 — Tuner 类会自动通过其 _mutate 方法,根据现有超参数生成一组新的超参数。
  3. 训练模型 — 使用变异后的超参数进行训练,然后用你选择的指标评估训练性能。
  4. 评估模型 — 评估流程会生成本次迭代的适应度分数,并将其与之前迭代的分数进行比较,以判断当前超参数是否有所改进。
  5. 记录结果 — 记录性能指标和对应的超参数,以供日后参考。Ultralytics YOLO 会自动以 NDJSON 格式保存这些结果。
  6. 重复 — 持续执行,直到达到设定的迭代次数;每次迭代都会基于之前运行积累的经验继续进行。内置调优器会运行所有 iterations;Ray Tune 会在每个拟合轮次后报告指标,使 ASHA 能在宽限期后停止表现不佳的试验。

迭代次数与种群规模#

使用内置调优器(use_ray=False)时,iterations 控制顺序执行的试验总数,默认值为 300。每次试验都会使用一种超参数配置训练一个模型。例如,iterations=40 与 epochs=50 会安排 40 次相互独立的 50 轮训练,而不是用 40 个不同候选项组成的种群执行一次 50 轮训练。

内置遗传算法没有明确的种群规模参数。存在先前试验结果后,它会从适应度最高的最多九个配置中进行选择,并在每次迭代中变异一个候选配置。

如需并行试验或更高级的搜索策略,请将 use_ray=True 设置为使用 Ray Tune。Ray Tune 使用相同的默认试验次数 300,并接收 iterations 作为 num_samples。详情请参阅 Ray Tune 集成指南。

默认搜索空间#

下表列出了 YOLO26 超参数调优的默认搜索空间参数。每个参数都有由元组 (min, max) 定义的特定取值范围。

参数类型取值范围说明
lr0float(1e-5, 1e-2)训练开始时的初始学习率。较低的值能让训练更稳定,但收敛速度较慢
lrffloat(0.01, 1.0)最终学习率相对于 lr0 的比例因子。控制训练过程中学习率的下降幅度
momentumfloat(0.7, 0.98)SGD 动量因子。较高的值有助于保持梯度方向一致,并可能加快收敛
weight_decayfloat(0.0, 0.001)用于防止过拟合的 L2 正则化因子。较大的值会施加更强的正则化
warmup_epochsfloat(0.0, 5.0)线性学习率预热的轮数。有助于防止训练早期不稳定
warmup_momentumfloat(0.0, 0.95)预热阶段的初始动量。该值会逐渐增加到最终动量值
boxfloat(1.0, 20.0)总损失函数中的边界框损失权重。用于平衡边界框回归与分类
clsfloat(0.1, 4.0)总损失函数中的分类损失权重。较高的值会更加重视正确的类别预测
cls_pwfloat(0.0, 1.0)用于处理类别不平衡的类别加权指数。较高的值会增加稀有类别的权重
dflfloat(0.4, 12.0)边界框距离回归项的权重。无 DFL 的 YOLO26 会将此增益应用于归一化边界框距离上的 L1 损失;较高的值会更加重视精确定位
hsv_hfloat(0.0, 0.1)HSV 色彩空间中的随机色调增强范围。有助于模型适应不同的颜色变化
hsv_sfloat(0.0, 0.9)HSV 空间中的随机饱和度增强范围。用于模拟不同的光照条件
hsv_vfloat(0.0, 0.9)随机明度(亮度)增强范围。有助于模型适应不同的曝光水平
degreesfloat(0.0, 45.0)最大旋转增强角度(度)。有助于模型不受物体方向影响
translatefloat(0.0, 0.9)最大平移增强量,占图像尺寸的比例。提高模型对物体位置变化的鲁棒性
scalefloat(0.0, 0.95)随机缩放增强范围。有助于模型检测不同尺寸的物体
shearfloat(0.0, 10.0)最大剪切增强角度(度)。为训练图像添加类似透视的畸变
perspectivefloat(0.0, 0.001)随机透视增强范围。用于模拟不同的观察角度
flipudfloat(0.0, 1.0)训练期间垂直翻转图像的概率。适用于俯视或航拍图像
fliplrfloat(0.0, 1.0)水平翻转图像的概率。有助于模型不受物体方向影响
bgrfloat(0.0, 1.0)使用 BGR 增强(交换颜色通道)的概率。有助于模型适应颜色变化
mosaicfloat(0.0, 1.0)使用马赛克增强(组合 4 张图像)的概率。对小物体检测尤其有用
mixupfloat(0.0, 1.0)使用 MixUp 增强(混合两张图像)的概率。有助于提高模型鲁棒性
cutmixfloat(0.0, 1.0)使用 CutMix 增强的概率。该增强会组合图像区域,同时保留局部特征
copy_pastefloat(0.0, 1.0)在 flip 模式下,表示符合条件的物体中被复制的比例;在 mixup 模式下,还表示应用该增强的概率
close_mosaicint(0.0, 10.0)在最后 N 个轮次中禁用马赛克增强,以便在训练结束前稳定训练。该值以浮点数进行变异,然后四舍五入为整数轮次

自定义搜索空间示例#

下面演示如何定义搜索空间,并使用 model.tune() 方法调用 Tuner 类,为 YOLO26n 在 COCO8 上使用 AdamW 优化器进行 30 轮超参数调优;为加快调优速度,跳过绘图、检查点保存和除最后一轮以外的验证。

警告

此示例仅用于演示。通过短时或小规模调优运行得出的超参数,在真实训练中很少能达到最优。实际应用中,调优应在与完整训练相近的设置下进行,包括相似的数据集、轮数和增强方式,以确保结果可靠且可迁移。快速调优可能会使参数偏向更快收敛或短期验证指标提升,而这些效果未必能泛化。

示例
from ultralytics import YOLO

# 初始化 YOLO 模型
model = YOLO("yolo26n.pt")

# 定义搜索空间
search_space = {
    "lr0": (1e-5, 1e-2),
    "degrees": (0.0, 45.0),
}

# 在 COCO8 上调优 30 轮的超参数
model.tune(
    data="coco8.yaml",
    epochs=30,
    iterations=300,
    optimizer="AdamW",
    space=search_space,
    plots=False,
    save=False,
    val=False,
)

恢复中断的超参数调优会话#

传入 resume=True 即可恢复中断的超参数调优会话。你也可以选择传入在 runs/{task} 下使用的目录 name 来恢复会话。如果不指定 name,则会恢复名为 tune 的目录;这是默认名称,而不一定是最近运行的会话,因此,对于使用自定义名称启动的运行,请传入 name。你还需要提供之前使用的所有训练参数,包括 data、epochs、iterations 和 space。

将 `resume=True` 与 `model.tune()` 配合使用
from ultralytics import YOLO

# 定义 YOLO 模型
model = YOLO("yolo26n.pt")

# 定义搜索空间
search_space = {
    "lr0": (1e-5, 1e-2),
    "degrees": (0.0, 45.0),
}

# 恢复之前的运行
results = model.tune(data="coco8.yaml", epochs=50, iterations=300, space=search_space, resume=True)

# 使用名称 'tune_exp' 恢复调优运行
results = model.tune(data="coco8.yaml", epochs=50, iterations=300, space=search_space, name="tune_exp", resume=True)

结果#

成功完成超参数调优后,你会获得若干封装调优结果的文件和目录。以下是各项内容的说明:

文件结构#

以下是结果目录结构示例。multitrain/ 和 multitrain-2/ 等搜索目录存放各次独立的调优迭代,也就是每个数据集使用一组超参数训练一个模型,并存放在以数据集命名的子目录中。为节省存储空间,调优器会删除非当前最佳迭代对应的各数据集运行目录。tune/ 目录包含所有单个模型训练的调优结果:

runs/
└── detect/
    ├── multitrain/
    │   └── coco8/
    ├── multitrain-2/
    ├── ...
    └── tune/
        ├── best_hyperparameters.yaml
        ├── tune_fitness.png
        ├── tune_results.ndjson
        ├── tune_scatter_plots.png
        └── weights/
            ├── last.pt
            └── best.pt

文件说明#

best_hyperparameters.yaml#

此 YAML 文件包含调优过程中找到的性能最佳超参数。你可以使用此文件,在后续训练中以这些经过优化的设置进行初始化。

  • 格式:YAML

  • 用途:超参数结果

  • 示例:

    # 558/900 iterations complete ✅ (45536.81s)
    # Results saved to /usr/src/ultralytics/runs/detect/tune
    # Best fitness=0.64297 observed at iteration 498
    # Best fitness metrics are {'metrics/precision(B)': 0.87247, 'metrics/recall(B)': 0.71387, 'metrics/mAP50(B)': 0.79106, 'metrics/mAP50-95(B)': 0.62651, 'val/box_loss': 2.79884, 'val/cls_loss': 2.72386, 'val/l1_loss': 0.68503, 'fitness': 0.64297}
    # Best fitness model is /usr/src/ultralytics/runs/detect/tune/weights
    # Best fitness hyperparameters are printed below.
    
    lr0: 0.00269
    lrf: 0.00288
    momentum: 0.73375
    weight_decay: 0.00015
    warmup_epochs: 1.22935
    warmup_momentum: 0.1525
    box: 18.27875
    cls: 1.32899
    dfl: 0.56016
    hsv_h: 0.01148
    hsv_s: 0.53554
    hsv_v: 0.13636
    degrees: 0.0
    translate: 0.12431
    scale: 0.07643
    shear: 0.0
    perspective: 0.0
    flipud: 0.0
    fliplr: 0.08631
    mosaic: 0.42551
    mixup: 0.0
    copy_paste: 0.0

tune_fitness.png#

此图展示了适应度随迭代次数的变化情况,可帮助你直观了解遗传算法随时间的表现。

  • 格式:PNG
  • 用途:性能可视化

Hyperparameter Tuning Fitness vs Iteration

图中包含:

  • 每个数据集的每次迭代各有一个标记,因此,单数据集运行中每次迭代显示一个点,多数据集运行中每个数据集的每次迭代均显示一个点。
  • 一条点状的“平滑均值”曲线,通过对每次迭代的顶层适应度值进行高斯平滑(sigma=3)计算得出。

tune_results.ndjson#

此 NDJSON 文件包含每次调优迭代的详细结果。每行都是一个 JSON 对象,包含汇总适应度、调优后的超参数和各数据集的指标。单数据集和多数据集调优使用相同的文件格式。

  • 格式:NDJSON
  • 用途:跟踪每次迭代的结果。
  • 示例:

下面给出了经过美化排版的示例,便于阅读;在实际的 .ndjson 文件中,每个对象都存储在单独一行中。

{
    "iteration": 1,
    "fitness": 0.48628,
    "hyperparameters": {
        "lr0": 0.01,
        "lrf": 0.01,
        "momentum": 0.937,
        "weight_decay": 0.0005
    },
    "datasets": {
        "coco8": {
            "metrics/precision(B)": 0.65666,
            "metrics/recall(B)": 0.85,
            "metrics/mAP50(B)": 0.85086,
            "metrics/mAP50-95(B)": 0.64104,
            "val/box_loss": 1.57958,
            "val/cls_loss": 1.04986,
            "val/l1_loss": 1.32641,
            "fitness": 0.64104
        },
        "coco8-grayscale": {
            "metrics/precision(B)": 0.6582,
            "metrics/recall(B)": 0.51667,
            "metrics/mAP50(B)": 0.59106,
            "metrics/mAP50-95(B)": 0.33152,
            "val/box_loss": 1.95424,
            "val/cls_loss": 1.64059,
            "val/l1_loss": 1.70226,
            "fitness": 0.33152
        }
    },
    "save_dirs": {
        "coco8": "runs/detect/multitrain/coco8",
        "coco8-grayscale": "runs/detect/multitrain/coco8-grayscale"
    }
}

顶层的 fitness 是各数据集 fitness 值的算术平均值。对于单数据集调优,datasets 字典只有一个条目,其 fitness 等于顶层的 fitness。每完成一次迭代,就会记录一个 JSON 对象。实际的 save_dirs 路径都是绝对路径;上方为便于阅读进行了缩写。

tune_scatter_plots.png#

此文件包含根据 tune_results.ndjson 生成的散点图,可帮助你直观了解不同超参数与性能指标之间的关系。变异会使用每个超参数配置的范围,因此其值可以从 degrees 和 shear 等默认值为零的参数开始演化。

  • 格式:PNG
  • 用途:探索性数据分析

Hyperparameter tuning results scatter plot analysis

weights/#

此目录包含来自调优运行中适应度最佳迭代的已保存 PyTorch 模型。两个文件都来自同一次迭代:

  • last.pt:last.pt 是训练最后一轮的权重。
  • best.pt:best.pt 是取得最佳适应度分数的迭代所对应的权重。

利用这些结果,你可以为后续模型训练和分析做出更明智的决策。

结论#

Ultralytics YOLO 的超参数调优既易于启动,底层机制也很强大:它在遗传算法中使用基于适应度的加权选择和按范围归一化的变异。按照本指南概述的循环操作,你可以系统地调优模型以获得更好的性能,然后复用生成的 best_hyperparameters.yaml 来初始化后续训练。要在并行试验中扩展调优并使用更高级的搜索算法,请继续阅读 Ray Tune 集成指南;或者通过 云端训练,在 Ultralytics Platform 上运行托管任务,并配置超参数、实时跟踪指标。

对于没有任何参数可以设置的选项,例如逐层学习率或自定义适应度指标,请改为对训练器进行子类化。如需深入了解,请查看 Tuner 类的源代码。如果你有问题或功能需求,请在 GitHub 或 Discord 上联系我们。

常见问题#

  • 使用 lr0 参数设置初始值——常见取值范围是 0.001 到 0.01——然后让调优过程从该值开始变异,以找到最优值。你可以使用 model.tune() 方法自动执行此操作。例如:

    示例
    from ultralytics import YOLO
    
    # 初始化 YOLO 模型
    model = YOLO("yolo26n.pt")
    
    # 在 COCO8 上调优 30 轮的超参数
    model.tune(data="coco8.yaml", epochs=30, iterations=300, optimizer="AdamW", plots=False, save=False, val=False)

    如需了解更多详情,请查看 Ultralytics YOLO 配置页面。

  • Ultralytics YOLO26 中的遗传算法提供了一种稳健的方法来探索超参数空间,从而实现高度优化的模型性能。主要优势包括:

    • 高效搜索:基于适应度的加权选择会保留表现良好的配置,而按范围归一化的变异则会探索新的候选配置。
    • 避免局部最优:通过引入随机性,遗传算法有助于避免局部最优,从而实现更好的全局优化。
    • 性能指标:遗传算法会根据特定任务的适应度分数进行调整(检测任务使用 mAP50-95)。

    如需了解遗传算法如何优化超参数,请查看超参数演化指南。

  • 使用 Ultralytics YOLO 进行超参数调优所需的时间,很大程度上取决于多个因素,例如数据集大小、模型架构的复杂度、迭代次数以及可用的计算资源。例如,在 COCO8 这类数据集上对 YOLO26n 调优 30 个 epoch,可能需要数小时到数天,具体取决于硬件。

    要有效管理调优时间,请预先设定明确的调优预算,相关内容请参阅超参数调优准备工作。这有助于平衡资源分配与优化目标。

  • 在 YOLO 超参数调优期间评估模型性能时,可以使用以下几个关键指标:

    • AP50:IoU 阈值为 0.50 时的平均精度。
    • F1 分数:精确率和召回率的调和平均数。
    • 精确率和召回率:这两个独立指标用于衡量模型识别真正例、假正例和假负例的准确性。

    这些指标有助于你了解模型性能的不同方面。如需全面了解,请参阅 Ultralytics YOLO 性能指标指南。

  • 可以,Ultralytics YOLO26 集成了 Ray Tune,可用于高级超参数优化。Ray Tune 提供贝叶斯优化和 Hyperband 等高级搜索算法,以及并行执行功能,从而加快调优过程。

    要在 YOLO26 中使用 Ray Tune,只需在调用 model.tune() 方法时设置 use_ray=True 参数。有关更多详情和示例,请查看 Ray Tune 集成指南。

评论