はじめに
このプロジェクトでは、機械学習モデルにおける早期終了手法を実装する方法を学びます。早期終了は、過学習を防止し、モデルの性能を向上させる強力な手法です。
🎯 タスク
このプロジェクトでは、以下のことを学びます。
- 早期終了の概念と主なステップを理解する
- 最適な停止エポックを決定するための早期終了関数を実装する
- サンプルデータセットで早期終了関数をテストする
🏆 成果
このプロジェクトを完了すると、以下のことができるようになります。
- データセットを訓練セットと検証セットに分割する
- 訓練中に検証セットでのモデルの性能を監視する
- 検証セットの損失に基づいて停止基準を定義する
- 早期終了関数を使用してモデルの訓練プロセスを最適化する
早期終了の概念を理解し、関数を実装する
このステップでは、まず早期終了の概念とその主なステップについて学びます。
早期終了の背後にある基本的な考え方は、訓練中に検証セットでのモデルの性能を計算することです。検証セットでのモデルの性能が低下し始めたとき、過学習を回避するために訓練を停止します。主なステップは以下の通りです。
- 元の訓練データセットを訓練セットと検証セットに分割する。
- 訓練セットのみでモデルを訓練し、各エポックの終了時に検証セットでのモデルの誤差を計算する。
- 検証セットでのモデルの誤差を訓練履歴と比較する。比較が停止基準に一致したときに訓練を停止する。
- 最後の反復のパラメータをモデルの最終パラメータとして使用する。
様々な停止基準があり、かなり柔軟です。一般的に使用される基準の 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 オリジン)。
- その時点までに記録された最小損失値。
早期終了機能をテストする
このステップでは、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 でさらに多くの実験を行ってみてください。



