Batch Normalization についてのメモ

# Batch Normalization

- 元論文： Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
    - https://arxiv.org/abs/1502.03167

# Abstract

前層のパラメーターによって各層への入力情報の分布が学習中に変化していくため、深層学習モデルの学習は複雑になっている。本論文では、この現象を internal covariate shift（内部共変性シフト; ICS）と呼び、正規化によってこの問題を回避する手法を提案している。特にバッチノーマライゼーション（BN）という提案手法を使用すれば、高い学習率（＝学習スピードを速める）を設定できたり、パラメーター初期値の微調整など各種問題を回避することができる。


# Introduction

## ICS について

学習中にネットワークのパラメーターが変化することで、ネットワークの活性化関数を通過したあとの分布が変わることを、internal covariate shift　（内部共変性シフト） と定義している。ICSが起こると後段のレイヤーへの入力が都度変化することになり、学習の収束性が悪くなることがある。先行研究では入力を白色化（平均0、標準偏差1、無相関化）することでICSを回避し、学習の収束スピードが速まるということが知られていた[1]。

### whiten（白色化）について

平均0、分散1、相関係数0にする操作のこと。この白色化を施すことで収束性や学習スピードが向上するということは、本論文以前から（1998年？）報告されていたことであった。ただし、特に相関係数をゼロにする操作は計算コストが高いため、深層学習で扱うデータサイズであれば非現実的であると思われる。

### decorrelation について

$d$ 次元特徴量ベクトルのデータセット {$x_1,...,x_n$} に対して、分散共分散行列は
$$
\Sigma = E[xx^T] - E[x]E[x]^T
$$
で計算される。相関係数をゼロにするということは共分散をゼロにするということで、つまり分散共分散行列を対角化することに等しい。データに何らかの変換を加え、$x^\prime$ に対して分散共分散行列を計算したときに、対角成分に分散が、その他の成分がゼロになっている対角行列となることが求められる。

これは固有値分解をすればよく（cf.主成分分析）、そういった計算コストが高いので何らかのアイデアが必要となる（ここで whiten はデータに対してではなく、中間層の出力値にそれぞれ施したいものであるので、学習中に何度も計算することになる点に留意）。


# Normalization via Mini-Batchg Statistics

## 概要

各レイヤーの入力情報の白色化は計算コストが高いため、2つの単純化のための手法を用いる。

1. 特徴量ベクトルの各次元ごとに正規化する
2. ミニバッチ単位で処理を行う

$d$ 次元特徴量ベクトルからなる、サイズ $m$ のミニバッチのデータ $\mathcal{B} = x_1,...,x_m$を考える。Batch Normalization（以下BN）は特徴量ベクトルの各次元に対して独立に計算するので、$k$次元目の特徴量 $\{x_1^{(k)},...,x_m^{(k)}\}$ に対して以下の計算を行う（ただし簡単のために $(k)$　の部分は省略して表記する）。

- ミニバッチ内での平均、分散の計算
$$
\mu = \frac{1}{m}\sum x_i
$$
$$
\sigma^2 = \frac{1}{m}\sum (x_i-\mu)^2
$$

- 正規化
$$
\hat{x_i} = \frac{x_i - \mu}{\sqrt{\sigma^2+\epsilon}}
$$

- BNの変換（scale & shift）
$$
y_i = \gamma \hat{x_i} + \beta
$$

BNの出力としては $y_i$ であり、これが後段のレイヤーへの入力情報となる。これにより学習中に極力ICSの影響を排除してパラメータの更新を行うことができ、学習スピードが向上することになる。

### scale & shift について

正規化を行ったときに $\gamma$ と $\beta$ のパラメータを導入しているが、これはネットワークの表現力を落とさないためのテクニックである。

$\hat{x_i}$のままだと例えばそれをシグモイド活性化関数に入力した際に、$E[x_i]=0,V[x_i]=1$であるので非線形領域の右端・左端の値を持ちにくく原点付近の値を持ってしまうため、線形的な表現力しか持たなくなってしまう。そこで「そういう表現力がほしい」と学習過程でモデルが判断すれば、BN変換が恒等変換となるように $\gamma$ と $\beta$ が学習可能パラメータとして導入されている。例えば、$\gamma=\sqrt{V[x]}$、$\beta=E[x]$ となるように学習すれば $y_i = x_i$ となるので BN変換は恒等変換になる。


## Training and Inference

BN変換を $BN(x)$ で表すこととすると、正規化のための平均や分散はミニバッチのとり方によって学習中に毎回異なることになる。推論時には決定的（deterministic）にしたいので、平均・分散をミニバッチの平均に置き換える。
$$
\hat{x} = \frac{x-E[x]}{\sqrt{V[x] + \epsilon}}
$$
を推論時には使用する。

ミニバッチでの（標本）平均は
$$
\mu_B = \frac{1}{m}\sum_i x_i
$$
であり、
$$
E[\mu_B] = E \left[\frac{1}{m}\sum_i x_i \right] = \mu
$$
不偏推定量である。また同様にミニバッチでの（標本）分散は
$$
\sigma_B^2 = \frac{1}{m}\sum_i (x_i - \mu_B)^2
$$
であり、
$$
E[\sigma_B^2] = E \left[\frac{1}{m}\sum_i (x_i - \mu_B)^2 \right] = ... = \frac{m-1}{m} \sigma^2
$$
となるため、不偏推定量とするには $m/(m-1)$ の調整が必要となる（標本分散の不偏性のいつもの議論と同じ）。以上からミニバッチでの平均・分散の平均を取ることで、推論時の正規化に使用する平均 $E[x]$ と分散 $V[x]$ を計算する。

## Batch-normalized CNN

BN変換をどこに入れればいいかを考える。そこでFCNNやCNNを想定し、前レイヤーの出力値 $u$ を重み $W$ とバイアス $b$ で変換した値 $Wu + b$ を活性化関数に通す場合を考える。
$$
z = g(Wu + b)
$$
BNによる正規化は

- $u$ に対して行うパターン
- $Wu+b$ に対して行うパターン

を考える。前者は、$u$ は前レイヤーの非線形な出力値であり、学習中に $u$ の分布は変化しやすい。後者は 

> $Wu+b$ is more likely to have a symmetric, non-sparse distribution,...

とあり（よく分からず...）、$Wu+b$ に対して正規化を掛けたほうがよい、とうい議論が行われている。そのため、
$$
z = g(BN(Wu))
$$
という形でバッチノーマライゼーションが実行されるということが導入されている。


# 参考文献

- [1] A Convergence Analysis of Log-Linear Training and its Application to Speech Recognition