過学習と正則化 — 「覚えすぎ」のワナ

訓練データでは満点、初めてのデータではボロボロ — モデルが暗記に走る現象が過学習です。テスト前日に過去問の答えを丸暗記した人が本番で撃沈するのと同じこと。その瞬間を目で確かめ、防ぐための道具(検証と正則化)を動かして理解します。

1. 暗記か、理解か — 過学習を目で見る

ノイズ混じりのデータに多項式の曲線を当てはめてみます。次数がモデルの複雑さです。次数1=直線、次数3=ゆるやかな曲線、次数15=どんな形にでも曲がれる「なんでもあり」。

大事なのは採点方法。当てはめに使った訓練データ(丸)と、当てはめには使っていないテストデータ(三角)を分け、両方の誤差を測ります。次数を上げていくと、2つの誤差バーの動きが途中から食い違い始めます。

多項式フィット — 次数を上げると何が起きるか
緑=学習した曲線、水色の丸=訓練データ、オレンジの三角=テストデータ。右のバーが2種類の誤差です。次数を 1 → 3 → 9 → 15 と動かしてみてください。訓練誤差は下がり続けるのに、次数10あたりから曲線は訓練点を縫うグネグネ道になり、テスト誤差が急上昇します。ノイズまで暗記し始めた瞬間です。
POINT — 過学習の定義 訓練誤差は下がり続けているのに、テスト誤差(見たことのないデータへの誤差)が上がり始める状態を過学習(overfitting)と呼ぶ。モデルはデータの法則ではなく、たまたま乗ったノイズまで暗記し始めている。未知のデータでも通用する力を汎化性能という。

2. ちょうどよい複雑さを探す — U字カーブ

次数を1から15まで順番に増やしながら、2つの誤差がどう動くかを1枚のグラフに描いてみます。再生ボタンを押してください。

誤差カーブのライブ描画 — 複雑さ vs 誤差
水色=訓練誤差、オレンジ=テスト誤差。訓練誤差は複雑にするほど単調に下がりますが、テスト誤差は下がってから再び上がる U字を描きます。U字の底(★印)が「ちょうどよい複雑さ」。左側は単純すぎて法則を捉えきれない未学習、右側が過学習です。
注意 — テストデータで複雑さを選んだら、それはもうテストではない U字の底を探すためにテストデータを何度も使うと、テストデータに合わせた「隠れた暗記」が始まる。複雑さ選び(ハイパーパラメータ調整)には、訓練データからさらに切り分けた検証データを使い、テストデータは最後に一度だけ。データが少ないときは分割を入れ替えて平均する交差検証が定番。

3. 正則化 — 大きな係数に「罰金」をかける

次数を下げる以外にも過学習を防ぐ道があります。グネグネ曲線の中身を覗くと、その正体は巨大な係数どうしの激しい打ち消し合いです。ならば、係数が大きいこと自体に罰金をかけてしまえばいい — これが正則化の発想です。

損失 = Σ(予測 − 正解)² + λ Σ wj² 第2項が L2 正則化(リッジ回帰)。λ(ラムダ)が罰金の強さ。λ=0 なら普通の最小二乗法
正則化の効き目 — 次数12のまま λ だけ動かす
次数は12に固定したまま、λ を 0 から少しずつ強くしていきます。左=学習した曲線(紫の点線が真の関数)、右=各係数の大きさ。λ=0 では係数が90超まで暴走してグネグネですが、ほんの少し罰金をかけるだけで係数バーが一気に縮み、曲線が滑らかになってテスト誤差も下がります。強くしすぎると今度は単純になりすぎて誤差が再上昇(未学習側へ逆戻り)。
POINT — なぜ係数を小さくすると滑らかになるのか 激しく波打つ曲線を作るには、大きな正負の係数を組み合わせて急激な上下を表現するしかない。係数の2乗和に罰金をかけると、この「打ち消し合いの離れ業」が高くつくため、モデルは自然と滑らかな説明を選ぶようになる。λ もハイパーパラメータなので、選ぶのはやはり検証データの仕事。

4. まとめ — 汎化こそが目的

一歩先へ — 過学習対策の道具箱 対策は正則化だけではない。データを増やす(最強にして王道)、検証誤差が悪化し始めたら学習を打ち切る早期終了、ニューラルネット向けの Dropout や BatchNorm(DNN編で動かす)、係数をちょうどゼロに潰して特徴選択にもなる L1 正則化(ラッソ)など。どれも根っこは同じで「暗記しにくくする」工夫。