ディープラーニングの正規化と正則化

Python, ML07 January 2021

正規化

一般に機械学習においては、前処理においてデータを扱いやすい(学習しやすい)形に整える事。 これをしないと、特徴ごとのスケールの差でレンジが大きいものがより影響を与えてしまうのでよくない。

0 ~ 1のスケールに全特徴量を揃えるのが一般的

標準化

平均を0、標準偏差を1にする事。 データから平均を引いて、標準偏差で割る。

参考サイト

無相関化

各データの各次元に相関がなくなるようにデータを回転させる。 相関があると学習がうまくいかないことが多いため

白色化

無相関化してから標準化すること。

Batch Normalizatioin

各バッチ、各NN層ごとに標準化したい。 そもそもNNには以下の通り、内部共変量シフトと言う問題点がある。

内部共変量シフトの問題

通常の機械学習モデルと異なり、NNにおいては入力値に対して正規化を行ったとしても、層ごとに出力がなされ その値が次の入力となるので、次の層では必ずしも正規化の恩恵を受けれない。

やること

  • 各バッチごとに標準化を行う
  • スケールとシフトという調整量を用いて標準化したものを、スケール倍しシフト分加算する
  • 各層にとっては、平均0と分散1が最適なデータとは限らないから

推論時は??

学習時はミニバッチごとに平均と分散を計算できるが、仮に推論時はデータが1件だった場合どうするのかという問題 学習時に全ての平均と分散計算自体の平均を保持しておいて、学習時はそれに従い標準化する

正則化

最近のディープラーニング界隈では、モデルが過学習しづらくするために課すペナルティの事を総称して正則化と呼んでいる。

考え方

  • 基本的にシンプルなモデルの方が汎化性能が高く、複雑なモデルほどか学習しやすい。
  • 特化しやすくなってしまう
  • 同等の性能が見込めるのであれば可能な限り、シンプルにしたい

L1(Lasso), L2正則化(Ridge)

  • 各重みをなるべく小さくしたい
  • 過学習する時は、重みが大きくなる傾向がある
  • 重みが小さいということは、出力の値が大きく振れないということなので結果として、過学習を抑えると考えられる
  • 重みが小さくても精度の良いモデルにしたい

L2正則化(Ridge)

パラメータのL2ノルムを損失に加える

$$ E(W)=E_D(W)+\lambda E_W(W) $$
$$ E_W(W)=|W|^2$$
$$ \lambda は定数 $$

L1正則化(Lasso)

パラメータのL1ノルムを損失に加える

$$ E(W)=E_D(W)+\lambda E_W(W) $$
$$ E_W(W)=|W| $$

L1とL2の比較

L1正則化はL2正則化と対して変わらないのに、何が良いのか? L1正則化を使用すると重みが「スパース」になる(0値が増える)

  • メモリ削減
  • 計算楽
  • 実質特徴量選択を行ってることと同様

ドロップアウト

ディープラーニング専用の正則化方法(時間がかかるから好まれない)

ニューロンを適当に消す

  • ニューロンを適度に削除することで汎化性能が上がる
  • 実際には0を出力する
  • 毎回違うネットワークで学習してるとみなすことができるので、有効と考えられている
  • 最終的には全て復活するので、アンサンブル効果が得られる
  • 学習時に50%のニューロンで学習したら、全ニューロンの出力は2倍になるので1/2にする必要がある

tags: Python, ML