Overfitting
機械学習における過学習の原因と症状を確認します。Ultralytics YOLO26を使用して高分散を防ぎ、汎化性能を向上させる方法を学びます。
機械学習では、モデルがトレーニングデータを学習しすぎて、基礎となるデータ分布ではなくノイズやランダムな変動まで捉えてしまうことがあります。未知の新しいデータにも適用できる一般的なパターンを学習する代わりに、過学習したモデルはトレーニングセット内の具体的な例を実質的に記憶してしまいます。その結果、トレーニングデータでは優れた性能を示す一方、実世界のシナリオでは汎化性能が低くなります。これは「高分散」と表現されることが多く、トレーニングに使用するデータセットによってモデルの予測が大きく変動することを意味します。
過学習が発生する理由#
過学習の主な原因は、利用可能なデータ量に対してモデルが過度に複雑であることです。ニューラルネットワークが大きすぎる場合、つまりレイヤーやパラメーターが多すぎる場合、トレーニング例を容易に記憶してしまいます。その他の要因には、次のようなものがあります。
- トレーニングデータの不足: 小規模なデータセットには、より広い母集団には存在しない見せかけの相関が含まれている場合があります。限られたデータでトレーニングされたモデルは、こうした偶然のパターンを学習しやすくなります。
- データのノイズと外れ値: トレーニングデータに大量のノイズや代表性のない外れ値が含まれていると、モデルが誤った方向に導かれ、真のシグナルではなく異常値に適合するよう内部パラメーターを調整してしまう可能性があります。
- トレーニング期間の長期化: エポック数が多すぎると、モデルは重みの調整を続け、トレーニングセット内のノイズに適合するまで学習してしまいます。これは通常、検証データを使用して監視します。
過学習と未学習の比較#
過学習と未学習を区別することが重要です。過学習ではノイズを含む詳細を学習しすぎるのに対し、未学習はモデルが単純すぎてデータの基礎構造をまったく捉えられない場合に発生します。未学習のモデルはトレーニングデータと新しいデータの両方で性能が低く、しばしば高バイアスになります。この2つの極端な状態のバランスを取ることを、バイアスと分散のトレードオフと呼びます。
過学習の防止#
エンジニアは、過学習を軽減し、モデルの堅牢性を向上させるために、いくつかの手法を使用します。
- 正則化: L1/L2正則化やドロップアウトレイヤーの追加などの手法では、トレーニング中にペナルティやランダム性を導入し、モデルが特定の特徴に過度に依存することを防ぎます。
- 早期停止: 検証セット上の損失関数を監視することで、トレーニング精度が上昇し続けている場合でも、未知のデータに対する性能が改善しなくなった時点でトレーニングを停止できます。
- データ拡張: データ拡張を使用してトレーニングセットのサイズと多様性を人為的に増やすと、モデルが画像を完全に記憶することが難しくなります。
- 交差検証: k分割交差検証などの手法を使用すると、異なるデータサブセットでモデルをテストでき、性能をより信頼性の高い形で推定できます。
実環境での例#
過学習は、AIを本番環境に導入する際に深刻な結果を招く可能性があります。
- 医療診断: ヘルスケアにおけるAIでは、皮膚がんの検出用にトレーニングされたモデルが、トレーニング画像に含まれる照明条件や定規の目盛りに過学習する可能性があります。照明や機器が異なる診療所に導入すると、無関係な背景情報に依存していたため、悪性病変を正しく特定できない場合があります。
- 金融予測: 株価予測モデルが、特定の再現性のない出来事(1回限りの経済危機など)によって生じた過去の市場トレンドに過学習する可能性があります。このようなモデルは、過去の異常値を記憶し、市場の基本的な動態を学習していないため、将来の株価変動を正確に予測できない可能性が高くなります。
コード例: Ultralytics YOLO26での早期停止#
Ultralytics Platformまたはローカルのトレーニングスクリプトを使用すると、早期停止のpatienceを設定して過学習を防止できます。これにより、検証フィットネスが指定したエポック数の間改善しない場合にトレーニングが停止します。
from ultralytics import YOLO
# Load the YOLO26 model (latest generation)
model = YOLO("yolo26n.pt")
# Train with early stopping enabled (patience=50 epochs)
# If validation metrics don't improve for 50 epochs, training stops.
results = model.train(data="coco8.yaml", epochs=100, patience=50)関連する概念#
- 汎化: モデルが新しい未見のデータに適応し、良好な性能を発揮する能力であり、過学習とは反対の概念です。
- 交差検証: 統計分析の結果が独立したデータセットに対してどの程度汎化できるかを評価する手法です。
- 正則化: 与えられたトレーニングセットに関数を適切に適合させて誤差を減らし、過学習を回避するために使用される手法です。






