Ultralytics YOLO ハイパーパラメーター調整ガイド#
Ultralytics YOLOのハイパーパラメータチューニングは、学習率、損失の重み、拡張の強度などの設定を最適化し、精度、適合率、再現率などの機械学習モデルの性能指標を最大化する、自動化された反復型の探索です。これらの値を手作業で試す代わりに、Ultralytics YOLOは遺伝的アルゴリズムを用いてハイパーパラメータ空間を探索し、多数の短い学習実行を通じて候補設定を変異・評価します。
視聴: モデルの性能を高めるハイパーパラメーター調整方法 🚀
ハイパーパラメータとは何ですか?#
ハイパーパラメータは、アルゴリズムの高レベルな構造設定です。学習フェーズの前に設定し、学習中は固定されます。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は各fitエポック後に指標を報告し、猶予期間が過ぎるとASHAが成績の低い試行を停止できるようにします。
反復回数と母集団サイズ#
組み込みチューナー(use_ray=False)では、iterationsが逐次試行の合計回数を制御し、デフォルトは300です。各試行では、1つのハイパーパラメータ設定で1つのモデルを学習します。たとえば、iterations=40とepochs=50を使用すると、40個の独立した50エポックの学習実行がスケジュールされます。候補を40個別々に用意して1つのモデルを50エポック学習するわけではありません。
組み込みの遺伝的アルゴリズムには、明示的な母集団サイズのパラメータはありません。過去の試行結果が存在する場合、適合度の高い最大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を使用しない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エポックではモザイクを無効にします。float値として変異させた後、整数のエポック数に丸めます。 |
カスタム探索空間の例#
探索空間を定義し、model.tune()メソッドを使用して、Tunerクラスによるハイパーパラメータチューニングを行う方法を示します。この例では、YOLO26nをCOCO8で30エポック学習し、AdamWオプティマイザーを使用します。また、チューニングを高速化するため、最終エポック以外のプロット、チェックポイント保存、検証を省略します。
この例はデモンストレーションのみを目的としています。短時間または小規模なチューニング実行で得たハイパーパラメータが、実際の学習に最適であることはほとんどありません。信頼性が高く、他の条件にも適用できる結果を得るには、実際には、データセット、エポック数、データ拡張などを本番の学習に近い条件にしてチューニングしてください。短時間のチューニングでは、汎化しない高速収束や短期的な検証性能の向上にパラメータが偏る場合があります。
from ultralytics import YOLO
# YOLOモデルを初期化
model = YOLO("yolo26n.pt")
# 探索空間を定義
search_space = {
"lr0": (1e-5, 1e-2),
"degrees": (0.0, 45.0),
}
# COCO8で30エポックのハイパーパラメータをチューニング
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
# YOLOモデルを定義
model = YOLO("yolo26n.pt")
# 探索空間を定義
search_space = {
"lr0": (1e-5, 1e-2),
"degrees": (0.0, 45.0),
}
# 前回の実行を再開
results = model.tune(data="coco8.yaml", epochs=50, iterations=300, space=search_space, resume=True)
# 名前'tune_exp'でチューニング実行を再開
results = model.tune(data="coco8.yaml", epochs=50, iterations=300, space=search_space, name="tune_exp", resume=True)結果#
ハイパーパラメータチューニングが正常に完了すると、チューニング結果をまとめた複数のファイルとディレクトリが作成されます。それぞれについて、以下で説明します。
ファイル構成#
結果のディレクトリ構成は次のとおりです。multitrain/やmultitrain-2/などのスイープディレクトリには、個々のチューニング反復が保存されます。各反復では、1つのデータセットに対し、1組のハイパーパラメータで1つのモデルを学習し、データセット名のサブディレクトリに格納します。ストレージを節約するため、チューナーは現在の最良結果ではない反復のデータセットごとの実行ディレクトリを削除します。tune/ディレクトリには、個々のモデル学習のチューニング結果がすべて含まれます。
runs/
└── detect/
├── multitrain/
│ └── coco8/
├── multitrain-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点、複数データセットの実行ではデータセットごと、反復ごとに1点が表示されます。
- 点線の「平滑化平均」線。反復ごとの最上位の適合度値に対してガウス平滑化(
sigma=3)を適用して算出されます。
tune_results.ndjson#
各チューニング反復の詳細な結果を含むNDJSONファイルです。各行には、集約適合度、チューニングされたハイパーパラメータ、データセットごとの指標を含むJSONオブジェクトが1つ記録されます。単一データセットと複数データセットのチューニングでは、同じファイル形式を使用します。
- 形式: 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/multitrain/coco8",
"coco8-grayscale": "runs/detect/multitrain/coco8-grayscale"
}
}トップレベルのfitnessは、データセットごとのfitness値の算術平均です。単一データセットのチューニングでは、datasets辞書にエントリが1つ含まれ、そのfitnessはトップレベルのfitnessと一致します。完了した反復ごとにJSONオブジェクトが1つ記録されます。実際のsave_dirsのパスは絶対パスですが、読みやすさのため、上記では省略しています。
tune_scatter_plots.png#
このファイルには、tune_results.ndjsonから生成された散布図が含まれており、さまざまなハイパーパラメータと性能指標の関係を視覚的に確認できます。変異では各ハイパーパラメータに設定された範囲を使用するため、degreesやshearのようにデフォルト値が0の値も変化します。
- 形式: PNG
- 用途: 探索的データ分析
weights/#
このディレクトリには、チューニング実行で適合度が最も高かった反復から保存されたPyTorchモデルが含まれます。両方のファイルは同じ反復から生成されています。
last.pt: last.ptは、学習の最終エポック時点の重みです。best.pt: best.ptは、最も高い適合度スコアを達成した反復の重みです。
これらの結果を活用すると、今後のモデル学習や分析において、より適切な判断ができます。
結論#
Ultralytics YOLOのハイパーパラメータチューニングは、簡単に開始できる一方で、内部では適応度に基づく選択と範囲正規化された突然変異を遺伝的アルゴリズムで活用する強力な仕組みです。このガイドで説明するループに従うと、モデルを体系的にチューニングして性能を向上させ、その結果得られたbest_hyperparameters.yamlを再利用して今後のトレーニングを初期化できます。並列試行や高度な探索アルゴリズムを使ってチューニングを拡張するには、Ray Tune統合ガイドをご覧ください。または、クラウドトレーニングを通じてUltralytics Platformで、設定可能なハイパーパラメータとリアルタイムのメトリクス追跡を備えたマネージドジョブを実行できます。
レイヤーごとの学習率やカスタム適応度メトリクスなど、引数で指定できない設定には、代わりにトレーナーをサブクラス化してください。さらに詳しく知るには、Tunerクラスのソースコードをご覧ください。ご質問や機能リクエストがある場合は、GitHubまたはDiscordでお問い合わせください。
よくある質問#
lr0パラメーターで初期値を設定します。一般的な値は0.001から0.01の範囲です。その後、チューニングによって値を変化させ、最適値を見つけます。model.tune()メソッドを使って自動化できます。例:例from ultralytics import YOLO # YOLOモデルを初期化 model = YOLO("yolo26n.pt") # COCO8で30エポックのハイパーパラメータをチューニング 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統合ガイドをご覧ください。