ホーム›Part 2 機械学習の基礎›2.6

Part 2 · 機械学習の基礎

2.6 過学習と正則化

「覚えすぎ」を防ぐ

読了目安 10分前提:2.2 線形回帰と損失関数▶ 動画(約5分)

この回で分かること

  • 過学習(覚えすぎ)と 学習不足(単純すぎ)を、訓練データと新しいデータでの誤差の違いから見分けられる
  • 訓練データ・検証データ・テストデータの役割と、検証データでモデルを選ぶ方法を説明できる
  • 正則化(重みの大きさに罰を与える)と早期終了で、過学習を防ぐしくみを説明できる

直感で理解する

試験の前に、過去問の答えを丸暗記した人を考えてみましょう。同じ問題が出れば満点ですが、少し変えた問題には答えられません。機械学習でも同じことが起きます。訓練データに合わせすぎて、新しいデータで性能が落ちる状態を 過学習 と呼びます。

2.2 の続きとして、今度は速度と停止距離(空走距離+制動距離)の関係を、10件のデータから学ぶことにします。停止距離は速度の2乗に比例する部分を含むので、曲線になります。1次式(直線)、2次式、9次式の3つのモデルを当てはめてみましょう。次数が大きいほど、曲がりくねった複雑な曲線を表せるモデルです。

20 80 20 80 20 80 1次式(直線):単純すぎ 訓練 6.7 / 新しいデータ 7.3 2次式:ちょうど良い 訓練 5.0 / 新しいデータ 4.2 9次式:覚えすぎ 訓練 0.0 / 新しいデータ 1010 横軸:速度(20〜80 km/h)、縦軸:停止距離(0〜55 m)
同じ10件の訓練データ(色の点)に、次数の違う3つのモデルを当てはめた例。灰色の点は学習に使っていない新しいデータ。上の数字は、訓練データと新しいデータでの誤差(MSE、m²)。数値は説明用の例。

1次式は曲がりを表せず、どのデータからも少しずつ外れています(学習不足)。9次式は10個の点をすべて通るので、訓練データでの誤差は0ですが、点と点の間で大きく波打ち、時速77kmでは停止距離を「−49 m」と予測してしまいます。2次式は点をぴったりとは通りませんが、新しいデータにはいちばんよく当たります。

数式で確かめる

① 訓練データの誤差と、新しいデータの誤差

モデルの次数を変えながら、2つの誤差(MSE)を比べます。

モデルの次数123579
訓練データの誤差6.75.05.04.02.00.0
新しいデータの誤差7.34.24.39.1791010

モデルを複雑にするほど、訓練データの誤差は下がり続けます。ところが新しいデータの誤差(汎化誤差)は、はじめは下がり、ある所から上がり始めます(U字の形)。単純すぎるモデルは本当の形を表せない「かたより」で、複雑すぎるモデルはデータの偶然のばらつきにまで合わせてしまう「ぶれ」で、それぞれ誤差が大きくなります。

また、データ自体に含まれるばらつき(今回は約 3.5 m²)より小さい誤差は、本来は出せません。訓練データの誤差がそれを大きく下回っていたら、覚えすぎを疑います。

② データを3つに分ける

  • 訓練データ:パラメータを学ぶのに使う
  • 検証データ:モデルの複雑さや学習率など、人が決める設定(ハイパーパラメータ)を選ぶのに使う
  • テストデータ:最後に一度だけ、本当の性能を測るのに使う

上の表の「新しいデータ」を検証データとして使えば、2次式を選べます。ただし、検証データを見ながら何度も選び直すと、今度は検証データに合わせすぎてしまいます。そのため最終的な評価は、一度も使っていないテストデータで行います。データが少ないときは、分け方を変えながら検証を何度もくり返して平均する 交差検証 も使われます。

③ 正則化:重みの大きさに罰を与える

9次式の係数を見ると、±958 のような大きな値になっていました。重みが大きいと、入力が少し変わっただけで予測が大きく動き、曲線が波打ちます。そこで損失に「重みの大きさ」への罰を足します。

$$L' = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2 + \lambda \sum_{j} w_j^2$$

λ(ラムダ)は罰の強さです。重みの2乗の和を罰にするこの方法は リッジ回帰(L2正則化)と呼ばれ、一般に 正則化 といいます。9次式に正則化をかけると、次のようになります。

罰の強さ λ00.0010.010.11
訓練データの誤差0.02.63.34.011.1
新しいデータの誤差10103514.67.512.9

罰を強めるほど曲線はなめらかになり、新しいデータの誤差が下がります。ただし強すぎると、今度は単純すぎて学習不足になります(λ = 1)。λ も検証データで選びます。ほかにも、検証データの誤差が上がり始めた所で学習を止める 早期終了(2.3)や、データそのものを増やすことも、過学習を防ぐ有効な方法です。

自動運転との接点

  • 「テストで高得点」の中身を確かめる:同じ走行ルートや同じ日の画像が、訓練データとテストデータの両方に入っていると、似た画像を覚えているだけで高い点が出ます(データの漏れ)。場所・日・車両ごとにまとめて分けてテストします。→ 2.8 データの分け方と分布シフト
  • テストデータを何度も使わない:テスト結果を見てモデルを直すことをくり返すと、テストデータに合わせすぎてしまいます。安全の証拠にする最終評価のデータは、開発に使うデータと分けて管理します。→ 5.10 セーフティケース
  • 稀な場面ほど過学習しやすい:雪の日や特殊な車両のようにデータが少ない場面では、少数の例を覚えるだけになりがちです。全体の平均だけでなく、場面ごとの性能を分けて確かめます。→ 2.7 評価指標
  • なめらかさは安全の味方:正則化されたモデルは、入力が少し変わっても出力が大きく変わりにくくなります。これはセンサのノイズや小さな乱れに対する強さ(頑健性)にもつながります。→ 3.8 頑健性と敵対的サンプル

まとめ

  • 過学習は、訓練データに合わせすぎて新しいデータに弱くなること。訓練データの誤差だけが下がり、新しいデータの誤差が上がっていたら疑う
  • データは訓練・検証・テストに分ける。複雑さなどの設定は検証データで選び、テストデータは最後に一度だけ使う
  • 正則化(重みの大きさに罰を与える)や早期終了で、なめらかで新しいデータにも当たるモデルにする。罰が強すぎると学習不足になる

確認クイズ

Q1. 訓練データでの正解率は99%、検証データでは75%でした。何が起きている?

過学習です。訓練データを覚えてしまい、新しいデータに当てはまっていません。モデルを単純にする、正則化を強める、データを増やす、早期終了を使う、などを試します。

Q2. 訓練データで80%、検証データで79%。どちらも目標の95%に届きません。どうする?

2つの差が小さく、どちらも低いので学習不足です。より表現力のあるモデルにする、役に立つ入力(特徴)を加える、正則化を弱める、などを試します。

Q3. 正則化の強さ λ を大きくしすぎると、どうなる?

重みが小さく抑えられすぎて、モデルが単純になり、学習不足になります。表の例では、λ = 1 で訓練データの誤差も新しいデータの誤差も大きくなりました。

Q4. 同じ交差点で撮った動画の連続したフレームを、ランダムに訓練データとテストデータに振り分けました。何が問題?

ほとんど同じ画像が両方に入るので、テストの点が実力より高く出ます(データの漏れ)。場所や日ごとにまとめて、訓練とテストに分ける必要があります。

もっと知りたい人へ