過学習と評価設計 — 精度99%を疑え
訓練データに合わせすぎたモデルはなぜ現場で壊れるのか。train/validation/testの役割分担、交差検証、実務で最も多い失敗であるデータリーク、不均衡データで精度が嘘をつく仕組みと、適合率・再現率・F1の使い分けまで。
「精度99%出ました」ほど危ない報告はない
チームから「新しいモデル、精度99%です」と報告が来たとします。喜ぶ前に確認すべきことが3つあります。どのデータで測ったのか。正解の内訳はどうなっているのか。そして、測る前にそのデータを一度でも学習に使っていないか。
この3つを外すと、手元で99%だったモデルが本番で60%になります。厄介なのは、原因がモデルではなく評価のやり方の側にあるため、モデルをいくら改良しても直らないことです。
前の記事(損失関数と最適化)では損失を下げる仕組みを見ました。しかし損失を下げること自体は目的ではありません。訓練データの損失は、下げすぎると害になるからです。
過学習とは、何が起きているのか
過学習(overfitting)とは、モデルがデータの中の「本当の規則」だけでなく、「そのデータにたまたま乗っていたノイズ」まで忠実に再現してしまった状態です。
散布図に点が10個あるとします。全体はゆるやかに右肩上がりで、各点は測定ゆらぎで少し上下している。直線を当てると点からのズレは残りますが、傾向は掴めます。一方9次の多項式なら10点すべてを寸分違わず通過でき、訓練誤差はゼロ。しかしその曲線は点と点の間で激しく波打っており、新しい点は大きく外します。
つまり過学習は「性能が悪い」のではなく、訓練データに対して良すぎることで起きます。モデルの表現力(容量)が、手持ちのデータ量に対して大きすぎるときの症状です。
下の部品で多項式の次数を上げてみてください。訓練誤差は次数とともに単調に下がり続けるのに、テスト誤差はある次数を境に反転して上がり始めます。
逆に、直線しか引けないモデルで複雑な関係を学ばせようとすると、訓練誤差もテスト誤差も高いまま止まります。こちらは未学習(underfitting)です。診断は2つの数字の関係だけでつきます。両方高いなら未学習、訓練だけ低くて差(汎化ギャップ)が開いていれば過学習。
この2種類の誤りには名前があります。単純すぎて傾向を捉えられない分をバイアス、データのゆらぎに振り回される分をバリアンスと呼び、モデルを複雑にするほどバイアスは減ってバリアンスは増えます。上の図でテスト誤差が最小になる点は、このトレードオフの底です。実務では、まず十分な容量のモデルで訓練誤差を下げきり、そのうえで正則化やデータ追加でギャップを詰める、という順で進めるのが定石になっています。
そして最適な複雑さは「訓練誤差が最小の点」ではなく「テスト誤差が最小の点」にある。となれば、次の問題は1つです。そのテスト誤差を、どうやって正しく測るのか。ここからが本題です。
訓練・検証・テスト — 3つに分ける理由
データは2つではなく3つに割ります。役割が違うからです。
| 分割 | 割合の目安 | 何に使うか | 見てよい回数 |
|---|---|---|---|
| 訓練(train) | 60〜80% | パラメータを学習させる | 無制限 |
| 検証(validation) | 10〜20% | ハイパーパラメータ選択・早期終了 | 何度でも |
| テスト(test) | 10〜20% | 最終的な性能の見積もり | 最後に1回 |
なぜ検証とテストを分けるのか。学習率や層の数といったハイパーパラメータ(学習では決まらない設定値)は検証スコアを見て選びますが、選ぶ行為自体が検証セットへの適合です。50通り試して最良を選べば、それは検証セットのノイズに合っていただけかもしれない。だから選択に一度も使っていないデータを封印しておきます。テストは、報告のために1回だけ開ける封筒です。
コメント
コメントにはログインが必要です