バッチ正規化(Batch Normalization)とその発展型

1. バッチ正規化 (Batch Normalization)の概要

バッチ正規化(Batch Normalization) [Ioffe and Szegedy, 2015] は,主に畳み込みニューラルネットワーク(CNN)の隠れ層において,バッチ内のデータ分布をもとに,各チャンネルごとに,特徴を正規化したのちスケール・シフトを行う微分可能な変換(層)である.バッチ正規化は,元のCNNの表現力を保ちつつも,学習の収束の高速化と安定化を達成できる.

この記事では,「バッチ正規化層の説明 (2節)」と,「各発展型の導入的な紹介(3節)」を行う.

[Ioffe and Szegedy, 2015]で提案されて以降,バッチ正規化はCNNで標準的に用いられる部品(= 層)となった.バッチ正規化の登場以前は,CNNの基本繰り返し構造といえば「畳み込み層(線形) – ReLU(活性化関数)- プーリング層」の3要素構成であった.それが「畳み込み層(線形) – バッチ正規化 – ReLU(活性化関数)- プーリング層」の4要素構成へと変わることとなった.

その後クラス識別CNNだけでなくRNN,GAN,画像対画像変換,Transformerなど向けなど,「系列モデル向けのもの」,「学習が不安定なGANによる学習が安定化するもの」,「より多層で大規模なCNN向けのもの」など,様々な発展型が登場することで,バッチ正規化が使用されるディープラーニング応用が増えていった(3節).

1.1 計算方法の概要と,その性質

2節で詳しく述べるバッチ正規化の計算手順(2.1)と性質(2.2)ついて,その導入としてここで簡潔にだけ述べておきたい.

バッチ正規化層の学習では,線形層の出力のうち$k$チャンネル目の出力$x^{(k)}$のそれぞれについて,チャンネル毎に正規化された固定分布を学習中に求めたい.そこで,バッチ内の同一チャンネルの$m$個の特徴$\mathcal{B}= \{x_n^{(k)}\}^{m}_{n=1}$に対して以下の処理を行う:

  1. バッチ内で正規化し$\hat{x}^{(k)}$を得る (スケール1, 平均0の分布にする).
  2. 正規化済み$\hat{x}^{(k)}$を固定分布$y^{(k)} = \gamma^{(k)} \hat{x}^{(k)} + \beta^{(k)}$へ変換する.

手順1で正規化するだけでも学習は高速に収束するようになるが,それだけだと全チャンネル同じ分布になりCNNの表現力が落ちる.よって,手順2でスケール・シフトをさせることで,バッチ正規化層挿入前の変換を保つようにすることで,挿入前のCNNの表現力を保てる仕組みになっている.

このように,各中間層出力を固定分布へ変換できるようにしていきながら(主に)CNNを学習することで,SGD学習を安定化・高速化できるようになった (2.1節).バッチ正規化の登場以降,層数の多い深めのCNNを学習する時に,学習率の値を高めに設定しても,勾配爆発・勾配消失を起こさずに学習安定させつつ,しかも速い時間での収束を実現しやすくなった(2.2節).

また,バッチ正則化には正則化(regularization)の効果もある(2.2.1節).これに伴い,それまでCNNの正則化で定番であったドロップアウト(dropout)や局所応答正規化が不要となった.

1.2 記事の構成

以降のこの記事では,以下の構成でバッチ正則化(2節)およびその発展(3節)について,以下の構成で紹介する:

  • 2. バッチ正規化の詳細
    • 2.1 計算手順
    • 2.2 バッチ正規化の内容・性質の理解
    • 2.3 課題と弱点
  • 3. バッチ正規化の発展系
    • 3.1 レイヤー正規化
    • 3.2 インスタンス正規化
    • 3.3 グループ正規化
  • 4 まとめ

2. バッチ正規化 (Batch Normalization) の詳細

2節では,最初にバッチ正則化の手順について紹介し(2.1節),その上で,バッチ正規化の仕組みの意味・効果(2.2)および課題(2.3)について順に触れたい.

