【tensorflow】オーバーフィットとアンダーフィットが分かる【Kaggle Course – Intro to Deep Learning 4】Overfitting and Underfitting

Kaggle

アメリカのデータ分析コンペKaggleでは、世界中の優秀なデータサイエンティストによって作成された様々なeラーニング教材が無料で公開されています。

中でも、この記事では以下の講座について解説します。

Intro to Deep Learning
4.Overfitting and Underfitting

全編英語ですし、ところどころ説明を省略しているところもあるので、私なりにかみ砕いて解説していきます。

この記事で取り扱うライブラリ、モジュール、クラスは以下の通りです。

Method
tf.keras.callbacks.EarlyStopping

Overfitting and Underfitting(オーバーフィットとアンダーフィット)

Introduction(イントロダクション)

前回の講座では、学習が進むにつれて損失が下がる学習曲線が出てきました。

今回は、この学習曲線をモデルの性能向上にどう利用していくかを学んでいきます。

Interpreting the Learning Curves(学習曲線の見かた)

学習曲線の見かた

これまでの学習曲線では、訓練データのみをプロットしてきました。

しかし、実際にモデルの性能を評価するためには評価データのプロットも必要です

下図では、訓練データ青色評価データオレンジ色でプロットしています。横軸はエポック(Epochs)、縦軸は損失(Loss)です。

 

評価データの損失が途中から上昇してしまっていますね。なぜでしょうか?

それは、訓練データノイズを学習してしまっているためです。

シグナルとノイズ

 

訓練データにはシグナルノイズの2種類のデータがあります。

シグナルはモデルの性能を上げるのに役立つデータ。

ノイズは逆にモデルの性能を上げるのに役立たないデータのことです。訓練データに含まれてしまった、異常値や非現実的なデータのことです。

極端な話、訓練データシグナルだけであれば、効率的に学習できるため、あまり多くのデータ量は必要ありません。

さて、上図の学習曲線に話を戻しますが、訓練データの損失は先のシグナルを学習したときもノイズを学習したときも、一貫して減少します。これは訓練データに最適化されていくためです。

しかし、評価データの損失は、モデルがシグナルを学習したときにのみ減少します。これは、ノイズを学習したとしても、評価データにとっては役に立たないためです。

つまり、モデルがシグナルを学習したときには、両方の曲線が下がりますが、ノイズを学習したときは、曲線にギャップが生まれます。

このギャップの大きさによって、モデルがどれだけノイズを学習したかがわかります。

アンダーフィットとオーバーフィット

 

上の図の左はアンダーフィット、右はオーバーフィットを示しています。

アンダーフィット シグナルの学習が少なすぎて損失が大きく、
単純な推論しかできない状態
オーバーフィット ノイズの学習が多すぎて損失が大きく、
新しいデータに適応できていない状態

ディープラーニングモデルの学習のコツは、この2つのバランスをうまくとることです。

次のセクションで、シグナルノイズの量をちょうどよくするための方法を見ていきましょう。

Early Stopping(早期停止)

シグナルノイズの量をちょうどよく調整してくれるのがEarly Stopping(早期停止)です。

考え方はシンプルで、以下の図で見ると評価データの損失が増え始めてきたところで学習をストップすることをEarly Stoppingと言います。

 

具体的には、評価データの損失が、ある一定以上の上昇を見せたときに学習をストップし、損失が最小となっている場所まで戻って重みを設定します。

これにより、学習時間が長すぎ(オーバーフィット)もせず、短すぎ(アンダーフィット)もせず、ちょうどよい重みを学習することができるのです。

Adding Early Stopping(早期停止の実装)

早期停止は以下のように実装します。

from tensorflow.keras.callbacks import EarlyStopping

early_stopping = EarlyStopping(
    min_delta=0.001, # minimium amount of change to count as an improvement
    patience=20, # how many epochs to wait before stopping
    restore_best_weights=True,
)

このパラメータ設定だと、過去20回のエポックにおいて、損失に連続して0.001以上の改善がないとき、学習を停止します。

Example – Train a Model with Early Stopping(早期停止の学習例)

早期停止を実装したモデルの学習です。

下のグラフを見ると、訓練データ評価データの損失がそれぞれ低下したまま落ち着いているのが分かると思います。

history = model.fit(
    X_train, y_train,
    validation_data=(X_valid, y_valid),
    batch_size=256,
    epochs=500,
    callbacks=[early_stopping], # put your callbacks in a list
    verbose=0,  # turn off training log
)

history_df = pd.DataFrame(history.history)
history_df.loc[:, ['loss', 'val_loss']].plot();
print("Minimum validation loss: {}".format(history_df['val_loss'].min()))
Minimum validation loss: 0.0907348245382309

エポックは500に設定しましたが、グラフを見ると60エポックで早期停止していますね。

Your Turn(練習問題)

Kaggle Courseでは、学んできたことを実践するための練習問題が用意されています。読んだり見たりするだけでなく、実際に手を動かすことは大切ですので、ぜひチャレンジしてみて下さい。

今回はKaggle Courseでオーバーフィット、アンダーフィットについて学びました。次回はドロップアウトとバッチ正規化について学んでいきます。

以上、最後までお読みいただきありがとうございました。

コメント

タイトルとURLをコピーしました