Early Stopping
早期終了は、検証性能が停滞した時点で学習を終了し、最良のチェックポイントを保持しながら、無駄な計算と過学習を抑えます。
早期終了は、監視対象の性能指標が改善しなくなったときに、反復的な機械学習の実行を終了する学習手法です。検証性能に基づいて学習を継続する期間を決定することで、不要な計算を減らし、過学習を抑制します。直感的に言えば、追加の練習をしても、モデルが未使用のデータ例を扱う能力が向上しなくなった時点で学習を終了します。機械学習以外では、「早く終了する」とは、予定された完了時点より前に活動を終えることを意味します。
早期終了の仕組み#
学習中、オプティマイザーは学習データを使ってモデルを更新します。一定間隔で、モデルを別の検証データで評価します。検証性能が低下している一方で、学習損失が下がり続けることがあります。これは過学習の兆候であり、モデルが学習データの例に固有の詳細にますます適合している状態です。早期終了は、未使用データでの性能に基づいて終了時点を選ぶことで、この状態を抑制します。
一般的な実装では、最良の検証スコアを追跡し、対応するモデルの重みを保存したうえで、十分な改善が見られないチェックが連続した回数を数えます。改善があればカウンターをリセットし、設定した patience に達すると学習を終了します。最良のチェックポイントを復元することで、学習の最終ステップより前に記録された場合も含め、観測された最も良い検証結果を保持できます。
Nelson Morgan氏とHervé Bourlard氏は、汎化とパラメーター推定に関する1989年の研究で、フィードフォワードニューラルネットワークに対する検証ベースの停止手法を紹介しました。この研究には音声分類の実験が含まれており、独立したデータを監視して学習期間を選択する方法が示されました。
指標、patience、最良の重み#
停止ルールは、いくつかの設定に依存します。
- 監視対象の指標: 検証損失は予測誤差を測定するため、最小化します。検証精度は正しい予測の割合を測定するため、最大化します。
- patience と学習期間: patience は、学習を終了せずに許容する改善のないチェック回数を指定します。エポックとは、学習データセット全体を1回処理することです。
- 改善しきい値: Kerasではこれを
min_deltaと呼び、進捗としてカウントする最小の絶対変化量を指定します。restore_best_weights=True設定では、監視対象の値が最良だった時点の重みを復元します。 - 検証チェックの頻度: PyTorch Lightningでは、検証チェックの回数でpatienceを数えます。10エポックごとにチェックし、patienceを3に設定すると、最良のチェック後、30エポックの間に改善のないチェックが3回許容されます。
patienceと改善しきい値は、重みの更新プロセスとは別に設定するハイパーパラメーターです。patienceを小さくすると停滞した学習を早く終了し、大きくすると一時的な停滞が長く続く場合も学習を継続できます。ウォームアップ期間を設けると、初期学習が安定するまで監視を遅らせられます。これらの設定は、最適化による更新幅を制御する学習率と相互に影響します。
適用例と実行可能なサンプル#
早期終了は、ニューラルネットワークと勾配ブースティング木の両方に適用できます。scikit-learnによる勾配ブースティングでは、各ステージで木を追加し、検証ベースの停止によってステージ数を制御します。California Housingの例では、データの分割にvalidation_fractionを使用し、検証性能の改善が停滞した後に学習を終了するためにn_iter_no_changeを使用します。
次の例では、scikit-learnに付属する糖尿病データセットを使い、実際に学習されたブースティングステージの数を出力します。
from sklearn.datasets import load_diabetes
from sklearn.ensemble import GradientBoostingRegressor
X, y = load_diabetes(return_X_y=True)
# Reserve an internal validation split and monitor progress.
model = GradientBoostingRegressor(
n_estimators=1000,
validation_fraction=0.2,
n_iter_no_change=10,
random_state=42,
)
model.fit(X, y)
print(f"Boosting stages fitted: {model.n_estimators_}/1000")学習済みステージ数から、1,000ステージという上限に対して、停止条件がどの時点で木の構築を終了したかが分かります。
Ultralytics YOLOは、モデルの学習中に早期終了を適用します。これにはYOLO26も含まれ、検証fitnessが改善しないエポック数を数えるpatience引数を使用します。物体検出では、fitnessにmAP50–95を使用し、トレーナーは最良のチェックポイントをbest.ptとして保存します。
早期終了と関連概念#
早期終了は、学習期間を制御する正則化の一種です。重み減衰は大きな重みにペナルティを課し、ドロップアウトは学習中にユニットをランダムに無効化します。これらの手法は併用できます。早く終了しすぎると未学習になり、有用なパターンを学習できないままになります。
チェックポイントはモデルの状態を保存し、早期終了は最適化を終了するタイミングを決定します。交差検証では未使用の分割データを順に入れ替えてモデルの選択肢を評価し、別のテストデータは最終評価に使用します。停止の判断では検証結果に基づいてモデルを選択するため、選ばれたチェックポイントの検証スコアはモデル選択の一部です。
Kerasでは、restore_best_weightsのデフォルト値がFalseであるため、早期終了を有効にするだけでは、モデルの重みは最終ステップのものになります。










