Link to this sectionUltralytics YOLO 超参数调优指南#
Link to this section简介#
超参数调优不仅仅是一次性的设置,而是一个旨在优化机器学习模型性能指标(如准确率、精确率和召回率)的迭代过程。在 Ultralytics YOLO 的背景下,这些超参数的范围很广,从学习率到架构细节(例如层数或所使用的激活函数类型)不等。Ultralytics Platform 也支持通过可配置的超参数和实时指标跟踪进行云端训练。
Watch: How to Tune Hyperparameters for Better Model Performance 🚀
Link to this section什么是超参数?#
超参数是算法的高级结构设置。它们在训练阶段之前设置,并在训练期间保持不变。以下是 Ultralytics YOLO 中一些常用的调优超参数:
- 学习率
lr0:决定了在向损失函数最小值移动时,每次迭代的步长。 - 批大小
batch:在前向传播中同时处理的图像数量。 - 周期数
epochs:一个周期(epoch)是指对所有训练示例进行一次完整的前向和后向传播。 - 架构细节:如通道数、层数、激活函数类型等。
有关 YOLO26 中使用的增强超参数的完整列表,请参阅配置页面。
Link to this section遗传演化与突变#
Ultralytics YOLO 使用遗传算法来优化超参数。遗传算法受到自然选择和遗传机制的启发。
- 交叉 (Crossover):每次迭代都会结合迄今为止观察到的最多九个最高适应度配置的基因,使用 BLX-α 交叉和适应度加权的父代选择。
- 突变 (Mutation):重组后的候选者随后会受到应用于每个超参数的对数正态乘法因子的扰动(每个参数的概率为 0.5)。突变强度 sigma 在前 300 次迭代中从 0.2 线性衰减到 0.1,因此算法在早期进行广泛探索,并在收敛时进行精细调整。第 1 次迭代没有可用于交叉的父代,而是使用默认训练超参数作为基准。
Link to this section为超参数调优做准备#
在开始调优过程之前,请务必:
- 确定指标:确定你将用于评估模型性能的指标。这可以是 AP50、F1-score 或其他指标。
- 设定调优预算:明确你愿意分配多少计算资源。超参数调优可能非常耗费计算资源。
Link to this section涉及的步骤#
Link to this section初始化超参数#
从一组合理的初始超参数开始。这可以是 Ultralytics YOLO 设置的默认超参数,也可以是基于你的领域知识或先前实验得出的设置。
Link to this section突变超参数#
使用 _mutate 方法基于现有超参数集生成新的一组超参数。Tuner 类会自动处理此过程。
Link to this section训练模型#
使用突变后的超参数集进行训练。然后使用你选择的指标评估训练性能。
Link to this section评估模型#
使用 AP50、F1-score 或自定义指标等来评估模型性能。评估过程有助于确定当前的超参数是否优于之前的设置。
Link to this section记录结果#
记录性能指标和相应的超参数以供将来参考至关重要。Ultralytics YOLO 会自动以 NDJSON 格式保存这些结果。
Link to this section重复#
重复该过程,直到达到设定的迭代次数或满足性能指标要求为止。每次迭代都建立在从先前运行中获得的知识基础上。
Link to this section迭代次数和种群大小#
使用内置调优器 (use_ray=False) 时,iterations 控制序列试验的总数。每次试验使用一个超参数配置训练一个模型——例如,iterations=40 配合 epochs=50 将调度 40 次独立的 50 周期训练运行,而不是一次包含 40 个候选群体的 50 周期运行。
内置的遗传算法没有显式的种群大小参数。一旦存在之前的试验,它就会采样最多九个最高适应度的配置作为父代,应用 BLX-α 交叉和突变,并在每次迭代中产生一个候选者。
对于并行试验或更高级的搜索策略,请设置 use_ray=True 以使用 Ray Tune,它将 iterations 作为 num_samples 接收。详情请参阅 Ray Tune 集成指南。
Link to this section默认搜索空间说明#
下表列出了 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) | 线性学习率预热的周期数。有助于防止训练初期的不稳定 |
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 (分布焦点损失) 权重。较高的值强调精确的边界框定位 |
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) | 使用马赛克 (Mosaic) 增强(组合 4 张图像)的概率。对于小物体检测特别有用 |
mixup | float | (0.0, 1.0) | 使用混合 (MixUp) 增强(混合两张图像)的概率。可以提高模型鲁棒性 |
cutmix | float | (0.0, 1.0) | 使用切片混合 (CutMix) 增强的概率。在保持局部特征的同时组合图像区域 |
copy_paste | float | (0.0, 1.0) | 使用复制粘贴 (Copy-paste) 增强的概率。有助于提高实例分割性能 |
close_mosaic | float | (0.0, 10.0) | 在最后 N 个周期内禁用马赛克增强,以在完成前稳定训练 |
Link to this section自定义搜索空间示例#
以下是如何定义搜索空间并使用 model.tune() 方法调用 Tuner 类,对 COCO8 上的 YOLO26n 进行 30 个周期的超参数调优。我们使用 AdamW 优化器,并跳过绘图、检查点保存和最终周期之外的验证,以实现更快的调优。
此示例仅供演示使用。从简短或小规模调优运行中获得的超参数很少是实际训练的最佳选择。在实践中,调优应在与全面训练相似的设置下执行——包括可比的数据集、周期和增强——以确保结果可靠且可迁移。快速调优可能会使参数偏向于更快的收敛或短期的验证收益,而这些并不能泛化。
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,
)Link to this section恢复中断的超参数调优会话#
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)Link to this section结果#
成功完成超参数调优过程后,你将获得几个概括调优结果的文件和目录。以下是对每个文件的描述:
Link to this section文件结构#
结果的目录结构如下所示。像 train1/ 这样的训练目录包含单个调优迭代,即使用一组超参数训练的一个模型。tune/ 目录包含来自所有单个模型训练的调优结果:
runs/
└── detect/
├── train1/
├── train2/
├── ...
└── tune/
├── best_hyperparameters.yaml
├── tune_fitness.png
├── tune_results.ndjson
├── tune_scatter_plots.png
└── weights/
├── last.pt
└── best.ptLink to this section文件描述#
Link to this sectionbest_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
Link to this sectiontune_fitness.png#
这是一个显示适应度随迭代次数变化的图表。它可以帮助你可视化遗传算法随时间的表现。
- 格式:PNG
- 用途:性能可视化
该图包含:
- 每个数据集每次迭代一个标记,因此单数据集运行显示每次迭代一个点,多数据集运行显示每个数据集每次迭代一个点。
- 一条虚线的“平滑均值”线,计算为对每次迭代的最高级适应度值进行高斯平滑 (
sigma=3) 的结果。
Link to this sectiontune_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 路径是绝对路径;上面为了可读性进行了缩写。
Link to this sectiontune_scatter_plots.png#
此文件包含从 tune_results.ndjson 生成的散点图,有助于你可视化不同超参数与性能指标之间的关系。默认值为 0 的超参数(例如下方的 degrees 和 shear)可能只会从初始种子值缓慢演化,因为乘法变异因子在接近零的值附近几乎没有扩展空间。
- 格式:PNG
- 用途:探索性数据分析
Link to this sectionweights/#
此目录包含超参数调优过程中最后一次迭代和最佳迭代所保存的 PyTorch 模型。
last.pt:last.pt 是训练最后一个 epoch 的权重。best.pt:best.pt 是在训练中获得最佳适应度分数的迭代权重。
利用这些结果,你可以为未来的模型训练和分析做出更明智的决策。请随时查阅这些产出物,以了解模型的表现如何以及如何进一步改进。
Link to this section结论#
Ultralytics YOLO 中的超参数调优过程既简单又强大,这归功于其基于遗传算法的方法,该方法结合了 BLX-α 交叉和对数正态变异。按照本指南中概述的步骤,将有助于你系统地调优模型以获得更好的性能。
Link to this section延伸阅读#
如需深入了解,你可以查阅 Tuner 类 源代码及相关文档。如果你有任何问题、功能请求或需要进一步帮助,请随时通过 GitHub 或 Discord 与我们联系。
Link to this section常见问题解答#
Link to this section如何在超参数调优期间为 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 配置页面。
Link to this section在 YOLO26 中使用遗传算法进行超参数调优有什么好处?#
Ultralytics YOLO26 中的遗传算法为探索超参数空间提供了一种稳健的方法,从而实现高度优化的模型性能。主要好处包括:
- 高效搜索:BLX-α 交叉结合了来自适应度最高父代的基因,而对数正态变异则扰动结果以发现新的候选者。
- 避免局部最优:通过引入随机性,它们有助于避免局部最优,从而确保更好的全局优化。
- 性能指标:它们根据特定任务的适应度分数(检测任务为 mAP50-95)进行自适应调整。
要了解遗传算法如何优化超参数,请查看 超参数演化指南。
Link to this sectionUltralytics YOLO 的超参数调优过程需要多长时间?#
Ultralytics YOLO 的超参数调优所需时间在很大程度上取决于数据集大小、模型架构复杂度、迭代次数以及可用的计算资源等多个因素。例如,在 COCO8 等数据集上对 YOLO26n 进行 30 个 epoch 的调优,根据硬件的不同,可能需要几小时到几天的时间。
为了有效地管理调优时间,请提前定义明确的调优预算(内部章节链接)。这有助于平衡资源分配和优化目标。
Link to this section在 YOLO 的超参数调优过程中,我应该使用哪些指标来评估模型性能?#
在 YOLO 的超参数调优过程中评估模型性能时,你可以使用以下几个关键指标:
- AP50:IoU 阈值为 0.50 时的平均精度。
- F1-Score:精度和召回率的调和平均值。
- 精度和召回率:分别表示模型在识别真阳性与假阳性及假阴性方面的 准确性 指标。
这些指标有助于你了解模型性能的各个方面。请参阅 Ultralytics YOLO 性能指标 指南以获取全面概述。
Link to this section我可以使用 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.