2.1 計算手順

バッチ正規化は,学習時(A)とテスト時(B)で少し異なる計算を行う.それぞれに分けて計算手順を紹介する.

(A) 学習時の計算

概要:線形層の出力応答の$c$番目の出力$x^{(c)}$に対して,1バッチ内で正規化したあと,スケーリング・シフトも行う.SGD中にスケール・シフト係数も同時に学習されていくことで,チャンネル内の出力$x^{(c)}$は,学習済みの固定分布から出力されるようになっていく.

バッチ正規化(Batch Normalization)
図1 バッチ正規化. バッチ内全体で,チャンネル単位にそれぞれ正規化を行う.

バッチ正規化は,CNNの隠れ層である畳み込み層(もしくは全結合層)の出力の特徴マップの,学習中のミニバッチ集合$\mathcal{B} = \{\bm{x_1},\bm{x_2},\ldots,\bm{x_N}\}$に対して,バッチ内でチャンネルごとの正規化を行う(図1).

この節では,SGD中に,ランダムに取り出されたサイズ$N$のミニバッチ内のみの動作を考えたい.そこで2.1-(A)節では$x^{(c)}$にのみフォーカスした計算手順を示したいので,各変数からはチャンネルの添字$c$を省略する.

バッチ内の特徴マップ$\bm{x} \in \mathbb{R}^{W \times H \times C}$ ($W$は幅,$H$は高さ,$C$はチャンネル数)から,チャンネル$c$の特徴$x^{(c)}$のみを取り出した集合を$\mathcal{B}= \{x_i\}^{m}_{i=1}$とする.ここで,$m$は畳み込み層の場合,バッチ内のチャンネル内特徴$x_i$の総数は$m= W \times H \times \textcolor{blue}{N} $であり,図1の各同一色部分の総数が$m$に相当する.すなわち,畳み込み層の場合だと,バッチ内のチャンネル$c$の特徴$m$個に対してそれぞれチャンネル毎の特徴正規化を行う(※ 全結合層の場合は$m=N$であるが,ここでは畳み込み層直後のバッチ正規化の挙動を紹介したいので,畳み込み層のケースのみを考えたい).

学習時の計算手順であるが,「1.概要」でも既に述べたとおり,まずバッチ集合$\mathcal{B}$の中で,各チャンネル$c$ごとに,平均0,分散1にする$x_n$の正規化を行う.その後,$\gamma$でリスケール,$\beta$でリセンタリング(シフト)するという手順である (※ 平均0, 分散1に整えるのは「標準化」と呼ぶことが多いが,この研究では「正規化」と読んでいることに注意.).

以上の学習時の計算手順を,学習時のチャンネル$c$での,バッチ正規化層$BN_{\gamma,\beta}(x_i)$の計算手順アルゴリズムとして以下にまとめる:

  • チャンネル$c$内のバッチ平均を計算:\begin{equation} \mu_{\mathcal{B}} \leftarrow \frac{1}{m} \sum_{i=1}^m x_i \end{equation}
  • チャンネル$c$内のバッチ分散を計算:\begin{equation} \sigma_{\mathcal{B}}^2 \leftarrow \frac{1}{m} \sum_{i=1}^m (x_n – \mu_{\mathcal{B}})^2 \end{equation}
  • ミニバッチ内$N$個の特徴マップ内の,各特徴量$x_i$について1,2の順で計算:
    1. (チャンネル$c$での)正規化:\begin{equation}\hat{x_i} \leftarrow \frac{1}{\sqrt{\sigma^2_{\mathcal{B}} + \epsilon}} (x_i – \mu_{\mathcal{B}})\end{equation}
    2. スケーリングとシフト:\begin{equation} y_i \leftarrow \gamma \hat{x_i} + \beta \equiv BN_{\gamma,\beta}(x_i)\end{equation}
  • CNNの学習が終了すると,このバッチ正規化層のパラメータの学習も終了.

