しえログ

qiita との使い分けに悩んでる

Batch Normalization について軽くまとめ

Deep Learning の基礎学習の一環として名前だけ聞いたっきりになっていた Batch Normalization についてゼロから作る Deep Learning に載っていたので軽く読んで勉強した。

Batch Normalization とは

[1502.03167] Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

2015 年に Google の Loffe さんらによって提案された手法。
ニューラルネットワークの各活性化関数における出力(activation)の分布が偏っていると色々問題を起こす可能性がある。例えば 0, 1 付近に集中していたりすると勾配消失問題が起こりやすくなるし、かといって他の特定の箇所に集中していても今度は表現力がなくなってしまい複数のニューロンが存在する意味がなくなってしまう。

解決法として活性化関数に応じた以下のような初期値設定法が提案されている。

  • 活性化関数が Sigmoid, tanh の場合
    • Xavier の初期値
  • 活性化関数が ReLU の場合
    • He の初期値

適切な初期値の設定とはまた別として、分布に適度な広がりをもたせたいわけだが、そこで Batch Normalization が考案されている。
具体的には

  • 学習係数を適度に大きくし学習の進行速度を上げられる
  • 初期値にそれほど依存しない
  • 過学習を抑制する

などの利点が。
やることはデータ値の平滑化なので計算は難しくない。

計算法

{m} 個の入力データ値を平均0、分散1に平滑化する形で変換する以下の様な写像 {\mathbf{BN}_{\gamma,\beta}} となる。

{\mathbf{BN}_{\gamma,\beta} \colon \{x_i\}_{i=1}^m \to \{y_i\}_{i=1}^m}

1. 平均を求める: {\mu_B \gets \displaystyle \frac{1}{m}\sum_{i=1}^m x_i}
2. 分散を求める: {\sigma^2_B \gets \displaystyle \frac{1}{m}\sum_{i=1}^m (x_i-\mu_B)^2}
3. 平滑化する: {\hat{x}_i \gets \displaystyle \frac{x_i-\mu_B}{\sqrt{\sigma^2_B+\varepsilon}}}

  • {\varepsilon} はゼロ除算対策の微小値

4. あらかじめ定めておいたパラメータでもってスケーリングする: {y_i \gets \gamma \hat{x}_i + \beta}

この {y_i} を各層の活性化関数の出力として置き換えることでデータの Batch Normalization が完了する。

原著論文周辺

このやり方によって当時の SoTA な画像分類モデルにおいて学習ステップを1/14に減らしたらしい。

ただ、今となっては Loffe からさらに新しく Batch Renormalization という手法が提案されている。
これはミニバッチのサイズが小さかったり、その中のサンプルに独立性があまりない場合に Batch Normalization がそれほど有効でなかった問題を解決したもので、ミニバッチにあまり関係なく独立性を保てる工夫がされているらしい。

[1702.03275] Batch Renormalization: Towards Reducing Minibatch Dependence in Batch-Normalized Models