機械学習のベストプラクティスとモデルトレーニングのヒント#
はじめに#
コンピュータビジョンプロジェクトに取り組む際、最も重要なステップの1つがモデルのトレーニングです。このステップに到達する前に、目標を定義し、データの収集とアノテーションを行う必要があります。データを前処理してクリーンで一貫性のある状態にしたら、モデルのトレーニングに進むことができます。
モデルのトレーニングは、視覚的なパターンを認識してデータから予測を行う方法をモデルに教えるプロセスであり、アプリケーションの精度を直接左右します。このガイドでは、コンピュータビジョンモデルを効果的にトレーニングするためのベストプラクティス、最適化手法、およびトラブルシューティングのヒントについて説明します。
Watch: Model Training Tips | How to Handle Large Datasets | Batch Size, GPU Utilization and Mixed Precision
機械学習モデルのトレーニング方法#
コンピュータビジョンモデルは、誤差を最小化するように内部パラメータを調整することでトレーニングされます。まず、ラベル付けされた画像の大きなセットがモデルに入力されます。モデルは画像の内容を予測し、その予測と実際のラベルや内容を比較して誤差を計算します。これらの誤差は、モデルの予測が真の値からどれだけ離れているかを示します。
トレーニング中、モデルは予測の作成、誤差の計算、そして逆伝播と呼ばれるプロセスを通じたパラメータの更新を反復的に行います。このプロセスにおいて、モデルは誤差を減らすために内部パラメータ(重みとバイアス)を調整します。このサイクルを何度も繰り返すことで、モデルは徐々に精度を向上させます。時間が経つにつれて、形状、色、テクスチャなどの複雑なパターンを認識できるようになります。
この学習プロセスにより、computer visionモデルは、object detection、instance segmentation、semantic segmentation、image classificationなどのさまざまなtasksを実行できるようになります。最終的な目標は、モデルが新しい未見の画像に対して学習内容を汎化し、現実世界のアプリケーションで視覚データを正確に理解できるようにすることです。
モデルをトレーニングする際に背後で何が起こっているかが理解できたところで、トレーニング時に考慮すべき点を見ていきましょう。
大規模データセットでのトレーニング#
大規模データセットを使用してモデルをトレーニングする計画を立てる際には、いくつかの異なる側面を考慮する必要があります。例えば、バッチサイズの調整、GPU使用率の制御、マルチスケールトレーニングの使用の選択などが挙げられます。これらの各オプションについて詳しく説明します。
バッチサイズとGPU使用率#
大規模データセットでモデルをトレーニングする場合、GPUを効率的に活用することが鍵となります。バッチサイズは重要な要素です。これは、機械学習モデルが単一のトレーニング反復で処理するデータサンプル数です。GPUがサポートする最大バッチサイズを使用することで、その機能を最大限に活用し、モデルトレーニングにかかる時間を短縮できます。ただし、GPUメモリ不足は避ける必要があります。メモリエラーが発生した場合は、モデルがスムーズにトレーニングできるようになるまでバッチサイズを段階的に減らしてください。
Watch: How to Use Batch Inference with Ultralytics YOLO26 | Speed Up Object Detection in Python 🎉
YOLO26 に関しては、Train mode arguments 内の batch パラメータを設定して GPU の容量に合わせることができます。単一のアクセラレータでは、batch=-1 がモデルのプロファイリングを行い、メモリ使用率が約 60% になるようなバッチサイズを選択します。batch=0.70 のような端数は異なる割合をターゲットにします。マルチ GPU の実行では、デバイス数の倍数である明示的なグローバルバッチサイズが必要です。CPU および Apple silicon では、AutoBatch は警告を表示し、batch=16 にフォールバックします。
サブセットトレーニング#
サブセットトレーニングは、より大きなデータセットを代表する小さなデータセットでモデルをトレーニングする賢い戦略です。特に初期のモデル開発やテストの段階で、時間とリソースを節約できます。時間が不足している場合や、さまざまなモデル構成を試している場合に、サブセットトレーニングは良い選択肢です。
YOLO26 に関しては、fraction パラメータを使用してサブセットトレーニングを簡単に実装できます。トレーニングデータの 10% には fraction=0.1 などの比率を、正確に 300 枚のトレーニング画像には fraction=300 などの整数を、各スプリットを制限してテスト画像をスキップするには fraction=[300, 100, 0] などの [train, val, test] リストを使用します。[300, 100] のような 2 項目のリストでは、テストスプリットがそのまま残ります。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操作による遅延なしに、継続的にデータを受け取ることができます。
YOLO26のトレーニング時のキャッシングは、 cache パラメータを使用して制御できます。
cache=True: データセットの画像をRAMに保存し、最速のアクセス速度を提供しますが、メモリ使用量が増加するというデメリットがあります。cache='disk': 画像をディスクに保存します。RAMよりも遅くなりますが、毎回新しいデータをロードするよりも高速です。cache=False: キャッシングを無効にし、完全にディスクI/Oに依存します。最も遅いオプションです。
混合精度トレーニング#
混合精度トレーニングでは、16ビット(FP16)と32ビット(FP32)の両方の浮動小数点型を使用します。計算速度を上げるためにFP16を使用し、必要なところで精度を維持するためにFP32を使用することで、FP16とFP32の両方の長所が活かされます。ニューラルネットワークの操作のほとんどはFP16で行われ、計算の高速化とメモリ使用量の削減の恩恵を受けます。ただし、重みの更新ステップ中の精度を確保するため、モデルの重みのマスターコピーはFP32で保持されます。同じハードウェアの制約内で、より大きなモデルやより大きなバッチサイズを処理できるようになります。
混合精度トレーニングを実装するには、トレーニングスクリプトを変更し、ハードウェア(GPUなど)がそれをサポートしていることを確認する必要があります。PyTorchやTensorFlowなどの多くの最新のdeep learningフレームワークは、混合精度の組み込みサポートを提供しています。
YOLO26 を使用する場合、混合精度トレーニングは簡単です。AMP はデフォルトですでにオンになっています (amp=True)。CUDA GPU では、YOLO はトレーニング開始時に 1 回限りの機能チェックを実行し、失敗した場合は完全な FP32 にフォールバックします。CPU および Apple silicon では、AMP は完全にスキップされます。FP32 を強制するには、amp=False を設定してください。
事前学習済みウェイト#
事前学習済みの重みを使用することは、モデルのトレーニングプロセスをスピードアップするための賢い方法です。事前学習済みの重みは、大規模なデータセットで既にトレーニングされたモデルから取得されるため、モデルに有利なスタートを切ることができます。転移学習は、事前学習済みモデルを新しい関連タスクに適応させます。事前学習済みモデルのファインチューニングには、これらの重みから開始し、特定のデータセットでトレーニングを継続することが含まれます。モデルが基本機能の確かな理解から始まるため、このトレーニング方法により、トレーニング時間が短縮され、多くの場合パフォーマンスが向上します。
事前学習済み重みは model 引数から取得されるため、model=yolo26n.pt はすでに COCO 重みから開始されます。pretrained パラメータは、それらの重みを保持するか (True、デフォルト)、破棄するか (False)、または別のチェックポイントに置き換えるか (pretrained=path/to/best.pt) を制御します。*.yaml モデルで pretrained=True を設定しても、それ単体では重みがフェッチされません。完全な転移学習ワークフローについては、How to Fine-Tune YOLO on a Custom Dataset を参照してください。
大規模データセットを扱う際に考慮すべきその他の手法#
大規模データセットを扱う際に考慮すべき他の手法がいくつかあります。
- Learning Rate スケジューラ: 学習率スケジューラを実装すると、トレーニング中に学習率が動的に調整されます。適切に調整された学習率は、モデルが最小値を行き過ぎるのを防ぎ、安定性を向上させることができます。YOLO26 をトレーニングする場合、
lrfパラメータは、初期学習率の割合として最終学習率を設定することにより、学習率のスケジューリングを管理するのに役立ちます。レイヤーごとの学習率や勾配クリッピングなど、どの引数も公開していない動作については、トレーナーをサブクラス化してください。 - 分散トレーニング: 大規模データセットを扱う場合、分散トレーニングは状況を一変させる可能性があります。トレーニング負荷を複数のGPUやマシンに分散させることで、トレーニング時間を短縮できます。このアプローチは、膨大な計算リソースを必要とするエンタープライズ規模のプロジェクトで特に価値があります。
- Channels-last メモリ形式:
channels_last=Trueは CUDA上で NHWC メモリレイアウトを使用するため、互換性のあるハードウェアで畳み込みのパフォーマンスを向上させることができます。その他のデバイスでは警告が表示され、デフォルトのレイアウトが維持されます。
トレーニングするエポック数#
モデルをトレーニングする際、エポックとは、トレーニングデータセット全体を通した1回の完全なパスを指します。エポック中、モデルはトレーニングセット内の各例を1回処理し、学習アルゴリズムに基づいてパラメータを更新します。モデルが時間をかけて学習し、パラメータを洗練させるためには、通常、複数のエポックが必要です。
よくある質問として、モデルをトレーニングするエポック数をどのように決定するかというものがあります。良い出発点は300エポックです。モデルが早期に過学習する場合は、エポック数を減らすことができます。300エポック経過しても過学習が発生しない場合は、トレーニングを600、1200、またはそれ以上のエポックに拡張できます。
ただし、理想的なエポック数は、データセットのサイズやプロジェクトの目標によって異なる場合があります。データセットが大きい場合はモデルが効果的に学習するためにより多くのエポックが必要になる場合があり、データセットが小さい場合は過学習を避けるためにより少ないエポックが必要になる場合があります。YOLO26に関しては、トレーニングスクリプトで epochs パラメータを設定できます。
早期停止#
早期停止(Early Stopping)は、モデルのトレーニングを最適化するための価値ある手法です。検証パフォーマンスを監視することで、モデルの改善が止まった時点でトレーニングを停止できます。計算リソースを節約し、過学習を防ぐことができます。
このプロセスでは、検証メトリクスの改善が何エポック見られない場合にトレーニングを停止するかを決定する、patience(忍耐)パラメータを設定します。これらのエポック内にモデルのパフォーマンスが向上しない場合、時間とリソースの浪費を避けるためにトレーニングが停止されます。
YOLO26の場合、トレーニング設定でpatienceパラメータを設定することで、早期終了(アーリーストッピング)を有効にできます。たとえば、 patience=5 は、検証指標が5連続エポックで改善しない場合、トレーニングが停止することを意味します。この方法を使用することで、過剰な計算を伴わずにトレーニングプロセスが効率的に維持され、最適なパフォーマンスが達成されます。
クラウドトレーニングとローカルトレーニングの選択#
モデルをトレーニングするには、クラウドトレーニングとローカルトレーニングという2つの選択肢があります。
クラウドトレーニングはスケーラビリティと強力なハードウェアを提供し、大規模なデータセットや複雑なモデルを処理するのに最適です。Google Cloud、AWS、Azureなどのプラットフォームは、高性能なGPUやTPUへのオンデマンドアクセスを提供し、トレーニング時間を短縮し、より大きなモデルでの実験を可能にします。ただし、特に長期間にわたる場合、クラウドトレーニングは高価になる可能性があり、データ転送によってコストやレイテンシが増加する可能性があります。
ローカルトレーニングは、より優れた制御とカスタマイズを提供し、環境を特定のニーズに合わせて調整し、継続的なクラウドコストを回避できます。長期プロジェクトではより経済的であり、データはオンプレミスに留まるため、セキュリティも向上します。ただし、ローカルハードウェアにはリソース制限がある場合があり、保守が必要になるため、大規模なモデルではトレーニング時間が長くなる可能性があります。
オプティマイザの選択#
オプティマイザは、モデルのパフォーマンスを測定する損失関数を最小限に抑えるために、ニューラルネットワークの重みを調整するアルゴリズムです。簡単に言えば、オプティマイザは誤差を減らすためにパラメータを微調整することで、モデルの学習を支援します。適切なオプティマイザを選択することは、モデルがどれほど迅速かつ正確に学習するかを直接左右します。
モデルのパフォーマンスを向上させるために、オプティマイザのパラメータを微調整することもできます。学習率を調整することで、パラメータ更新時のステップサイズを設定します。安定性を高めるために、中程度の学習率から開始し、時間をかけて徐々に低下させて長期的な学習を改善するのがよいでしょう。さらに、モーメンタムを設定することで、過去の更新が現在の更新にどれだけ影響を与えるかを決定します。モーメンタムの一般的な値は約0.9であり、一般的にバランスが取れています。
一般的なオプティマイザ#
オプティマイザごとに強みと弱みがあります。いくつかの一般的なオプティマイザを簡単に見てみましょう。
-
SGD (Stochastic Gradient Descent / 確率的勾配降下法):
- 損失関数のパラメータに対する勾配を使用してモデルパラメータを更新します。
- シンプルで効率的ですが、収束が遅く、局所的な最小値(ローカルミニマ)に陥る可能性があります。
-
Adam(Adaptive Moment Estimation):
- モーメンタム付きSGDとRMSPropの両方の利点を組み合わせたものです。
- 勾配の一次および二次モーメントの推定に基づいて、各パラメータの学習率を調整します。
- ノイズの多いデータや疎な勾配に適しています。
- 効率的であり、通常は必要なチューニングが少なくて済みます。短いトレーニング実行の場合、YOLO26の
optimizer=autoは、Adamそのものではなく、密接に関連する AdamW を選択します。
-
RMSProp (Root Mean Square Propagation):
- 勾配の大きさの移動平均で勾配を除算することにより、各パラメータの学習率を調整します。
- 勾配消失問題の処理に役立ち、RNN(再帰型ニューラルネットワーク)に効果的です。
-
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ドキュメントをご確認ください。
これらのリソースを使用することで、課題を解決し、コンピュータビジョンコミュニティにおける最新のトレンドや実践に遅れずについていくことができます。
重要なポイント#
コンピュータビジョンモデルのトレーニングには、優れた実践に従うこと、戦略を最適化すること、そして発生する問題に対処することが含まれます。バッチサイズの調整、混合精度トレーニング、事前学習済みの重みからの開始などの手法により、モデルの動作が向上し、トレーニングが高速化されます。サブセットトレーニングや早期終了などの方法は、時間とリソースを節約するのに役立ちます。コミュニティとつながり続け、新しいトレンドに遅れないようにすることで、モデルのトレーニングスキルを向上させ続けることができます。
よくある質問 (FAQ)#
GPU の使用率を向上させるには、
batchパラメータを GPU がサポートする最大サイズに設定します。単一のアクセラレータでは、batch=-1がモデルのプロファイリングを行い、メモリ使用率を約 60% にターゲットします。CPU および Apple silicon ではbatch=16にフォールバックし、マルチ GPU の実行にはデバイス数の倍数である明示的なグローバルバッチサイズが必要です。詳細については、Train mode arguments を参照してください。混合精度トレーニングでは、16 ビット (FP16) と 32 ビット (FP32) の両方の浮動小数点型を使用して、計算速度と精度のバランスを取ります。YOLO26 では、
amp=Trueを通じてデフォルトで有効になっています。FP32 を強制するには、amp=Falseを設定してください。CPU および Apple silicon では AMP がスキップされます。詳細については、Train mode arguments を参照してください。マルチスケールトレーニングは、さまざまなサイズの画像でトレーニングを行うことでモデルのパフォーマンスを向上させ、モデルがさまざまなスケールや距離にわたってより適切に汎化できるようにします。YOLO26 には、このための 2 つの個別パラメータが用意されています。
scale=0.5は 0.5 から 1.5 の間のズーム係数をサンプリングし、固定のimgszにパディングまたはクロップで戻します。一方、multi_scale=0.25は、ストライドステップごとに各バッチでimgsz自体を変化させます。設定や詳細については、Train mode documentation をご確認ください。事前学習済みの重みを使用すると、基礎的な視覚的特徴をすでに学習しているモデルを活用して、トレーニングを大幅に加速し、モデルの精度を向上させることができます。
model引数 (model=yolo26n.ptのように) を介してそれらをロードします。次に、pretrainedが、それらの重みを保持するか (True、デフォルト)、破棄するか (False)、または別のチェックポイントに置き換えるか (model=*.yamlビルドに重みを転移する方法であるpretrained=path/to/best.pt) を決定します。詳細については、Train mode documentation を参照してください。エポック数とは、モデルのトレーニング中にトレーニングデータセットを通した完全なパスを指します。一般的な出発点は300エポックです。モデルが早期に過学習する場合は、数を減らすことができます。あるいは、過学習が観察されない場合は、トレーニングを600、1200、またはそれ以上のエポックに拡張することもできます。YOLO26でこれを設定するには、トレーニングスクリプトで
epochsパラメータを使用します。理想的なエポック数を決定するための追加のアドバイスについては、エポック数に関するこのセクションを参照してください。