#アクティベーションの偏りの解消
アクティベーション(活性化関数を通した後の出力データ)に偏りがあると、勾配消失が起こり学習が停滞してしまったり、表現力が低下してしまうことがある。
この解決策として、重みの初期値を調節することで、アクティベーション(活性化関数を通した後の出力データ)がある程度広がりのある分布となる。
他にも、アクティベーションの偏りを解消させる手法がある。強制的にアクティベーションに広がりを持たせるBatch Normalizationである。
#Batch Normalizationの仕組み
Batch Normalizationは2015年、Ioffe、Szegedy氏によって提案された手法である。(論文)
Batch Normalizationは、その名の通り、BatchごとにNormalization(正規化)する手法である。
正規化とは、入力されたデータの平均を0に、分散を1にすることである。
Batch Normalizationを式で表す。入力データを$x_i = (i = 1 〜 n)$とすると、
$$
\mu_{B} \leftarrow \frac{1}{m}\sum_{k=1}^{n}x_i \
\sigma_B \leftarrow \frac{1}{m}\sum_{k=1}^{n}(x_i - \mu_{B})^{2} \
\hat{x_i} \leftarrow \frac{x_i - \mu_{B}}{\sqrt{\sigma_B^{2} + \epsilon}}
$$
このようにして計算された$\hat{x_i}$は、平均0、分散1と正規化されている。
さらに,$y_i = \gamma \hat{x_i} + \beta$とスケール変換されたものが最終的な出力となる。
なお、$\gamma = 1,\beta = 0$からスタートして、学習と同時に変化していく。
これが、Batch Normalizationの流れである。
Batch Normalizationをどこで行うかには様々な議論がある。活性化関数の直前で行う、または活性化関数の直後で行うのが主流である。
#Batch Normalizationの利点
Batch Normalizationはkaggleなどの多くの機械学習コンペで使用されているのが見受けられる。これはBatch Normalizationに様々な利点があるからである。
①学習がはやくなる。
これまでは、学習係数を大きくしすぎると勾配消失や勾配爆発が起こってしまうことがあるため、小さくせざるを得なかった。Batch Noramlizationを使うと、パラメータのスケールを気にしなくて良いので、学習係数を大きくすることができる。つまり、学習スピードが上がるのである。
②過学習が抑制される。
過学習とは、訓練データに特化したモデルになってしまい、新たなデータに対応する汎化性能がなくなってしまうことである。Batch Noramlizationを使うことで、過学習が抑制され、DropOutなども用いる必要性がなくなる。
③初期値の影響が小さくなる。
これまで重みの初期値も重要視されてきたが、Batch Noramlizationを利用することで、それが不必要となってくる。
特に学習速度、過学習は、機械学習において頻繁に問題となる点である。
これらを同時に解消できるBatch Normalizationの需要が高い理由も納得できる。
#まとめ
Batch Normalizationとは、強制的にアクティベーションに広がりを与える手法であり、勾配消失、表現力の低下を防ぐことができる。
他にも、学習スピードの向上、過学習の抑制、初期値依存の抑制など様々な効果を発揮する非常有用な手法である。
Batch Normalizationは入力を正規化し、スケール変換したものを出力する。基本的には、活性化関数の前後で利用される。