BatchNormalizationの復習
Batch Normalizationの復習
以下の論文を読む。
- Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
- Understanding Batch Normalization
- How does Batch Normalization Help Optimization?
そもそも何か?
BatchNormalizationは、ミニバッチ
何を実現できるか?
内部共変量シフト(internal covariate shift)を減らすことができる。内部共変量シフトとは、トレーニングの過程で各レイヤーのパラメータが変化することで生じる、特定のレイヤーに入力されるデータ分布の変化を指す。
- 後続する入力データの平均と分散を一定にできる。
- scaleとshiftを表す
によって、いかなる入力に対しても恒等変換が可能にする。例えば、0以上の値しかない特徴マップを正規化すると必ず負の値が生じるが、適切なscaleとshiftによって恒等変換が可能になる。\gamma, \beta - BNの直前のレイヤーでは、biasは不要。BNのパラメータである
がその役割を担う。\beta
- scaleとshiftを表す
- パラメータ(およびその初期値)のスケールへの勾配の依存性を減らす。
- パラメータが
倍されると、勾配はa の大きさになる。\frac{1}{a} - レイヤーのJacobianが1に近づくことにより、訓練が安定する。
- パラメータが
再現実験
MNISTでの実験。元論文の1つ目の実験を追試。Linear層のパラメータは、
最後のSigmoid活性化に入力されるある特徴量の85%点、50%点、15%点をプロットすると、BN無しの場合では特に訓練の初期の中央値はブレブレだが、BN有りの場合では中央値が0付近で安定する。
以下は元論文の実験結果。
別の観点から:Understanding Batch Normalization
BatchNormalizationの有効性は、内部共変量シフト抑えるという観点以外でも十分説明できるとした論文。
BNの効果の分解
BNの主要な効果は、学習率を大きくすることで、正則化と高速な収束をもたらすことである。
- BNによって大きい学習率でも収束が可能になる。
- 大きい学習率によって、正則化と高速な収束が可能になる。
実験的な観察
BNなしのResnetモデルを訓練するための学習率1e-4を、BNありのResNetモデルの訓練にも適用すると、そこまで良いテスト精度が得られない。BNありの状態で学習率を大きくすることで、テスト精度の改善(=正則化による汎化性能の向上)と、高速な収束が実現できる。大きい学習率だとBNなしではそもそも収束しないので、2つの効果を両立できるのは、BNのおかげと言える。
正則化の理論的背景
大きい学習率が高速な収束をもたらすのは(学習の過程で発散しない限り)ほとんど自明。一方、大きい学習率が正則化をもたらすという点はそこまで自明ではない。
大きい学習率がもたらす正則化の効果を端的に表すのが下式(論文中の(2)式)である。
2つの勾配の差異は小さいことは、訓練に使用しているデータセットにoverfitしたモデルが訓練されてしまうことを意味する。そのため、右辺はある程度大きいほうが良い。直感的には、データセット全体の勾配とはちょっと逸れる方向にいろいろ探索しながらモデルを更新していったほうが汎化性能が高まるよね、という話。
右辺を大きくする操作は、学習率
むろん、あまりにも学習率を大きくすると発散してしまうし、バッチサイズが小さすぎると訓練に時間がかかるので、バランスが大切。
BNによる発散の回避
一口に発散とっても、いくつかの観点がある。
ここでは、損失、勾配、activationという3つの観点から実証的な分析が行われている。
損失
BNによってなぜ発散が回避できるのか。訓練の最初の数回のミニバッチにおける損失を調査することで、発散の状況の把握を試みている。relative lossを損失の前ステップとの大きさの比と定義する。このrelative lossが大きいとき、発散が生じているとみなすことができる。
様々なミニバッチのサイズ(1,4,7)について、学習率(step-size)を変化させたときにrelative lossがどのように変化するかをまとめたのが以下のグラフ。BNなしだと学習率は1e-3程度が限界で、それ以上大きくすると発散していくことがわかる。BNありだとrelative lossはほぼ1のままなので、ある程度大きい学習率でも発散しなさそうだといえる。
勾配
BNの有無ごとに、学習の開始時における55番目のレイヤーの勾配のヒストグラムを以下に示す。BNなしだと、勾配のすそ野が重くなり、十分に学習率が小さくないと発散してしまうことがわかる。
activation
BNなしだと深い層に行けば行くほどactivationの平均や分散のスケールが大きくなることも観察できる。BNはこのような平均と分散の発散を、強制的に抑えることができる。
BNによる勾配の偏りの抑制
BNなしだと、初期化時点ですでにいくつかの偏りを生じさせてしまう。この状態でモデルを訓練しようとすると、勾配に偏りが生じる。
- 特定のクラスに関する勾配が偏る
- 勾配の符号の偏り
- 特定のチャネルが支配的になる
特定のクラスに関する勾配が偏る
初期化時点で、BNなしの場合は出力が特定のクラスに偏ってしまう。以下の図は、最初のミニバッチにおける最終出力に対する勾配の大きさを表したヒートマップだが、BNなしの時は一番右のクラスに関する出力の勾配のみが大きい。
勾配の符号の偏り
また、勾配は以下のように書くことができる。
以下の表の一番右の列は単純な勾配の和の絶対値、その他の列は、絶対値の和になっている。和の絶対値と絶対値の和が近い場合、符号に偏りが存在することを意味する。
特定のチャネルが支配的になる
以下の図は、特定のレイヤー(45番目)のパラメータに対する勾配の絶対値を可視化したものである。BNなしの場合は、特定の入出力に関わるチャネルのみが大きくなっている。BNありの場合は、様々なチャネルにばらけている。
重みの初期化と勾配爆発の関係
勾配爆発は重みの初期化がもたらす自然な帰結である。
近年のRandom Matrix Theoryの研究成果によると、各要素をガウス分布で初期化した行列を
- Dang-Zheng Liu, Dong Wang, Lun Zhang, et al. Bulk and soft-edge universality for singular values of products of ginibre random matrices. In Annales de l’Institut Henri Poincaré,
Probabilités et Statistiques, volume 52, pages 1734–1762. Institut Henri Poincaré, 2016.
ここで、以下のような最小化問題を考える。
- 収束が遅くなる
- より小さい学習率の必要性
- 異なる部分空間どうしの勾配の比率が増加する
深層学習のネットワークは、深くなるほど上記のような問題が生じやすくなり、
BNは、このような深層ネットワークが持つ困難を回避しているといえる。
さらに別の観点から:How Does Batch Normalization Help Optimization?
BNの有効性はなめらかな損失関数を実現できる点にあるということを突き止めている論文。
内部共変量シフトは無関係?
VGGでCIFAR-10を訓練。そのとき、BNの有無によって汎化性能が異なることは明らか(下図の真ん中)。しかし、あるレイヤーのactivationの分布を訓練ステップごとに可視化してみても、両者に大きな違いは見られない。
- BatchNormの有効性は、本当に内部共変量シフトに関連しているのか?
- BatchNormによるレイヤー入力分布の安定化は、内部共変量シフトの削減にも効果的なのか?
レイヤー入力分布の安定化は性能向上と無関係
BNの直後に、毎ステップ平均と分散が変化するノイズを加えるNoisy BatchNormという実験設定を追加する。Noisyな場合でも、BNと同様にStandardと明らかに異なる性能の向上がみられる。
Noisyな場合は、BNによって安定化されたレイヤー入力分布をわざと崩している(強制的に内部共変量シフトを起こしている、Layer #13がわかりやすい)が、それでも性能向上はそのままなので、「レイヤー入力分布の安定化→性能向上」という事実は観察できない。
BNは内部共変量シフトを減らさない
訓練のパフォーマンスに直接関連する内部共変量シフトの悪影響はあるのだろうか。あるとすれば、BNはそれを本当に抑制しているのか。
内部共変量シフトを以下のように定義する。
VGGと25層のLinear Network(DLN、SGDではなく、full-batch gradient decent)とで比較する。
驚くべきことに、BNは内部共変量シフトを減らすどころか、増やす。これはDLNだと顕著で、VGGだとBNなしのときと違いがない。また、一貫してBNありのほうが性能は良い。つまり、内部共変量シフトは性能に関係がないといえる。
BNは損失関数のリプシッツ連続性を高める
以下は、VGGの訓練の過程でパラメータを勾配の方向に動かしたときに、BNによって損失関数の安定性(リプシッツ連続性)が高まることを示した実験結果である。
(a)は、損失そのものの安定性を測ったもの。訓練ステップの過程で損失の勾配を計算し、その方向にパラメータを動かしたときに損失がどのように変化するかを測定している(🤔このとき動かすパラメータは特定のレイヤーに限定している? 影が付いているのはどういう意味?)。BNなしの場合は、特に訓練初期にLossの変動が激しい。これから、損失関数がBNによって滑らかになっているといえる。
(b)は、勾配の信頼性と予測性を測ったもの。勾配がある程度一貫していることは、最適化にとっては重要な指標。勾配と、その方向にパラメータを動かしたときの勾配を比較し、
(c)は、"effective"な(有効な)勾配の滑らかさを測ったもの。移動した距離に対する、勾配の差異(
L -Lipschitz
関数
\beta -smooth
関数
その他のNormalizationとの比較
BNの代わりに、
BNに関する理論的な分析
入力を
BNなしの時の損失を
💡数式追うのが大変なのでざっくりと
Activationから見た損失のリプシッツ性
まずは、損失関数のリプシッツ性を捉える
下式右辺の真ん中の項と最後の項はそれなりに大きくなること、
損失の2次の滑らかさ
次に、2次のオーダーの性質
パラメータから見た損失関数のリプシッツ性
以下のような表記を用いる。
この時、以下が成り立つ。こちらも、パラメータから見たときのリプシッツ定数が、BNによって小さくできることを示している。
パラメータの初期化
つまり、いかなる初期値に対しても、最適解はBNありのほうが近くに存在することを表す。
理論的な部分は、最適化周りの復習もしないと理解が難しそう。