2.6 過学習と正則化
「覚えすぎ」を防ぐ
この回で分かること
- 過学習(覚えすぎ)と 学習不足(単純すぎ)を、訓練データと新しいデータでの誤差の違いから見分けられる
- 訓練データ・検証データ・テストデータの役割と、検証データでモデルを選ぶ方法を説明できる
- 正則化(重みの大きさに罰を与える)と早期終了で、過学習を防ぐしくみを説明できる
直感で理解する
試験の前に、過去問の答えを丸暗記した人を考えてみましょう。同じ問題が出れば満点ですが、少し変えた問題には答えられません。機械学習でも同じことが起きます。訓練データに合わせすぎて、新しいデータで性能が落ちる状態を 過学習 と呼びます。
2.2 の続きとして、今度は速度と停止距離(空走距離+制動距離)の関係を、10件のデータから学ぶことにします。停止距離は速度の2乗に比例する部分を含むので、曲線になります。1次式(直線)、2次式、9次式の3つのモデルを当てはめてみましょう。次数が大きいほど、曲がりくねった複雑な曲線を表せるモデルです。
1次式は曲がりを表せず、どのデータからも少しずつ外れています(学習不足)。9次式は10個の点をすべて通るので、訓練データでの誤差は0ですが、点と点の間で大きく波打ち、時速77kmでは停止距離を「−49 m」と予測してしまいます。2次式は点をぴったりとは通りませんが、新しいデータにはいちばんよく当たります。
数式で確かめる
① 訓練データの誤差と、新しいデータの誤差
モデルの次数を変えながら、2つの誤差(MSE)を比べます。
| モデルの次数 | 1 | 2 | 3 | 5 | 7 | 9 |
|---|---|---|---|---|---|---|
| 訓練データの誤差 | 6.7 | 5.0 | 5.0 | 4.0 | 2.0 | 0.0 |
| 新しいデータの誤差 | 7.3 | 4.2 | 4.3 | 9.1 | 79 | 1010 |
モデルを複雑にするほど、訓練データの誤差は下がり続けます。ところが新しいデータの誤差(汎化誤差)は、はじめは下がり、ある所から上がり始めます(U字の形)。単純すぎるモデルは本当の形を表せない「かたより」で、複雑すぎるモデルはデータの偶然のばらつきにまで合わせてしまう「ぶれ」で、それぞれ誤差が大きくなります。
また、データ自体に含まれるばらつき(今回は約 3.5 m²)より小さい誤差は、本来は出せません。訓練データの誤差がそれを大きく下回っていたら、覚えすぎを疑います。
② データを3つに分ける
- 訓練データ:パラメータを学ぶのに使う
- 検証データ:モデルの複雑さや学習率など、人が決める設定(ハイパーパラメータ)を選ぶのに使う
- テストデータ:最後に一度だけ、本当の性能を測るのに使う
上の表の「新しいデータ」を検証データとして使えば、2次式を選べます。ただし、検証データを見ながら何度も選び直すと、今度は検証データに合わせすぎてしまいます。そのため最終的な評価は、一度も使っていないテストデータで行います。データが少ないときは、分け方を変えながら検証を何度もくり返して平均する 交差検証 も使われます。
③ 正則化:重みの大きさに罰を与える
9次式の係数を見ると、±958 のような大きな値になっていました。重みが大きいと、入力が少し変わっただけで予測が大きく動き、曲線が波打ちます。そこで損失に「重みの大きさ」への罰を足します。
λ(ラムダ)は罰の強さです。重みの2乗の和を罰にするこの方法は リッジ回帰(L2正則化)と呼ばれ、一般に 正則化 といいます。9次式に正則化をかけると、次のようになります。
| 罰の強さ λ | 0 | 0.001 | 0.01 | 0.1 | 1 |
|---|---|---|---|---|---|
| 訓練データの誤差 | 0.0 | 2.6 | 3.3 | 4.0 | 11.1 |
| 新しいデータの誤差 | 1010 | 35 | 14.6 | 7.5 | 12.9 |
罰を強めるほど曲線はなめらかになり、新しいデータの誤差が下がります。ただし強すぎると、今度は単純すぎて学習不足になります(λ = 1)。λ も検証データで選びます。ほかにも、検証データの誤差が上がり始めた所で学習を止める 早期終了(2.3)や、データそのものを増やすことも、過学習を防ぐ有効な方法です。
自動運転との接点
- 「テストで高得点」の中身を確かめる:同じ走行ルートや同じ日の画像が、訓練データとテストデータの両方に入っていると、似た画像を覚えているだけで高い点が出ます(データの漏れ)。場所・日・車両ごとにまとめて分けてテストします。→ 2.8 データの分け方と分布シフト
- テストデータを何度も使わない:テスト結果を見てモデルを直すことをくり返すと、テストデータに合わせすぎてしまいます。安全の証拠にする最終評価のデータは、開発に使うデータと分けて管理します。→ 5.10 セーフティケース
- 稀な場面ほど過学習しやすい:雪の日や特殊な車両のようにデータが少ない場面では、少数の例を覚えるだけになりがちです。全体の平均だけでなく、場面ごとの性能を分けて確かめます。→ 2.7 評価指標
- なめらかさは安全の味方:正則化されたモデルは、入力が少し変わっても出力が大きく変わりにくくなります。これはセンサのノイズや小さな乱れに対する強さ(頑健性)にもつながります。→ 3.8 頑健性と敵対的サンプル
まとめ
- 過学習は、訓練データに合わせすぎて新しいデータに弱くなること。訓練データの誤差だけが下がり、新しいデータの誤差が上がっていたら疑う
- データは訓練・検証・テストに分ける。複雑さなどの設定は検証データで選び、テストデータは最後に一度だけ使う
- 正則化(重みの大きさに罰を与える)や早期終了で、なめらかで新しいデータにも当たるモデルにする。罰が強すぎると学習不足になる
確認クイズ
Q1. 訓練データでの正解率は99%、検証データでは75%でした。何が起きている?
過学習です。訓練データを覚えてしまい、新しいデータに当てはまっていません。モデルを単純にする、正則化を強める、データを増やす、早期終了を使う、などを試します。
Q2. 訓練データで80%、検証データで79%。どちらも目標の95%に届きません。どうする?
2つの差が小さく、どちらも低いので学習不足です。より表現力のあるモデルにする、役に立つ入力(特徴)を加える、正則化を弱める、などを試します。
Q3. 正則化の強さ λ を大きくしすぎると、どうなる?
重みが小さく抑えられすぎて、モデルが単純になり、学習不足になります。表の例では、λ = 1 で訓練データの誤差も新しいデータの誤差も大きくなりました。
Q4. 同じ交差点で撮った動画の連続したフレームを、ランダムに訓練データとテストデータに振り分けました。何が問題?
ほとんど同じ画像が両方に入るので、テストの点が実力より高く出ます(データの漏れ)。場所や日ごとにまとめて、訓練とテストに分ける必要があります。
もっと知りたい人へ
- 次の回:2.7 評価指標
- 関連:2.1 機械学習とは(汎化)、2.2 線形回帰と損失関数、2.3 勾配降下法(早期終了)
- 用語集:過学習、学習不足、訓練・検証・テストデータ、交差検証、正則化、早期終了
- 解説動画:YouTube(約5分)(静止画のスライドと音声で要点を説明。英語版の記事には英語の動画があります)