このアルゴリズムにより,各$c$チャンネルのニューロン出力値$x_i$はどれも,バッチ内の正規化と$\gamma, \beta$で表現される固定分布に少しずつ収束していく.

以上で示した$x_{(c)}$の処理は,$c$次元目の特徴$x_1,x_2,\ldots,x_{N \times W \times H}$の全てで行われるので,SGDが終了すると,パラメータ$\gamma^{(c)},\beta^{(c)}$が全ての$c$で学習され,$\{\gamma^{(c)},\beta^{(c)}\}_{c=1}^{C}$が手に入る.これで学習フェーズは終了である.

学習中,各チャンネル$c$での分布のスケール量$\gamma^{(c)}$とシフト量$\beta^{(c)}$が,それぞれ独立で固定されていく.それに伴って,全チャンネルの隠れ層出力分布がそれぞれ固定分布に安定していくので,特徴正規化の効果により「効率的な勾配降下= 速くて安定した学習」が可能となる.

バッチ正規化の挿入箇所

各線形層(全結合層 or 畳み込み層)では,バッチ正規化を挿入しない場合,式(2.1)のように入力$\bm{x}$がアフィン変換される:

\begin{equation} \bm{h} = f(\bm{W}^{\mathsf{T}}\bm{x} + \bm{b}) \tag{2.1}\end{equation}

ここで$f(\cdot)$はReLUなどの活性化関数で,$\bf{W}$が結合重み行列で$\bm{b}$がバイアスベクトルである.

式(2.1)で$f(\cdot)$を実施する直前に,バッチ正規化の変換$BN_{\sigma,\gamma}(x)$を挿入したい.この時,式(2.1)の代わりに以下の変換式(2.2)を実施する:

\begin{equation} \bm{h} = f(BN_{\gamma,\beta}(\bm{W}^{\mathsf{T}}\bm{x})) \tag{2.2}\end{equation}

ここで,(2.2)式にバイアス$\bm{b}$がないのは,$\beta$がバイアスと同じ役割を担当して不要になったからである.以上が,学習時のバッチ正規化処理である.

(B) テスト時の計算

学習時には,ランダムなミニバッチ内を毎回正規化し,その各隠れ層出力の暫定的な正規化結果により,チャンネル$c$ごとに,パラメータ$\gamma^{(c)},\beta^{(c)}$を学習していた.しかし,テスト時にはミニバッチを得ることはできない.よってテスト時は,データセット全体から決定しておいた平均・分散を常に用いて$BN_{\gamma,\beta}(x_i)$を実施する必要がある.

そこでまず学習時に準備として,学習データ全体のバッチ平均$E^{(c)}[x]$とバッチ分散$Var^{(c)}[x]$を,各チャンネル$c$においてそれぞれ算出しておく(※ $\epsilon$はゼロ除算回避目的の定数):

$$E^{(c)}[x] \leftarrow E^{(c)}_{\mathcal{B}} [\mu_{ \mathcal{B}}]$$

$$Var^{(c)}[x] \leftarrow \frac{m}{m-1} E_{\mathcal{B}}^{(c)}[ \sigma^2_{ \mathcal{B} }] $$

次に,テスト時は,これらを用いて$y^{(c)} = BN_{\gamma^{(c)},\beta^{(c)}}(x^{(c)})$を以下のように計算する:

$$y^{(c)}= \frac{\gamma^{(c)}}{ \sqrt{Var^{(c)}[x] + \epsilon} } \cdot x^{(c)} + (\beta^{(c)} – \frac{\gamma E^{(c)}[x]}{ \sqrt{Var^{(c)}[x] + \epsilon}}) $$

こうすることで,テスト時はデータセット全体の統計$E^{(c)}[x], Var^{(c)}[x]$を用いてのバッチ正規化を実行できる.

2.2 バッチ正規化の内容・性質の理解

2.1節で先にアルゴリズムを示したことを踏まえて,2.2節ではその中身を理解するための,バッチ正規化の各性質や長所短所について,順に触れていきたい.

