机器学习最佳实践与模型训练技巧#
简介#
处理计算机视觉项目时,最重要的步骤之一就是模型训练。在进入这一步之前,你需要明确目标,并收集和标注数据。对数据进行预处理,确保其干净且一致后,就可以开始训练模型了。
模型训练是教会模型识别视觉模式并根据数据进行预测的过程,它直接影响应用的准确率。本指南将介绍最佳实践、优化技术和故障排除技巧,帮助你有效训练计算机视觉模型。
Watch: Model Training Tips | How to Handle Large Datasets | Batch Size, GPU Utilization and Mixed Precision
如何训练机器学习模型#
计算机视觉模型通过调整内部参数来最小化误差。首先,模型会接收大量带标签的图像。它会预测图像中的内容,然后将预测结果与实际标签或内容进行比较,以计算误差。这些误差反映了模型预测值与真实值之间的偏差。
在训练过程中,模型会反复进行预测、计算误差,并通过称为反向传播的过程更新参数。在此过程中,模型会调整内部参数(权重和偏置)以减少误差。重复这一循环多次后,模型的准确率会逐渐提升。随着时间推移,它会学会识别形状、颜色和纹理等复杂模式。
这一学习过程使计算机视觉模型能够执行各种任务,包括目标检测、实例分割、语义分割和图像分类。最终目标是创建一个能够将所学知识泛化到新的、未见过的图像上的模型,使其可以在真实应用中准确理解视觉数据。
现在我们已经了解了训练模型时幕后发生的过程,接下来看看训练模型时需要考虑的要点。
在大型数据集上训练#
计划使用大型数据集训练模型时,需要考虑几个不同方面。例如,你可以调整批次大小、控制 GPU 利用率、选择多尺度训练等。下面我们将详细介绍这些选项。
批次大小和 GPU 利用率#
在大型数据集上训练模型时,高效利用 GPU 至关重要。批次大小是一个重要因素,它表示机器学习模型在单次训练迭代中处理的数据样本数量。 使用 GPU 支持的最大批次大小,可以充分发挥其性能并缩短模型训练时间。不过,你需要避免 GPU 内存耗尽。如果遇到内存错误,请逐步减小批次大小,直到模型能够顺利训练。
Watch: How to Use Batch Inference with Ultralytics YOLO26 | Speed Up Object Detection in Python 🎉
对于 YOLO26,你可以在训练模式参数中设置 batch 参数,使其匹配 GPU 容量。在单个加速器上,batch=-1 会分析模型,并选择目标内存利用率约为 60% 的批次大小;类似 batch=0.70 的分数值则会针对不同的内存占比。多 GPU 运行需要显式指定全局批次大小,并且该值必须是设备数量的倍数。在 CPU 和 Apple silicon 上,AutoBatch 会发出警告并回退到 batch=16。
子集训练#
子集训练是一种实用策略,指使用能够代表大型数据集的较小数据集来训练模型。它可以节省时间和资源,尤其适用于模型开发和测试的初期阶段。如果时间紧张,或正在尝试不同的模型配置,子集训练是一个不错的选择。
对于 YOLO26,你可以通过 fraction 参数轻松实现子集训练。使用 fraction=0.1 这样的比例可以选取 10% 的训练数据,使用 fraction=300 这样的整数可以精确选取 300 张训练图像,或者使用 [train, val, test] 列表(例如 fraction=[300, 100, 0])来限制每个数据划分并跳过测试图像。使用 [300, 100] 这样的双元素列表会保留完整的测试划分。NDJSON 数据集会在下载前选择间隔均匀的记录,因此重复运行时会复用完全相同的子集。这项技术支持在使用完整数据集之前进行快速迭代和调优。
多尺度训练#
多尺度训练是一种通过使用不同尺寸的图像训练模型来提升其泛化能力的技术。模型可以学会检测不同尺度和距离下的目标,从而变得更加稳健。
例如,训练 YOLO26 时,你可以通过设置 scale 参数启用尺度增强。该参数会按照指定因子调整训练图像的大小,以模拟不同距离下的目标。例如,将 scale=0.5 设置为某个值时,训练过程中会以 0.5 到 1.5 之间的因子随机缩放训练图像。配置此参数后,模型可以接触各种图像尺度,从而提升其在不同目标尺寸和场景下的检测能力。
Ultralytics 还支持通过 multi_scale 参数进行基于图像尺寸的多尺度训练。与会缩放图像并将其填充或裁剪回 imgsz 的 scale 不同,multi_scale 会在每个批次中直接改变 imgsz(并根据模型步幅进行取整)。例如,使用 imgsz=640 和 multi_scale=0.25 时,训练尺寸会按照步幅从 480 采样到 800(例如 480、512、544、……、800),而 multi_scale=0.0 会保持固定尺寸。
缓存#
缓存是提升机器学习模型训练效率的重要技术。将预处理后的图像存储在内存中,可以减少 GPU 等待从磁盘加载数据的时间。这样,模型就能持续接收数据,不会受到磁盘 I/O 操作造成的延迟影响。
使用 cache 参数训练 YOLO26 时,可以控制缓存:
cache=True:将数据集图像存储在 RAM 中,访问速度最快,但会增加内存使用量。cache='disk':将图像存储在磁盘上,速度比 RAM 慢,但比每次重新加载数据更快。cache=False:禁用缓存,完全依赖磁盘 I/O,速度最慢。
混合精度训练#
混合精度训练同时使用 16 位(FP16)和 32 位(FP32)浮点类型。通过使用 FP16 加快计算,并在需要时使用 FP32 保持精度,可以兼顾两者的优势。神经网络的大多数操作都使用 FP16,以获得更快的计算速度并降低内存占用。不过,模型权重的主副本会保留为 FP32,以确保权重更新步骤中的准确性。在相同的硬件限制下,你可以处理更大的模型或使用更大的批次大小。
要实现混合精度训练,你需要修改训练脚本,并确保硬件(例如 GPU)支持该功能。许多现代深度学习框架(例如 PyTorch 和 TensorFlow)都内置了混合精度支持。
使用 YOLO26 时,混合精度训练非常简单:AMP 默认已启用(amp=True)。在 CUDA GPU 上,YOLO 会在训练开始时执行一次能力检查;如果检查失败,则回退到完整 FP32。在 CPU 和 Apple silicon 上,AMP 会完全跳过。将 amp=False 设置为强制使用 FP32。
预训练权重#
使用预训练权重是加快模型训练过程的实用方法。预训练权重来自已经在大型数据集上训练过的模型,可以让你的模型站在更高的起点上。迁移学习会将预训练模型适配到新的相关任务。对预训练模型进行微调时,首先使用这些权重,然后继续在你的特定数据集上训练。这种训练方法可以缩短训练时间,并且通常能带来更好的性能,因为模型一开始就已经掌握了基本特征。
预训练权重来自 model 参数,因此 model=yolo26n.pt 已经从 COCO 权重开始训练。pretrained 参数控制是否保留这些权重(True,默认值)、丢弃这些权重(False),或替换为其他检查点(pretrained=path/to/best.pt)。在 *.yaml 模型上设置 pretrained=True 不会自动获取权重。完整的迁移学习流程请参阅如何在自定义数据集上微调 YOLO。
处理大型数据集时可考虑的其他技术#
处理大型数据集时,还可以考虑以下几种技术:
- 学习率调度器:实现学习率调度器可以在训练过程中动态调整学习率。经过良好调优的学习率可以防止模型越过极小值,并提高稳定性。训练 YOLO26 时,
lrf参数通过将最终学习率设置为初始学习率的一定比例来管理学习率调度。对于参数未提供的功能(例如逐层学习率或梯度裁剪),请继承训练器。 - 分布式训练:处理大型数据集时,分布式训练可能带来显著提升。通过将训练负载分布到多个 GPU 或机器上,可以缩短训练时间。这种方法对于拥有大量计算资源的企业级项目尤其有价值。
- Channels-last 内存格式:在 PyTorch 1.11 及更新版本中,CUDA 训练会自动使用更快的 NHWC 内存布局,但在 Windows 上测得其速度较慢除外。设置
channels_last=True来强制使用该内存格式,或者设置channels_last=False来保持 NCHW 内存格式;PyTorch 1.10 及更旧版本、CPU 和 MPS 默认仍为 NCHW 内存格式。
训练所需的周期数#
训练模型时,周期(epoch)是指完整遍历整个训练数据集一次。在一个周期内,模型会处理训练集中的每个样本一次,并根据学习算法更新参数。通常需要多个周期,让模型随着时间推移学习并优化参数。
一个常见问题是如何确定模型需要训练多少个周期。一个不错的起点是 300 个周期。如果模型较早出现过拟合,可以减少周期数。如果训练 300 个周期后仍未出现过拟合,可以将训练延长到 600、1200 个或更多周期。
不过,理想的周期数会因数据集大小和项目目标而异。较大的数据集可能需要更多周期才能让模型有效学习,而较小的数据集可能需要更少周期,以避免过拟合。对于 YOLO26,你可以在训练脚本中设置 epochs 参数。
提前停止#
提前停止是优化模型训练的有效技术。通过监控验证集性能,你可以在模型不再改进时停止训练,从而节省计算资源并防止过拟合。
这一过程需要设置 patience 参数,用于确定在停止训练前等待验证指标改善的周期数。如果模型性能在这些周期内没有提升,训练就会停止,以避免浪费时间和资源。
对于 YOLO26,你可以在训练配置中设置 patience 参数来启用提前停止。例如,patience=5 表示如果验证指标连续 5 个周期没有改善,训练就会停止。使用这种方法可以确保训练过程保持高效,并在不过度计算的情况下获得最佳性能。
选择云端训练还是本地训练#
训练模型有两种选择:云端训练和本地训练。
云端训练具有可扩展性并提供强大的硬件,适合处理大型数据集和复杂模型。Google Cloud、AWS 和 Azure 等平台可以按需提供高性能 GPU 和 TPU,从而加快训练速度,并支持使用更大的模型进行实验。不过,云端训练可能成本高昂,尤其是在长时间运行时;数据传输也会增加成本和延迟。
本地训练提供更强的控制能力和定制空间,可以让你根据具体需求调整环境,并避免持续产生云端费用。对于长期项目而言,本地训练可能更经济;由于数据保留在本地,其安全性也更高。不过,本地硬件可能存在资源限制并需要维护,这可能导致大型模型的训练时间更长。
选择优化器#
优化器是一种调整神经网络权重以最小化损失函数的算法,损失函数用于衡量模型的表现。简单来说,优化器通过调整模型参数来减少误差,帮助模型学习。选择合适的优化器会直接影响模型学习的速度和准确性。
你还可以微调优化器参数来提升模型性能。调整学习率可以设置更新参数时的步长大小。为了保持稳定,你可以从适中的学习率开始,并随着时间逐渐降低,以改善长期学习效果。此外,设置动量可以决定过去的更新对当前更新的影响程度。动量的常用值约为 0.9,通常能够提供良好的平衡。
常用优化器#
不同优化器各有优缺点。下面简单介绍几种常用优化器。
-
SGD(随机梯度下降):
- 使用损失函数相对于参数的梯度来更新模型参数。
- 简单高效,但收敛速度可能较慢,并且可能陷入局部极小值。
-
Adam(自适应矩估计):
- 结合了带动量的 SGD 和 RMSProp 的优点。
- 根据梯度一阶矩和二阶矩的估计值,为每个参数调整学习率。
- 适用于噪声数据和稀疏梯度。
- 效率高,通常需要较少的调参。对于较短的训练运行,YOLO26 的
optimizer=auto会选择密切相关的 AdamW,而不是 Adam 本身。
-
RMSProp(均方根传播):
- 通过将梯度除以近期梯度幅值的运行平均值,为每个参数调整学习率。
- 有助于处理梯度消失问题,并且对循环神经网络有效。
-
MuSGD(Muon + SGD 混合):
- 结合 SGD 风格的更新和受 Muon 启发的行为,以提升大规模训练的稳定性。
- 如果你希望获得类似 SGD 的泛化能力,但需要比原始 SGD 更平滑的收敛,这是一个不错的选择。
- 它尤其适用于 YOLO26 训练方案;如果不确定,可以从
optimizer=auto开始,并在你的数据集上与 MuSGD 进行比较。
对于 YOLO26,optimizer 参数允许你选择多种优化器,包括 SGD、MuSGD、Adam、Adamax、AdamW、NAdam、RAdam 和 RMSProp;你也可以将其设置为 auto,根据训练迭代次数自动选择优化器。
yolo train model=yolo26n.pt data=coco8.yaml optimizer=MuSGD加入社区#
加入计算机视觉爱好者社区可以帮助你解决问题并更快学习。以下是一些联系他人、获取帮助和分享想法的方法。
社区资源#
- GitHub Issues:访问 YOLO26 GitHub 仓库,使用 Issues 选项卡提问、报告错误和建议新功能。社区和维护者都非常活跃,并且随时愿意提供帮助。
- Ultralytics Discord 服务器:加入 Ultralytics Discord 服务器,与其他用户和开发者交流、获取支持并分享经验。
官方文档#
- Ultralytics YOLO26 文档:查看官方 YOLO26 文档,获取有关各种计算机视觉项目的详细指南和实用技巧。
利用这些资源可以帮助你解决挑战,及时了解计算机视觉社区中的最新趋势和实践。
关键要点#
训练计算机视觉模型需要遵循良好实践、优化策略,并解决训练过程中出现的问题。调整批次大小、混合精度训练以及从预训练权重开始等技术,可以让模型表现更好并加快训练速度。子集训练和提前停止等方法可以帮助你节省时间和资源。保持与社区的联系并关注新趋势,将帮助你持续提升模型训练技能。
常见问题#
要提高 GPU 利用率,请将
batch参数设置为 GPU 支持的最大尺寸。在单个加速器上,batch=-1会分析模型,并将目标内存利用率设为约 60%。在 CPU 和 Apple silicon 上,它会回退到batch=16;多 GPU 运行则需要显式指定全局批次大小,并且该值必须是设备数量的倍数。更多信息请参阅训练模式参数。混合精度训练同时使用 16 位(FP16)和 32 位(FP32)浮点类型,以平衡计算速度和精度。在 YOLO26 中,该功能默认通过
amp=True启用;将amp=False设置为强制使用 FP32。在 CPU 和 Apple silicon 上会跳过 AMP。详情请参阅训练模式参数。多尺度训练使用不同尺寸的图像进行训练,使模型能够更好地泛化到不同尺度和距离,从而提升模型性能。YOLO26 为此提供了两个独立参数。
scale=0.5会在 0.5 到 1.5 之间采样缩放因子,然后将图像填充或裁剪回固定的imgsz;multi_scale=0.25则会在每个批次中按照步幅改变imgsz本身。有关设置和更多详情,请查看训练模式文档。使用预训练权重可以利用已经掌握基础视觉特征的模型,大幅加快训练并提升模型准确率。通过
model参数加载预训练权重,例如model=yolo26n.pt;随后,pretrained会决定保留这些权重(True,默认值)、丢弃这些权重(False),或替换为其他检查点(pretrained=path/to/best.pt,用于将权重迁移到model=*.yaml构建版本中)。更多信息请参阅训练模式文档。周期数是指模型训练期间完整遍历训练数据集的次数。典型的起始值是 300 个周期。如果模型较早出现过拟合,可以减少周期数。反之,如果没有观察到过拟合,可以将训练延长到 600、1200 个或更多周期。要在 YOLO26 中进行设置,请在训练脚本中使用
epochs参数。有关确定理想周期数的更多建议,请参阅周期数部分。