Ultralytics YOLO 超参数调优 指南
介绍
超参数调优不仅仅是一次性的设置,而是一个旨在优化 机器学习 模型性能指标(如准确率、精确率和召回率)的迭代过程。在 Ultralytics YOLO 的背景下,这些超参数范围从学习率到架构细节(例如层数或使用的激活函数类型)不等。Ultralytics Platform 还支持通过可配置的超参数和实时指标跟踪进行 云端训练。
Watch: How to Tune Hyperparameters for Better Model Performance 🚀
什么是超参数?
超参数是算法的高级结构设置。它们在训练阶段之前设置,并在训练过程中保持不变。以下是 Ultralytics YOLO 中一些常用的调优超参数:
- 学习率
lr0:决定在 损失函数 中向最小值移动时每次迭代的步长。 - 批次大小
batch:在前向传播中同时处理的图像数量。 - 轮数
epochs:一个 epoch 是对所有训练样本完成一次前向和后向传播。 - 架构细节:例如通道数、层数、激活函数类型等。
有关 YOLO26 中使用的增强超参数的完整列表,请参阅 配置页面。
遗传进化与变异
Ultralytics YOLO 使用 遗传算法 来优化超参数。遗传算法的灵感来源于自然选择和遗传机制。
- 交叉 (Crossover):每次迭代都会结合迄今为止观察到的最多九种最高适应度配置的基因,使用 BLX-α 交叉,并结合适应度加权父代选择。
- 变异 (Mutation):然后,重组后的候选对象会通过应用于每个超参数的对数正态乘法因子进行扰动(每个参数的概率为 0.5)。变异强度 sigma 在前 300 次迭代中从 0.2 线性衰减到 0.1,因此算法在早期进行广泛探索,并在收敛时进行精细调整。第一次迭代没有可交叉的父代,并使用默认的训练超参数作为基准。
准备超参数调优
在开始调优过程之前,重要的是:
- 确定指标:确定你将用于评估模型性能的指标。这可以是 AP50、F1-score 或其他指标。
- 设置调优预算:定义你愿意分配多少计算资源。超参数调优可能非常耗费计算资源。
涉及步骤
初始化超参数
从一组合理的初始超参数开始。这可以是 Ultralytics YOLO 设置的默认超参数,也可以是基于你的领域知识或先前实验设置的参数。
变异超参数
使用 _mutate 方法基于现有集合生成一组新的超参数。Tuner 类 会自动处理此过程。
训练模型
使用变异后的超参数集进行训练。然后使用你选择的指标评估训练性能。
评估模型
使用 AP50、F1-score 或自定义指标等指标来评估模型性能。评估过程 有助于确定当前的超参数是否比之前的更好。
记录结果
记录性能指标和相应的超参数以供将来参考至关重要。Ultralytics YOLO 会自动以 NDJSON 格式保存这些结果。
重复
重复此过程,直到达到设定的迭代次数或性能指标达到满意为止。每次迭代都基于从先前运行中获得的知识进行构建。
默认搜索空间描述
下表列出了 YOLO26 中超参数调优的默认搜索空间参数。每个参数都有一个由元组 (min, max) 定义的具体取值范围。
| 参数 | 类型 | 取值范围 | 描述 |
|---|---|---|---|
lr0 | float | (1e-5, 1e-2) | 训练开始时的初始学习率。较低的值提供更稳定的训练,但收敛速度较慢 |
lrf | float | (0.01, 1.0) | 作为 lr0 分数的最终学习率因子。控制训练期间学习率降低的程度 |
momentum | float | (0.7, 0.98) | SGD 动量因子。较高的值有助于保持一致的梯度方向,并可以加速收敛 |
weight_decay | float | (0.0, 0.001) | 用于防止过拟合的 L2 正则化因子。较大的值强制执行更强的正则化 |
warmup_epochs | float | (0.0, 5.0) | 线性学习率预热的 epoch 数。有助于防止训练初期的不稳定 |
warmup_momentum | float | (0.0, 0.95) | 预热阶段的初始动量。逐渐增加到最终动量值 |
box | float | (1.0, 20.0) | 总损失函数中的边界框损失权重。平衡框回归与分类 |
cls | float | (0.1, 4.0) | 总损失函数中的分类损失权重。较高的值强调正确的类别预测 |
cls_pw | float | (0.0, 1.0) | 用于处理类别不平衡的类别加权幂。较高的值会增加对稀有类别的权重 |
dfl | float | (0.4, 12.0) | 总损失函数中的 DFL (Distribution Focal Loss) 权重。较高的值强调精确的边界框定位 |
hsv_h | float | (0.0, 0.1) | HSV 颜色空间中的随机色相增强范围。帮助模型在颜色变化中进行泛化 |
hsv_s | float | (0.0, 0.9) | HSV 空间中的随机饱和度增强范围。模拟不同的光照条件 |
hsv_v | float | (0.0, 0.9) | 随机亮度(值)增强范围。帮助模型处理不同的曝光水平 |
degrees | float | (0.0, 45.0) | 最大旋转增强(度)。帮助模型对物体方向保持不变性 |
translate | float | (0.0, 0.9) | 作为图像尺寸分数的最大平移增强。提高对物体位置的鲁棒性 |
scale | float | (0.0, 0.95) | 随机缩放增强范围。帮助模型检测不同尺寸的物体 |
shear | float | (0.0, 10.0) | 最大剪切增强(度)。为训练图像添加类似透视的失真 |
perspective | float | (0.0, 0.001) | 随机透视增强范围。模拟不同的视角 |
flipud | float | (0.0, 1.0) | 训练期间垂直翻转图像的概率。对顶部/航拍图像很有用 |
fliplr | float | (0.0, 1.0) | 水平翻转图像的概率。帮助模型对物体方向保持不变性 |
bgr | float | (0.0, 1.0) | 使用 BGR 增强的概率,它会交换颜色通道。可以帮助实现颜色不变性 |
mosaic | float | (0.0, 1.0) | 使用马赛克增强的概率,它结合 4 张图像。特别适用于小物体检测 |
mixup | float | (0.0, 1.0) | 使用 mixup 增强的概率,它融合两张图像。可以提高模型的鲁棒性 |
cutmix | float | (0.0, 1.0) | 使用 cutmix 增强的概率。在保持局部特征的同时组合图像区域 |
copy_paste | float | (0.0, 1.0) | 使用复制-粘贴增强的概率。有助于提高实例分割性能 |
close_mosaic | float | (0.0, 10.0) | 在最后 N 个 epoch 禁用马赛克以在完成前稳定训练 |
自定义搜索空间示例
以下是如何定义搜索空间并使用 model.tune() 方法利用 Tuner 类对 COCO8 上的 YOLO26n 进行超参数调优的示例,训练 30 个 epoch,使用 AdamW 优化器,并跳过绘图、检查点和最终 epoch 之外的验证以实现更快的调优。
此示例仅供演示使用。从短时间或小规模调优运行中获得的超参数在实际训练中很少是最优的。在实践中,调优应在与全面训练相似的设置下执行(包括可比的数据集、epoch 和增强),以确保结果可靠且可迁移。快速调优可能会导致参数偏向更快的收敛或短期验证收益,而这些收益并不具备泛化能力。
from ultralytics import YOLO
# Initialize the YOLO model
model = YOLO("yolo26n.pt")
# Define search space
search_space = {
"lr0": (1e-5, 1e-2),
"degrees": (0.0, 45.0),
}
# Tune hyperparameters on COCO8 for 30 epochs
model.tune(
data="coco8.yaml",
epochs=30,
iterations=300,
optimizer="AdamW",
space=search_space,
plots=False,
save=False,
val=False,
)恢复中断的超参数调优会话
You can resume an interrupted hyperparameter tuning session by passing resume=True. You can optionally pass the directory name used under runs/{task} to resume. Otherwise, it would resume the last interrupted session. You also need to provide all the previous training arguments including data, epochs, iterations and space.
from ultralytics import YOLO
# Define a YOLO model
model = YOLO("yolo26n.pt")
# Define search space
search_space = {
"lr0": (1e-5, 1e-2),
"degrees": (0.0, 45.0),
}
# Resume previous run
results = model.tune(data="coco8.yaml", epochs=50, iterations=300, space=search_space, resume=True)
# Resume tuning run with name 'tune_exp'
results = model.tune(data="coco8.yaml", epochs=50, iterations=300, space=search_space, name="tune_exp", resume=True)Results
成功完成超参数调优过程后,你将获得几个概括调优结果的文件和目录。以下是每个文件的描述:
文件结构
以下是结果的目录结构。像 train1/ 这样的训练目录包含单独的调优迭代,即用一组超参数训练出的一个模型。tune/ 目录包含来自所有单独模型训练的调优结果:
runs/
└── detect/
├── train1/
├── train2/
├── ...
└── 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/dfl_loss': 0.68503, 'fitness': 0.64297} # Best fitness model is /usr/src/ultralytics/runs/detect/train498 # 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
- 用途: 性能可视化
该图表包含:
- 每个数据集每次迭代一个标记,因此单数据集运行在每次迭代中显示一个点,多数据集运行在每次迭代中为每个数据集显示一个点。
- 一条虚线“平滑均值”线,通过对每次迭代的顶层适应度值进行高斯平滑 (
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/dfl_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/dfl_loss": 1.70226,
"fitness": 0.33152
}
},
"save_dirs": {
"coco8": "runs/detect/coco8",
"coco8-grayscale": "runs/detect/coco8-grayscale"
}
}顶层 fitness 是每个数据集 fitness 值的算术平均值。对于单数据集调优,datasets 字典有一个条目,其 fitness 等于顶层 fitness。每次完成的迭代记录一个 JSON 对象。实际的 save_dirs 路径是绝对路径;为了可读性,上面进行了缩写。
tune_scatter_plots.png
此文件包含由 tune_results.ndjson 生成的散点图,有助于你直观地了解不同超参数与性能指标之间的关系。默认值为 0 的超参数(例如下方的 degrees 和 shear)可能只会从其初始种子值开始缓慢演变,因为乘法变异因子在接近零的值附近几乎没有什么扩展空间。
- 格式: PNG
- 用途: 探索性数据分析
weights/
此目录包含用于超参数调优过程中最后一次和最好一次迭代的已保存 PyTorch 模型。
last.pt: last.pt 是训练最后一个 epoch 的权重。best.pt: best.pt 是达到最佳适应度分数的迭代所对应的权重。
利用这些结果,你可以为未来的模型训练和分析做出更明智的决策。请随时查阅这些工件,以了解模型表现如何以及如何进一步改进它。
总结
得益于其结合了 BLX-α 交叉和对数正态变异的遗传算法方法,Ultralytics YOLO 中的超参数调优过程既简化又强大。遵循本指南中概述的步骤将协助你系统地调优模型以获得更好的性能。
进一步阅读
如需深入了解,你可以探索 Tuner 类 的源代码和配套文档。如果你有任何疑问、功能需求或需要进一步协助,请随时在 GitHub 或 Discord 上联系我们。
常见问题 (FAQ)
在超参数调优期间,我该如何为 Ultralytics YOLO 优化 学习率?
要优化 Ultralytics YOLO 的学习率,请先使用 lr0 参数设置初始学习率。常见值范围从 0.001 到 0.01。在超参数调优过程中,该值将被变异以找到最佳设置。你可以利用 model.tune() 方法实现此过程自动化。例如:
from ultralytics import YOLO
# Initialize the YOLO model
model = YOLO("yolo26n.pt")
# Tune hyperparameters on COCO8 for 30 epochs
model.tune(data="coco8.yaml", epochs=30, iterations=300, optimizer="AdamW", plots=False, save=False, val=False)有关更多详细信息,请查看 Ultralytics YOLO 配置页面。
在 YOLO26 中使用遗传算法进行超参数调优有什么好处?
Ultralytics YOLO26 中的遗传算法为探索超参数空间提供了一种稳健的方法,从而实现高度优化的模型性能。主要好处包括:
- 高效搜索:BLX-α 交叉结合了来自最高适应度亲本的基因,而对数正态变异则扰动结果以发现新的候选者。
- 避免局部极小值:通过引入随机性,它们有助于避免局部极小值,确保更好的全局优化。
- 性能指标:它们基于任务特定的适应度分数(针对检测为 mAP50-95)进行自适应。
要查看遗传算法如何优化超参数,请查看 超参数进化指南。
Ultralytics YOLO 的超参数调优过程需要多长时间?
使用 Ultralytics YOLO 进行超参数调优所需的时间很大程度上取决于数据集大小、模型架构复杂度、迭代次数以及可用计算资源等多种因素。例如,根据硬件情况,在 COCO8 等数据集上对 YOLO26n 进行 30 个 epoch 的调优可能需要数小时到数天的时间。
为了有效管理调优时间,请提前定义明确的调优预算(内部章节链接)。这有助于平衡资源分配和优化目标。
在 YOLO 超参数调优期间,我应该使用哪些指标来评估模型性能?
在 YOLO 超参数调优期间评估模型性能时,你可以使用几个关键指标:
- AP50: IoU 阈值为 0.50 时的平均精度。
- F1-Score: 精确率和召回率的调和平均值。
- 精确率和召回率: 指示模型在识别真正例与假正例及假反例方面的 准确度 的个体指标。
这些指标有助于你了解模型性能的不同方面。请参考 Ultralytics YOLO 性能指标 指南以获取全面概述。
我可以使用 Ray Tune 对 YOLO26 进行高级超参数优化吗?
是的,Ultralytics YOLO26 集成了 Ray Tune 以进行高级超参数优化。Ray Tune 提供复杂的搜索算法(如贝叶斯优化和 Hyperband),以及并行执行功能以加快调优过程。
To use Ray Tune with YOLO26, simply set the use_ray=True parameter in your model.tune() method call. For more details and examples, check out the Ray Tune integration guide.