2.2.1 中間層分布のコントロールによる,最適化の容易化.

バッチ正規化の1番の大きな貢献は,SGD学習中に隠れ層の$c$次元目特徴の分布を,それぞれ正規化後にスケール・シフトされた固定分布へコントロールする仕組みである.これにより,隠れ層の分布がチャンネル$c$ごとに正規化され,SGD学習が安定・高速に収束できるようになった.

これまで学習が不安定で収束に苦労していたネットワーク構造でも,バッチ正規化を導入するだけで,学習を高速に安定して成功させられる.白色化と違って無相関化は行わずに正則化だけを行うバッチ正規化であるが,それでも十分SGDの収束を速くするので効果が高い.

「ニューラルネットワークの正規化」という観点では,以前は,入力層でのみ正規化や白色化 [Lecun et al., 1998]を頑張っていた.しかし,内部共分散シフトは収束の鈍化や勾配爆発・勾配消失を招きやすい.よって,それらを防ぐために当時(2015まで)のCNNでは,(1)繊細な重みの初期化や,(2)学習率を低めにおさえた (ゆっくりな) 学習,が必要であった.

それが,バッチ正規化が提案の導入により.(1) 重みパラメータの初期化も容易になり(= 適当で済むようになり),(2)高い学習率の値を用いて学習を高速化しやすくなった (※ ちなみにバッチ正規化の論文 [Ioffe and Szegedy, 2015] の時点では,ReLU [Nair et al., 2010]は登場済みであり,実験中でも使用されている)

元論文の主張:「内部共分散シフトの削減」が最適化の向上に効いている.

SGDを用いたCNNの学習では,各層の分布間の形が学習中に大きく変化してしまうと学習が遅くなってしまったり,学習率が高過ぎると勾配消失・勾配爆発が行って収束できない問題を抱えていた.

バッチ正規化の著者らは,ディープニューラルネットワークの学習中に,(お互い離れた)隠れ層間で生じていく共分散シフトのことを内部共分散シフト (Internal Covariate Shift)と名付けた.その内部共分散シフトが起きると,学習の難易度難易度が上がるので「CNNの楽な最適化の実現には,解決すべき問題」と定義した.そして「バッチ正規化が,内部共分散シフトを減らすので,CNN最適化を容易にする」と主張していた [Ioffe and Szegedy, 2015]

代わりに効いていたもの:「安定」で「平滑な」最適化問題への再パラメータ化.

しかし,その後の研究[Santurkar et al., 2018]では「内部共分散シフトの削減」がCNNなどのSGD最適化の改善に効いているという元論文[Ioffe and Szegedy, 2015]の主張に対して,VGGNetによる実験結果を元に「内部共分散シフトの削減という視点では,バッチ正規化はほぼ効果が出ておらず,最適化の向上には役立っていない」と反論した.そしてバッチ正規化が,SGD最適化を助けている代わりの要因として,以下の2点を主張した:

  1. より「安定な」最適化問題への再パラメータ化:(ロスのリプシッツ連続性の観点で)
  2. より「平滑な」最適化問題への再パラメータ化:(ロスのβ-平滑化の観点で)

2.2.2 Batch Normalizationの正則化の効果

バッチ正規化を用いると,SGDでランダムなバッチ選択を行うことを通じて,学習する固定分布にもランダム性(ノイズ)が追加される.従って,元のデータセットの分布と異なる分布に各中間層の特徴の分布を学習していくので,正則化(regularization)の効果も生まれる(少々ではあるが).

バッチ正規化登場以前は,バッチ正規化と同じくランダムノイズ挿入による正則化に相当するドロップアウトを使用してディープニューラルネットワークの正則化を行っていた.しかし,バッチ正規化が定着して以降は,ドロップアウトは必要なくなり使用されなくなった.また,AlexNetで提案され,Inception等でも使われていた局所応答正規化(Local Response Normalization)も,同じく必要性がなくなり,その後使われなくなっている.

2.3 課題と弱点

