Ultralytics YOLO ハイパーパラメータチューニングガイド#
Ultralytics YOLOのハイパーパラメータチューニングは、学習率、損失の重み、データ拡張の強度などの設定を最適化し、精度、適合率、再現率などの機械学習モデルのパフォーマンス指標を最大化する、自動化された反復的な探索です。これらの値を手動でテストするのではなく、Ultralytics YOLOは遺伝的アルゴリズムを使用してハイパーパラメータ空間を探索し、多数の短時間の学習実行で候補設定を変異および評価します。
Watch: How to Tune Hyperparameters for Better Model Performance 🚀
ハイパーパラメータとは何ですか?#
ハイパーパラメータは、アルゴリズムの高レベルで構造的な設定です。学習フェーズの前に設定され、学習中は一定に保たれます。Ultralytics YOLOでよくチューニングされるハイパーパラメータには、次のようなものがあります。
- 学習率
lr0: 損失関数の最小値に向かって進む際に、各反復でのステップサイズを決定します。 - バッチサイズ
batch: フォワードパスで同時に処理される画像の数です。 - エポック数
epochs: エポックは、すべての学習例に対するフォワードパスとバックワードパスを1回完了することです。 - アーキテクチャ固有の項目: チャネル数、レイヤー数、活性化関数の種類などです。これらは学習引数ではなく、モデルYAML設定に記述されます。
この4つのうち、デフォルトの探索空間に含まれるのは学習率だけです。batch、epochs、およびアーキテクチャは固定されたままです。チューナーは、以下に記載されているスケジュール、損失ゲイン、データ拡張も変異させます。
YOLO26で使用されるデータ拡張ハイパーパラメータの完全な一覧については、設定ページを参照してください。
遺伝的進化と変異#
Ultralytics YOLOは、遺伝的アルゴリズムを使用してハイパーパラメータを最適化します。遺伝的アルゴリズムは、自然選択と遺伝の仕組みに着想を得ています。
- 選択: 各反復では、最大9個の適応度が最も高い設定から、適応度に基づいて重み付けされた1つを選択します。30個の結果が得られた後は、全結果の上位20%(最大30個)でもパラメータ共分散を推定し、エリートの証拠が蓄積するにつれて影響が大きくなります。
- 変異: 各反復では、探索範囲に正規化されたガウスステップを使用して、およそ半数のパラメータを変異させます。共分散が有効になると、最大40%の割合で信頼度に基づいて重み付けされた相関ステップを使用し、反射によってステップを範囲内に戻すため、クリップされた値が蓄積されません。改善なしで試行が蓄積すると、25試行にわたってステップサイズが最大20%まで線形に狭まり、新たな最良結果が見つかるとリセットされます。反復1には親がなく、デフォルトの学習ハイパーパラメータをベースラインとして使用します。
ハイパーパラメータチューニングの準備#
チューニングプロセスを開始する前に、次の点を確認することが重要です。
- 指標の特定: 組み込みチューナー(
use_ray=False)は、タスクのfitnessスコアで試行を順位付けします。一方、use_ray=Trueはタスク指標を使用します。AP50やF1スコアなど、確認する二次指標を決定してください。 - チューニング予算の設定: 割り当てる用意のある計算リソースの量を定義します。ハイパーパラメータチューニングは計算負荷が高くなる場合があります。
チューニングループの仕組み#
各反復で、組み込みチューナーは次のループを繰り返します。
- ハイパーパラメータを初期化 — Ultralytics YOLOが設定したデフォルトのハイパーパラメータ、またはドメイン知識や過去の実験に基づく値のいずれかを、妥当なベースラインとして開始します。
- ハイパーパラメータを変異 —
Tunerクラスが、その_mutateメソッドを使用して、既存のセットから新しいハイパーパラメータのセットを自動的に生成します。 - モデルを学習 — 変異させたハイパーパラメータを使用して学習し、選択した指標で学習パフォーマンスを評価します。
- モデルを評価 — 評価プロセスによって反復の適応度スコアが生成され、過去の反復と比較して、現在のハイパーパラメータが改善されているかどうかを判定します。
- 結果をログに記録 — パフォーマンス指標と対応するハイパーパラメータの両方を、今後参照できるように記録します。Ultralytics YOLOは、これらの結果をNDJSON形式で自動的に保存します。
- 繰り返し — 指定した反復回数に達するまで続けます。各反復では、過去の実行から得た知識を活用します。組み込みチューナーはすべての
iterationsを実行します。Ray Tuneは各フィットエポック後に指標を報告するため、ASHAは猶予期間後に性能の低い試行を停止できます。
反復回数と母集団サイズ#
組み込みチューナー(use_ray=False)では、iterationsが連続して実行する試行の総数を制御し、デフォルトは300です。各試行では、1つのハイパーパラメータ設定で1つのモデルを学習します。たとえば、iterations=40とepochs=50を使用すると、1つの50エポックの実行で40個の候補を持つのではなく、独立した50エポックの学習実行を40回スケジュールします。
組み込みの遺伝的アルゴリズムには、明示的な母集団サイズのパラメータはありません。過去の試行が存在すると、適応度が最も高い最大9個の設定から選択し、各反復で1つの候補を変異させます。
並列試行やより高度な探索戦略を使用するには、use_ray=Trueを設定してRay Tuneを使用します。Ray Tuneは同じくデフォルトで300試行を使用し、iterationsをnum_samplesとして受け取ります。詳細については、Ray Tune統合ガイドを参照してください。
デフォルトの探索空間#
次の表は、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-free YOLO26は、このゲインを正規化されたボックス距離に対するL1損失に適用します。値を大きくすると、より正確な位置特定が重視されます |
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) | flipモードではコピーされる対象オブジェクトの割合を、mixupモードではそれを適用する確率も表します |
close_mosaic | int | (0.0, 10.0) | 完了前の学習を安定させるため、最後のNエポックでモザイクを無効にします。浮動小数点数として変異させた後、エポックの整数に丸めます |
カスタム探索空間の例#
探索空間を定義し、model.tune()メソッドを使用してTunerクラスを利用し、COCO8上でYOLO26nをAdamWオプティマイザーにより30エポック、プロット、チェックポイント、最終エポック以外の検証を省略して、チューニングを高速化する方法を示します。
この例はデモンストレーションのみを目的としています。短時間または小規模のチューニング実行から得られたハイパーパラメータが、実環境の学習に最適であることはほとんどありません。実際には、信頼性が高く転用可能な結果を得るため、同等のデータセット、エポック数、データ拡張など、完全な学習に近い設定でチューニングを実行してください。短時間のチューニングでは、パラメータがより速い収束や、汎化しない短期的な検証性能の向上に偏る可能性があります。
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,
)中断されたハイパーパラメータチューニングセッションの再開#
resume=Trueを渡すことで、中断されたハイパーパラメータチューニングセッションを再開できます。必要に応じて、再開に使用するruns/{task}の下で使用されたディレクトリnameを渡すこともできます。nameを指定しない場合、文字通りtuneという名前のディレクトリを再開します。これは直近に実行されたセッションではなくデフォルト名です。そのため、カスタム名で開始した実行にはnameを渡してください。また、以前のすべての学習引数(data、epochs、iterations、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)結果#
ハイパーパラメータチューニングプロセスが正常に完了すると、チューニング結果をまとめた複数のファイルとディレクトリが得られます。それぞれについて、以下で説明します。
ファイル構造#
結果のディレクトリ構造は次のようになります。train/やtrain-2/などの学習ディレクトリには、個々のチューニング反復、つまり1つのハイパーパラメータセットで学習した1つのモデルが含まれます。tune/ディレクトリには、個々のモデル学習のすべてのチューニング結果が含まれます。
runs/
└── detect/
├── train/
├── train-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
- 用途: パフォーマンスの可視化
プロットには次の内容が含まれます。
- データセットごとの各反復に1つのマーカー。そのため、単一データセットの実行では反復ごとに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/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/coco8",
"coco8-grayscale": "runs/detect/coco8-grayscale"
}
}トップレベルのfitnessは、データセットごとのfitness値の算術平均です。単一データセットのチューニングでは、datasets辞書に1つのエントリがあり、そのfitnessはトップレベルのfitnessと等しくなります。完了した反復ごとに1つのJSONオブジェクトが記録されます。実際のsave_dirsパスは絶対パスですが、読みやすさのため上では省略しています。
tune_scatter_plots.png#
このファイルには、tune_results.ndjsonから生成された散布図が含まれており、異なるハイパーパラメータとパフォーマンス指標の関係を視覚化できます。変異では各ハイパーパラメータに設定された範囲を使用するため、degreesやshearなど、ゼロ値のデフォルトから値が変化する可能性があります。
- 形式: PNG
- 用途: 探索的データ分析
weights/#
このディレクトリには、チューニング実行で最も高い適応度を達成した反復から保存されたPyTorchモデルが含まれます。両方のファイルは同じ反復から取得されます。
last.pt: last.ptは学習の最後のエポックの重みです。best.pt: best.ptは、最も高い適応度スコアを達成した反復の重みです。
これらの結果を使用すると、今後のモデル学習や分析について、より多くの情報に基づいた判断を行えます。
まとめ#
Ultralytics YOLOのハイパーパラメータチューニングは、起動が簡単であるだけでなく、遺伝的アルゴリズムにおける適応度に基づく重み付け選択と探索範囲に正規化された変異によって、内部では強力に動作します。このガイドで説明したループに従うことで、モデルを体系的にチューニングしてパフォーマンスを向上させ、得られたbest_hyperparameters.yamlを再利用して今後の学習実行を初期化できます。並列試行やより高度な探索アルゴリズムにチューニングを拡張するには、Ray Tune統合ガイドに進んでください。または、Ultralytics Platformのクラウド学習を介して、設定可能なハイパーパラメータとリアルタイムの指標追跡を使用して管理ジョブを実行できます。
レイヤーごとの学習率やカスタム適応度指標など、どの引数でも公開されていない設定については、代わりにトレーナーをサブクラス化してください。より深い理解を得るには、Tunerクラスのソースコードを確認してください。質問や機能リクエストがある場合は、GitHubまたはDiscordでお問い合わせください。
FAQ#
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設定ページをご確認ください。
Ultralytics YOLO26の遺伝的アルゴリズムは、ハイパーパラメータ空間を探索する堅牢な手法を提供し、モデルのパフォーマンスを高度に最適化できます。主なメリットは次のとおりです。
- 効率的な探索: 適応度に基づく重み付き選択によって優れた設定を維持しながら、範囲を正規化した突然変異によって新しい候補を探索します。
- 局所最適解の回避: ランダム性を導入することで局所最適解を回避し、より優れた大域的最適化を実現します。
- パフォーマンス指標: タスク固有の適応度スコア(検出ではmAP50-95)に基づいて適応します。
遺伝的アルゴリズムでハイパーパラメータを最適化する方法については、ハイパーパラメータ進化ガイドをご確認ください。
Ultralytics YOLOでのハイパーパラメータチューニングに必要な時間は、データセットのサイズ、モデルアーキテクチャの複雑さ、反復回数、利用可能な計算リソースなど、いくつかの要因に大きく左右されます。たとえば、COCO8のようなデータセットでYOLO26nを30エポック調整する場合、ハードウェアによっては数時間から数日かかることがあります。
チューニング時間を効果的に管理するには、ハイパーパラメータチューニングの準備で説明しているように、事前に明確なチューニング予算を設定してください。これにより、リソース配分と最適化の目標のバランスを取ることができます。
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統合ガイドをご確認ください。