1. ホーム
  2. python

[解決済み] 早期停止に必要なパラメータは何ですか?

2022-12-04 15:58:56

質問

プロジェクトでKerasを使ってニューラルネットワークを学習しています。Kerasにはearly stoppingという関数があります。早期停止を使用してニューラルネットワークがオーバーフィットしないようにするには、どのようなパラメータを観測すればよいか教えてください。

どのように解決するのですか?

早期停止とは、基本的に損失が増え始めたら(言い換えれば検証精度が下がり始めたら)学習を停止することです。以下は ドキュメント によると、以下のように使用されます。

keras.callbacks.EarlyStopping(monitor='val_loss',
                              min_delta=0,
                              patience=0,
                              verbose=0, mode='auto')

値は実装(問題、バッチサイズなど)に依存しますが、一般的にオーバーフィッティングを防ぐために使用します。

  1. 検証の損失を監視する (クロス検証を使用する必要があります。 を設定することで、検証損失を監視する(クロスバリデーションか、少なくともトレーニング/テストセットを使用する必要がある)。 monitor 引数を 'val_loss' .
  2. min_delta は、あるエポックでの損失を改善として定量化するかどうかの閾値です。 改善されたかどうかを判断するための閾値です。もし損失の差が min_delta を下回る場合、それは改善なしと定量化される。 を下回る場合、改善なしと定量化されます。我々は、損失がどのように悪化するかに興味があるため、0としておく方が良い。 のままにしておくのがよいでしょう。
  3. patience 引数は、損失が増加し始めたら (改善が止まったら) 停止するまでのエポック数を表します。 これは実装に依存し、もし 非常に小さなバッチ を使うか、あるいは 大きな学習率 損失 ジグザグ (精度はよりノイズが多くなります)。 大きな patience の引数を大きくしてください。もし ラージバッチ を指定し 小さい 学習率 を使用すると、損失がより滑らかになるため、より小さな より小さい patience の引数になります。いずれにせよ、私は2としておきます。 モデルにより多くのチャンスを与えます。
  4. verbose は何を印刷するかを決定します。デフォルト(0)のままにしておきます。
  5. mode 引数は、監視する量がどのような方向性を持っているかに依存します。 があるか(減っているのか増えているのか)によりますが、私たちは損失を監視しているので、この引数は min . しかし、kerasに任せましょう が処理してくれるので、それを auto

ということで、このようなものを使って、早期停止をした場合としない場合の誤差損失をプロットして実験してみたいと思います。

keras.callbacks.EarlyStopping(monitor='val_loss',
                              min_delta=0,
                              patience=2,
                              verbose=0, mode='auto')


コールバックがどのように機能するかについて曖昧な可能性があるため、もう少し説明します。一度 fit(... callbacks=[es]) を呼び出すと、Kerasは与えられたコールバックオブジェクトにあらかじめ決められた関数を呼び出します。これらの関数は on_train_begin , on_train_end , on_epoch_begin , on_epoch_endon_batch_begin , on_batch_end . 早期停止コールバックはエポック終了毎に呼び出され、監視された最良の値と現在の値を比較し、条件が満たされた場合に停止します(最良の監視値の観測から何エポック経過したか、それは忍耐の引数より大きいか、最後の値との差はmin_deltaより大きいか、等々)。

コメントで@BrentFaustが指摘したように、モデルの学習はEarly Stopping条件を満たすか epochs パラメータ (デフォルト=10) が fit() を満たす必要があります。早期停止コールバックを設定することで、モデルをその epochs パラメータを越えてモデルを訓練することはない。そのため fit() 関数をより大きな epochs の値が大きい場合、Early Stoppingコールバックの恩恵をより多く受けられるでしょう。