以上のように,特にCNN向けの便利な新部品として登場したバッチ正規化層であるが,最初の提案の時点では,たとえば以下のような課題や弱点があった:

  • バッチサイズが小さいと(例えば,サイズ1や2だと),データ統計分布が小さくてうまく正規化できず,バッチ正規化の効果が発揮できない.よって,小さなバッチで学習する必要のある「大規模モデル」を学習しづらい.
  • バッチサイズが大きいほど,正則化の効果が減ってしまう(汎化性能向上に寄与しなくなる)
  • 動画向けに使用すると,隣接フレーム同士で相関が高く,平均・分散の推定が安定せず学習がなかなか進まない.

よって,これらの課題を克服していく目的で,バッチ正規化の発展系(3節)が提案されていく.また,発展型の提案を通じて,CNN以外のロス関数やニューラルネットでも応用されていく(RNNやGAN,pix2pixなど).

3. バッチ正規化 (Batch Normalization) の発展型

3節では,2.3節の初期の課題を元に提案されていった「代表的なバッチ正規化の発展系」について,それぞれの応用にカテゴリ分けし,簡単にだけまとめる (重要な手法は,別記事に分けて詳細を執筆したい).

3.1 レイヤー正規化: RNNなど自然言語処理の系列モデル向け

レイヤー正規化
図2 レイヤー正規化

レイヤー正規化(Layer Normalization)は,バッチ正規化の改善版として,正規化方向をチャンネル方向から「層方向」に変更し,現在の層の値全部だけで正規化するものである (図2).レイヤー正規化は,RNNseq2seqに,TransformerやBERTなどの「自然言語処理用の系列モデル」でよく使用される.逆にCNNではあまり用いない.

チャンネル方向に正規する「バッチ正規化」の場合,各サンプル系列の長さが違うとバッチ内合計数が一定でないので,平均・分散を同一の分母で計算できなかった.それがレイヤー正規化層は層単位の全チャンネルを用いた正規化であるゆえ,各ステップ$t$で層ごとに正規化でき,可変長入力にも問題なく適用できる.また,正規化がバッチサイズに依存していないおかげで,例えばバッチサイズ1だけの短いバッチ長でも正規化が可能である.

レイヤー正規化では,RNN・LSTMに対してより適した正規化+スケーリングが行えるようになった (※ ただしバッチ正規化の挿入でも,LSTMの学習はある程度速くなる).

一方で,全チャンネルの特徴を混ぜて,サンプル毎に正規化するので,バッチ全体の(チャンネルごとの)特徴の統計は捉えることができないので,CNNではうまく機能しない.

3.2 インスタンス正規化 と 適応的インスタンス正規化 (AdaIN):ニューラルスタイルトランスファーむけ

インスタンス正規化
図3 インスタンス正規化.インスタンス内チャンネル単位で正規化を行う.

インスタンス正規化(Instance Normalization) [Ulyanov et al., 2016] [Ulyanov et al., 2017]は,画像一枚単位でチャンネルごとのバッチ正規化を行う発展型の1つである(図3).

ニューラルスタイルトランスファーで,よく用いられる.また適応的インスタンス正規化 (AdaIN: Adaptive Instance Normalization) [Huang and Belongie 2017] は,コンテンツ画像とスタイル画像の間で,適応的に調整を行う機能が追加さた.これにより,1モデルだけであらゆるスタイル画像を参照入力として変換できるスタイル変換モデルが実現された.

ニューラルスタイルトランスファー以外でも,インスタンス正規化は pix2pixHD [Wang et al., 2018]など画像対画像変換でも用いられている.また,画像生成GANにおいても,適応的インスタンス正規化がStyleGAN [Karras et al., 2019]などで応用されている.

3.3 グループ正規化 (Group Normalization):他タスクへの大規模CNN向け改善.

図4 グループ正規化.インスタンス内グループ単位で正規化を行う.

グループ正規化 (Group Normalization) [Yuxin and He, 2018] は,画像1サンプル(インスタンス)内のグループ単位の正規化(デフォルトは32グループ)を行うことで,効率計算かつ性能保持を可能にした (図4).

