深層学習day2 Section3:過学習

要点まとめ

過学習とは、訓練用データにのみ過剰に適応してしまい、汎化性能が低下してしまった状態で、訓練誤差とテスト誤差とに乖離が生じてしまう状態。

原因は下記のような原因でネットワークの自由度が高すぎること。

  • パラメータ数が多い
  • パラメータ値が適切ではない
  • ノードが多い

正則化、即ち ネットワークの自由度に制約を加えることで、過学習を抑制することができる。

L1正則化、L2正則化

 
  \displaystyle 
  \boldsymbol{\phi}(x_i) = (\phi_1(\boldsymbol{x}_i), \phi_2(\boldsymbol{x}_i), \cdots, \phi_k(\boldsymbol{x}_i))^T \in \mathbb{R}^k

 
  \displaystyle 
  \newcommand{\partialdiff}[2] {\frac{\partial {#1}}{\partial{#2}}}

重みが大きいと訓練データに適応しすぎてしまい、過学習が起きる。誤差関数にpノルムを加えることで、重みの大きさに制約を加え、過学習を抑制する。

pノルムとは

 
  \displaystyle 
  ||\boldsymbol{x}||_p = (|x_1|^p + |x_2|^p + \cdots + |x_n|^p)^{\frac{1}{p}}

L1ノルム

スパース推定。重みを0にしやすい。


  \displaystyle
  ||\boldsymbol{x}||_1 = (|x_1| + |x_2| + \cdots + |x_n|)

パラメータ更新の場合は微分を考える必要がある。

 
  \displaystyle
  |x| = 
  \begin{cases}
    x & (x>0) \\
    -x & (x<0)
  \end{cases} \\
  \partialdiff{|x|}{x} = 
  \begin{cases}
    1 & (x>0) \\
    -1 & (x<0)
  \end{cases}

微分結果は符号になるので、pythonでの実装は、

f:id:yui-gen-ron:20211216121213p:plain

L2ノルム

重みは小さくはなるが、0にはなりにくい。


  \displaystyle
  ||\boldsymbol{x}||_2 = \sqrt{(|x_1|^2 + |x_2|^2 + \cdots + |x_n|^2)}

微分したときに都合が良いように、\frac{1}{2}を掛けるのが定番。

 \displaystyle{
  \partialdiff{}{x} (\frac{1}{2}x^2) = x
}

Pythonでの実装は、 f:id:yui-gen-ron:20211216124839p:plain

f:id:yui-gen-ron:20211215210950p:plain

実装演習

f:id:yui-gen-ron:20211216083905p:plain

確認テスト等考察

Lasso, Ridge 共にメリット・デメリットがあり、Pythonの実装も覚えておく必要がある。

追加演習