FC2ブログ

BatchNormalizationとは DeepLearningを流行らせた技術

BatchNormalization


今回はBatchNormalizationの説明します。

BatchNormalizationは2015年に発表され、大半のDeepLearningモデルにおいて組み込むだけで、精度が向上する重要な技術です。
ImageNetの画像分類ではBatchNormalizationを入れただけで5%の精度向上が報告されています。
元の論文はこちら

BatchNormalizationとは


BatchNormalizationはDeepLearningにおける各ユニットの出力をバッチごとにNormalize(正規化)する手法になります。
もともとDeepLearningのモデルではモデル内部で各ノードの出力がトレーニング時に変化することが問題となっていました(内部共変量シフト)。

各ノードの出力はその次のノードの入力になります。
1回目の訓練中(イタレーション)では(a)という分布の出力を1層目のノードは出力し、2層目のノードはそれを入力データとして学習します。
しかし、1回目の訓練が終わるとノードの重みが更新されるため、2回目の訓練中には1層目のノードは(b)という1回目と違う分布の出力を2層目のノードに渡します。このように訓練による重みの更新で出力が変化していくことを内部共変量シフトと呼びます。
2層目のノードは(a)の分布の入力データをもとに重みを最適化していたため、(b)の出力に対して新たに重みを最適化する必要があり、効率が悪くなってしまいます。

internal_covariate_shift.png

2層目のノードにとっては、毎日お客でアメリカ人が来るから英語を勉強していたら、いきなりインド人がやってくるみたいな感じ...笑

内部共変量シフトは層を重ねることに大きくなっていくので、DeepLearningを行う上で大きな問題となります。

学習率(Learning rate)を小さくして、重みの更新を少しずつ行えば、内部共変量シフトを軽減されますが、そうすると学習にかかる時間が長くなってしまします。

そこで、各ノードの出力の分布を毎回、同じにするために、各ノードの出力を正規化すればいいというアイデアが生まれました。これがBatchNormalizationです。

internal_covariate_shift2.png

BatchNormalizationを加えることで、学習率を大きくしても各ノードの出力が変化せず、学習が加速します。

BatchNormalizationを入れる利点

・学習が早くなる。

・正則化効果があり、ドロップアウト等を使用する必要性が少なくなる。

・重みの初期値への依存性が小さくなる


BatchNormalizationの式

eq2_bn.png

ここでΓ:スケールとβ:バイアスはモデルの訓練中に最適化されるパラメーターです。
この2つのパラメーターでNormalizationをしてもモデルの表現力が失われないようにしている模様。

Normalizationあるなしでの各層の出力


5層(各層100個のノード)に活性化関数にsigmoidを用いた場合の各層の出力分布をみていきます。

・Normalizationなし

activate_wobn.png
層を重ねるごとに出力分布がはじめの分布から外れていく(0,1付近に位置する値が増えている)。sigmoid関数で0と1に出力される値は勾配をほとんど持たないので、学習がうまく進まない。

・Normalizationあり

activate_wbn.png
層を重ねるても歪にはなるが、ガウス分布の形を維持される。


BatchNormalization 個人的所感

超強力です。

深層学習やるなら使うべき

なぜこんなに効くかは解明されていないところが多いので、今後に期待

実は内部共変量シフトはそこまで影響しないとかいう話もある


スポンサーサイト



コメント

非公開コメント