Ultralytics YOLO ハイパーパラメータチューニングガイド
はじめに
ハイパーパラメータチューニングは、単なる一度きりの設定ではなく、精度、適合率、再現率といった機械学習モデルのパフォーマンス指標を最適化するための反復プロセスです。Ultralytics YOLOにおいて、これらのハイパーパラメータは、学習率から、層の数や使用する活性化関数の種類といったアーキテクチャの詳細に至るまで多岐にわたります。Ultralytics Platformは、設定可能なハイパーパラメータとリアルタイムの指標追跡機能を備えたクラウド学習にも対応しています。
Watch: How to Tune Hyperparameters for Better Model Performance 🚀
ハイパーパラメータとは何か?
ハイパーパラメータは、アルゴリズムのための高レベルな構造設定です。これらは学習フェーズの前に設定され、学習中には固定されます。Ultralytics YOLOで一般的に調整されるハイパーパラメータを以下に挙げます:
- 学習率
lr0: 損失関数の最小値に向かって移動する際、各反復におけるステップサイズを決定します。 - バッチサイズ
batch: フォワードパスで同時に処理される画像の数です。 - エポック数
epochs: エポックとは、すべての学習例に対する1回の完全なフォワードパスおよびバックワードパスを指します。 - アーキテクチャの詳細: チャンネル数、層の数、活性化関数の種類など。
YOLO26で使用されるデータ拡張ハイパーパラメータの全リストについては、設定ページを参照してください。
遺伝的アルゴリズムと突然変異
Ultralytics YOLOは、ハイパーパラメータを最適化するために遺伝的アルゴリズムを使用します。遺伝的アルゴリズムは、自然淘汰と遺伝のメカニズムから着想を得ています。
- 交叉: 各反復では、これまでに得られた最も適合度の高い最大9個の設定から遺伝子を組み合わせます。その際、適合度で重み付けされた親の選択を行い、BLX-α交叉を使用します。
- 突然変異: 再結合された候補は、各ハイパーパラメータに適用される対数正規乗法因子によって摂動を受けます(パラメータあたり0.5の確率)。突然変異の強さを示すシグマは、最初の300反復で0.2から0.1まで線形に減衰するため、アルゴリズムは初期段階で幅広く探索を行い、収束するにつれて精緻化します。反復1では交叉する親が存在しないため、デフォルトの学習ハイパーパラメータをベースラインとして使用します。
ハイパーパラメータチューニングの準備
チューニングプロセスを開始する前に、以下の点を確認することが重要です:
- 指標の特定: モデルのパフォーマンスを評価するために使用する指標を決定します。これにはAP50、F1スコアなどが含まれます。
- チューニング予算の設定: 割り当てる計算リソースの量を定義します。ハイパーパラメータチューニングは計算負荷が高くなる場合があります。
実行ステップ
ハイパーパラメータの初期化
妥当な初期ハイパーパラメータセットから開始します。これはUltralytics YOLOで設定されたデフォルトのハイパーパラメータであるか、あるいはドメイン知識や過去の実験に基づいたものである可能性があります。
ハイパーパラメータの突然変異
_mutateメソッドを使用して、既存のセットに基づいて新しいハイパーパラメータセットを生成します。Tunerクラスがこのプロセスを自動的に処理します。
モデルの学習
突然変異させたハイパーパラメータセットを使用して学習を実行します。その後、選択した指標を使用して学習パフォーマンスを評価します。
モデルの評価
AP50、F1スコア、またはカスタム指標を使用してモデルのパフォーマンスを評価します。評価プロセスは、現在のハイパーパラメータが以前のものより優れているかどうかを判断するのに役立ちます。
結果のログ記録
将来の参照のために、パフォーマンス指標と対応するハイパーパラメータの両方をログに記録することが重要です。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) | 線形学習率ウォームアップのエポック数。学習初期の不安定さを防ぐのに役立ちます |
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) | 2枚の画像をブレンドするMixUp増強を使用する確率。モデルの堅牢性を向上させることができます |
cutmix | float | (0.0, 1.0) | CutMix増強を使用する確率。ローカルな特徴を維持しながら画像の領域を組み合わせます |
copy_paste | float | (0.0, 1.0) | コピーペースト増強を使用する確率。インスタンスセグメンテーションのパフォーマンス向上を助けます |
close_mosaic | float | (0.0, 10.0) | 完了前の学習を安定させるため、最後のNエポックでモザイクを無効にします |
カスタム探索空間の例
Here's how to define a search space and use the model.tune() method to utilize the Tuner class for hyperparameter tuning of YOLO26n on COCO8 for 30 epochs with an AdamW optimizer and skipping plotting, checkpointing and validation other than on final epoch for faster Tuning.
この例はデモンストレーションのみを目的としています。短時間や小規模なチューニング実行から導き出されたハイパーパラメータは、実際の学習において最適とは言えません。実際には、信頼性が高く転用可能な結果を確保するために、同等のデータセット、エポック、データ拡張を含む、完全な学習に近い設定の下でチューニングを実行する必要があります。短時間のチューニングは、パラメータをより速い収束や短期的な検証ゲインへと偏らせる可能性があり、それらは汎用性が低い場合があります。
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/のような学習ディレクトリには、個々のチューニング反復、つまり1つのハイパーパラメータセットで学習された1つのモデルが含まれます。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
これは、イテレーション回数に対する適応度(fitness)を表示するプロットです。遺伝的アルゴリズムが時間の経過とともにどのように機能したかを可視化するのに役立ちます。
- 形式: PNG
- 用途: パフォーマンスの可視化
このプロットには以下が含まれます:
- イテレーションごとのデータセットごとのマーカー。単一データセットの実行ではイテレーションごとに1つのポイントが表示され、複数データセットの実行ではイテレーションごとにデータセット数分のポイントが表示されます。
- 点線の「平滑化平均」ライン。イテレーションごとのトップレベル適応度値に対してガウス平滑化(
sigma=3)を計算したものです。
tune_results.ndjson
各チューニングイテレーションの詳細な結果を含むNDJSONファイルです。各行は、集計された適応度、調整されたハイパーパラメータ、およびデータセットごとのメトリクスを含む1つのJSONオブジェクトです。単一データセットと複数データセットのチューニングでは、同じファイル形式が使用されます。
- 形式: NDJSON
- 用途: イテレーションごとの結果追跡
- 例:
読みやすさを向上させるため、整形された例を以下に示します。実際の.ndjsonファイルでは、各オブジェクトは1行に保存されます。
{
"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辞書にはエントリが1つだけあり、そのfitnessはトップレベルのfitnessと等しくなります。イテレーションが完了するごとに1つのJSONオブジェクトが記録されます。実際のsave_dirsパスは絶対パスですが、上記では読みやすさのために省略されています。
tune_scatter_plots.png
このファイルには、tune_results.ndjsonから生成された散布図が含まれており、さまざまなハイパーパラメータとパフォーマンスメトリクスの関係を可視化するのに役立ちます。デフォルト値が0のハイパーパラメータ(以下のdegreesやshearなど)は、乗法的な突然変異係数がゼロに近い値から拡張するための幅がほとんどないため、初期シードからゆっくりとしか進化しない場合があります。
- 形式: PNG
- 用途: 探索的データ分析
weights/
このディレクトリには、ハイパーパラメータチューニングプロセス中の最後および最良のイテレーションで保存されたPyTorchモデルが含まれています。
last.pt: last.ptは、トレーニングの最終エポックの重みです。best.pt: best.ptは、最良の適応度スコアを達成したイテレーションの重みです。
これらの結果を使用することで、将来のモデルトレーニングや分析において、より情報に基づいた意思決定が可能になります。これらのアーティファクトを参照して、モデルがどの程度機能したか、またどのようにさらに改善できるかを理解してください。
結論
Ultralytics YOLOのハイパーパラメータチューニングプロセスは、BLX-αクロスオーバーと対数正規分布の突然変異を組み合わせた遺伝的アルゴリズムベースのアプローチにより、シンプルかつ強力なものになっています。このガイドで概説されている手順に従うことで、モデルを体系的に調整し、パフォーマンスを向上させることができます。
さらに詳しく
詳細については、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エポックチューニングする場合、ハードウェアにもよりますが、数時間から数日かかることがあります。
チューニング時間を効率的に管理するために、事前に明確なチューニング予算を定義してください(内部セクションリンク)。これは、リソースの割り当てと最適化の目標のバランスをとるのに役立ちます。
YOLOでハイパーパラメータチューニングを行う際、モデルのパフォーマンスを評価するにはどのメトリクスを使用すべきですか?
YOLOのハイパーパラメータチューニング中にモデルのパフォーマンスを評価する際は、いくつかの重要なメトリクスを使用できます。
- AP50: IoU閾値0.50における平均精度。
- F1-Score: 精度と再現率の調和平均。
- 精度と再現率: 真陽性と偽陽性、偽陰性を識別する際のモデルの精度を示す個別のメトリクス。
これらのメトリクスは、モデルのパフォーマンスのさまざまな側面を理解するのに役立ちます。包括的な概要については、Ultralytics YOLOパフォーマンスメトリクスガイドを参照してください。
YOLO26の高度なハイパーパラメータ最適化にRay Tuneを使用できますか?
はい、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.