グループ正規化により,元祖のバッチ正規化 [Ioffe and Szegedy, 2015] が不得意で有効に使用できなかった「バッチサイズが大きくできない,小バッチサイズで複数GPUを用いて学習する問題 (例:物体検出/インスタンスセグメンテーション/動画アクション認識など)」に使用し,CNNの学習を安定・高速化させることができるようになった.

[Yuxin and He, 2018] の実験では,高画質入力画像を使いたいので1 or 2画像/バッチ × 8GPUくらいの小バッチサイズで学習する「Mask R-CNNのfine-tuning」で実験を行い,バッチ正規化よりも高速に学習でき,認識精度も向上することを確認した.更には「事前学習なしに,スクラッチから」Mask R- CNNを学習できるようになる事も示した.

また,動画入力から3DCNN特徴を計算するためバッチサイズが4 or 8クリップしか使えない「アクション認識(Action Recognition)」においても,バッチ正規化よりも高速かつ精度よく学習できることを示した.

ちなみにグループ正規化は,レイヤー正規化(3.1)同様「バッチ数に依存していない正規化」であるので,レイヤー正規化のように系列モデルにも有効に機能する.そもそもグループ正規化は,レイヤー正規化とインスタンス正規化の両方の分割方向を使用した手法であるので,2者の中間解の提案であったともみなせる(※ この意味では,管理人としては「インスタンスグループ正規化」とでも著者らには命名して欲しかったとも思う).

4 Batch Normalization のまとめ

この記事では,バッチ正規化の基本と,その代表的な発展型であるレイヤー正規化•インスタンス正規化・グループ正規化の概要紹介を行った.

バッチ正規化の登場により,まずは画像識別CNNが「高速で安定な学習」を手に入れた.そして,レイヤー正規化の登場でRNNやTransformerもその恩恵を得ることができるようになり,グループ正規化では,物体検出/インスタンスセグメンテーション/アクション認識のCNNも,バッチ正規化の仕組みの恩恵を得られるようになった.

References

  • [Huang and Belongie 2017] X. Huang and S. Belongie. Arbitrary style transfer in real-time with adaptive instance normalization. In ICCV 2017.
  • [Ioffe and Szegedy, 2015] S. Ioffe and C. Szegedy, “Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift” In ICML , 2015.
  • [Karras et al., 2019] T. Karras, S. Laine, and T. Aila. A style-based generator architecture for generative adversarial networks. In CVPR 2019.
  • [LeCun et al., 1998] LeCun, Y., Bottou, L., Orr, G., and Muller, K. “Efficient backprop” In Orr, G. and K., Muller (eds.), Neural Networks: Tricks of the trade. Springer, 1998b.
  • [Nair and Hinton., 2010] Nair, V., Hinton, G.E.: Rectified linear units improve restricted boltzmann machines. In, ICML 2010.
  • [Santurkar et al., 2018] Santurkar, S., Tsipras, D., Ilyas, A., & Mądry, A. “How Does Batch Normalization Help Optimization?” In NeruIPS, 2018.
  • [Ulyanov et al., 2016] Ulyanov, D., Vedaldi, A., Lempitsky, V. ” Instance normalization: The missing ingredient for fast stylization” arXiv:1607.08022 (2016)
  • [Ulyanov et al., 2017] Ulyanov, D., Vedaldi, A., Lempitsky, Improved texture networks: Maximizing quality and diversity in feed-forward stylization and texture synthesis.” In CVPR, 2017.
  • [Wang et al., 2018] T.-C. Wang, M.-Y. Liu, J.-Y. Zhu, A. Tao, J. Kautz, and B. Catanzaro. “High-resolution image synthesis and semantic manipulation with conditional gans” In CVPR, 2018.
  • [Yuxin and He, 2018] Yuxin Wu and Kaiming He. Group normalization. In ECCV, 2018.

外部参照リンク

関連記事