機械学習における早期終了

PythonBeginner
オンラインで実践に進む

はじめに

このプロジェクトでは、機械学習モデルにおける早期終了手法を実装する方法を学びます。早期終了は、過学習を防止し、モデルの性能を向上させる強力な手法です。

🎯 タスク

このプロジェクトでは、以下のことを学びます。

  • 早期終了の概念と主なステップを理解する
  • 最適な停止エポックを決定するための早期終了関数を実装する
  • サンプルデータセットで早期終了関数をテストする

🏆 成果

このプロジェクトを完了すると、以下のことができるようになります。

  • データセットを訓練セットと検証セットに分割する
  • 訓練中に検証セットでのモデルの性能を監視する
  • 検証セットの損失に基づいて停止基準を定義する
  • 早期終了関数を使用してモデルの訓練プロセスを最適化する

早期終了の概念を理解し、関数を実装する

このステップでは、まず早期終了の概念とその主なステップについて学びます。

早期終了の背後にある基本的な考え方は、訓練中に検証セットでのモデルの性能を計算することです。検証セットでのモデルの性能が低下し始めたとき、過学習を回避するために訓練を停止します。主なステップは以下の通りです。

  1. 元の訓練データセットを訓練セットと検証セットに分割する。
  2. 訓練セットのみでモデルを訓練し、各エポックの終了時に検証セットでのモデルの誤差を計算する。
  3. 検証セットでのモデルの誤差を訓練履歴と比較する。比較が停止基準に一致したときに訓練を停止する。
  4. 最後の反復のパラメータをモデルの最終パラメータとして使用する。

様々な停止基準があり、かなり柔軟です。一般的に使用される基準の 1 つは、検証セット上の損失値を監視することです。損失値が n エポック連続で(常に最小損失より大きい)さらに最適化されなかったとき、訓練を停止します。

次に、early_stop.pyファイルにearly_stop関数を実装します。

この関数は、エポックごとに損失値をチェックします。損失がpatienceに等しいエポック数だけ改善(減少)しない場合、訓練を停止することが推奨されます。

以下はearly_stop関数のコードです。

def early_stop(loss: List[float], patience: int) -> Tuple[int, float]:
    """
    提供された損失値と patience に基づいて、訓練を停止するエポックを決定します。

    この関数は、エポックごとに損失値をチェックします。損失が `patience` に等しいエポック数だけ改善(減少)しない場合、訓練を停止することが推奨されます。

    パラメータ:
    - loss (List[float]): 損失値のリストで、通常は訓練中に記録された順序です。
    - patience (int): 損失が改善されないエポック数。この数が経過したら訓練を停止します。

    戻り値:
    - Tuple[int, float]: 2 つの値を含むタプルです。
        1. 訓練を停止するエポック番号(1 オリジン)。
        2. その時点までに記録された最小損失値。
    """

    min_loss = np.Inf
    max_patience = 0
    stop_epoch = 0
    for epoch, current_loss in enumerate(loss):
        if current_loss < min_loss:
            min_loss = current_loss
            stop_epoch = epoch
            max_patience = 0
        else:
            max_patience += 1
        if max_patience == patience:
            break
    stop_epoch += 1
    return stop_epoch, min_loss

early_stop関数では、提供された損失値とpatienceパラメータに基づいて、訓練を停止するエポックを決定するロジックを実装します。

この関数は、2 つの値を含むタプルを返す必要があります。

  1. 訓練を停止するエポック番号(1 オリジン)。
  2. その時点までに記録された最小損失値。

早期終了機能をテストする

このステップでは、early_stop.pyファイルを実行してearly_stop関数をテストします。

early_stop.pyファイルに以下のコードを追加します。

if __name__ == "__main__":
    loss = [
        1.11,
        1.01,
        0.99,
        0.89,
        0.77,
        0.69,
        0.57,
        0.44,
        0.51,
        0.43,
        0.55,
        0.61,
        0.77,
        0.89,
        0.78,
    ]
    patience = 3
    stop_epoch, min_loss = early_stop(loss, patience)
    print(f"{stop_epoch=}, {min_loss=}")

次に、ターミナルからスクリプトを実行します。

python early_stop.py

出力は以下のようになるはずです。

stop_epoch = 10, loss = 0.43

これは、訓練をエポック 10 で停止する必要があり、その時点までに記録された最小損失値は 0.43 であることを意味します。

おめでとうございます!あなたは早期終了関数を正常に実装しました。これで、機械学習プロジェクトでこの関数を使って過学習を防止し、モデルの性能を向上させることができます。

まとめ

おめでとうございます!このプロジェクトを完了しました。あなたのスキルを向上させるために、LabEx でさらに多くの実験を行ってみてください。

✨ 解答を確認して練習✨ 解答を確認して練習