丸暗記したモデルは新しいデータに弱い
過学習(オーバーフィッティング)とは、モデルが学習データを丸暗記して、新しいデータでは外れるようになることです。学習データでの成績だけを見ていると、役に立たないモデルを見逃します。
試験の過去問の答えだけを覚えた人は、問題が変わると解けません。モデルにも、同じことが起こります。
このレッスンのゴール
メモ
過学習を見つけて、減らす方法を説明できる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| 学習データ | 重みを直すために使うデータ | |
| 検証データ | 学習に使わず、成績の確認だけに使うデータ | |
| 過学習 | 学習データには合うが、新しいデータには合わない状態 | |
| 早期終了 | 検証の損失が悪くなる前に、学習を止めること | |
| 待つ回数 | よくならなくても、止めずに待つエポックの数 | 2 |
| ドロップアウト | 学習中に、ニューロンの一部をランダムに休ませる方法 |
学生が入力するセルは、このプレビューでは空白です。
データを学習用と検証用に分ける
学習データだけで成績を測ると、丸暗記でも高い点が出ます。そこで、データの一部を検証データとして取っておきます。
検証データは重みの更新に使わず、エポックのあとに損失だけを測ります。365日のデータなら、およそ4分の3を学習に、4分の1を検証に使います。
ラボのデータは何行あるか
次のコマンドは、hires.csv の行数を数えます。1行目は列の名前なので、日数は行数より1少なくなります。
行数を数える
docker exec jupyter wc -l hires.csvここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
例: 8エポックの損失
| エポック | 学習データの損失 | 検証データの損失 | 差 |
|---|---|---|---|
| 1 | 0.90 | 0.95 | 0.05 |
| 2 | 0.60 | 0.70 | 0.10 |
| 3 | 0.42 | 0.52 | 0.10 |
| 4 | 0.30 | 0.47 | 0.17 |
| 5 | 0.21 | 0.49 | 0.28 |
| 6 | 0.14 | 0.55 | 0.41 |
| 7 | 0.09 | 0.64 | 0.55 |
| 8 | 0.05 | 0.78 | 0.73 |
学生が入力するセルは、このプレビューでは空白です。
差の広がりを調べる
train = [0.90, 0.60, 0.42, 0.30, 0.21, 0.14, 0.09, 0.05]
valid = [0.95, 0.70, 0.52, 0.47, 0.49, 0.55, 0.64, 0.78]
for n in range(len(train)):
gap = valid[n] - train[n]
print("エポック", n + 1, "差", round(gap, 2))
# 差が 0.2 を超えるのは、何エポック目ですか。
# 検証の損失が 0.6 を超えるのは、何エポック目ですか。
早期終了は悪くなり始めたら止める
早期終了は、検証の損失がよくならなくなったら、学習を止める方法です。1回悪くなっただけでは止めません。損失は揺れることがあるからです。
待つ回数を決めておき、最良の損失が出てから、その回数だけよくならなければ止めます。止めたあとは、最良のエポックの重みを使います。
例: 待つ回数を2にした場合
| エポック | 検証の損失 | 最良のあとの回数 | 判断 |
|---|---|---|---|
| 1 | 0.95 | 0 | 最良を更新 |
| 2 | 0.70 | 0 | 最良を更新 |
| 3 | 0.52 | 0 | 最良を更新 |
| 4 | 0.47 | 0 | 最良を更新 |
| 5 | 0.49 | 1 | 続ける |
| 6 | 0.55 | 2 | 止める |
学生が入力するセルは、このプレビューでは空白です。
最良の損失は最小値で見つかる
最良の損失は、検証の損失のうち、いちばん小さいものです。次のコマンドは、表の6エポック分から、最小値を求めます。
検証の損失の最小値を調べる
docker exec jupyter python3 -c "print(min([0.95, 0.7, 0.52, 0.47, 0.49, 0.55]))"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
過学習を減らす方法は他にもある
学習データを増やすと、丸暗記しにくくなります。ネットワークを小さくするのも効きます。ドロップアウトは、学習中にニューロンの一部を休ませて、特定のニューロンに頼らせません。
重みが大きくなりすぎないよう罰を足す正則化もあります。どの方法でも、効いたかどうかは検証データで確かめます。
よくある間違い
注意
学習データでの成績が高ければ、よいモデルだと考えがちです。しかし丸暗記でも高くなります。検証の損失が上がり始めたら、過学習のしるしです。最後の確認用のテストデータは、調整が終わってから1回だけ使います。