DeepLearningの学習にあたっては多層の計算処理を行うので、パラメータの値によっては計算結果が外れ値と同様に歪な分布になる場合があります。当記事ではこのような現象の解決にあたって導入されることが多いバッチ正規化やレイヤー正規化などの正規化(normalization)について取りまとめを作成しました。
当記事の作成にあたっては、「深層学習 第$2$版」の$3.6$節「層出力の正規化」の内容などを参考にしました。
・用語/公式解説
https://www.hello-statisticians.com/explain-terms
前提の確認
正規化
サンプル集合$\mathcal{D} = \{ (\mathbf{x}_{1}, \mathbf{y}_{1}), \, \cdots \, (\mathbf{x}_{N}, \mathbf{y}_{N}) \}$が得られたとき、サンプル$\mathbf{x}_{n}$の$i$成分を$x_{n,i}$のように定義する。このとき$x_{n,i}$の正規化は下記のような式で表される。
$$
\large
\begin{align}
x_{n,i} & \longleftarrow \frac{x_{n,i} \, – \, \bar{x}_{i}}{\sqrt{\sigma_{i}^{2} + \varepsilon}} \\
\bar{x}_{i} &= \frac{1}{N} \sum_{n=1}^{N} x_{n, i} \\
\sigma_{i} &= \sqrt{\frac{1}{N} \sum_{n=1}^{N}(x_{n,i}-\bar{x}_{i})^{2}}
\end{align}
$$
上記の$\varepsilon$は$\sigma_{i}=0$のときも計算が行われるように$\varepsilon=10^{-5}$のような小さな数を設定する。任意の$n$について$x_{n,i}=\bar{x}_{i}$が成立する際に$\sigma_{i}=0$が成立することも合わせて抑えておくと良い。
DeepLearningにおける正規化
バッチ正規化
サンプル集合$\mathcal{D} = \{ (\mathbf{x}_{1}, \mathbf{y}_{1}), \, \cdots \, (\mathbf{x}_{N}, \mathbf{y}_{N}) \}$の$\mathbf{x}_{n}$の中間層$\mathbf{u}_{n} \in \mathbb{R}^{D}$を下記のように定義する。
$$
\large
\begin{align}
\hat{u}_{n} = \left( \begin{array}{ccc} u_{n1} & \cdots & u_{nD} \end{array} \right) \quad (1)
\end{align}
$$
このときバッチ正規化(batch normalization)の演算は下記のような式で定義される。
$$
\large
\begin{align}
\hat{u}_{nj} &= \gamma_{j} \frac{u_{nj} \, – \, \mu_{j}}{\sqrt{\sigma_{i}^{2} + \varepsilon}} + \beta_{j} \\
\mu_{j} &= \frac{1}{N} \sum_{n=1}^{N} u_{nj} \\
\sigma_{j} &= \sqrt{\frac{1}{N} \sum_{n=1}^{N}(u_{nj}-\mu_{j})^{2}}
\end{align}
$$
上記のようにバッチ正規化では$n$番目のサンプルの中間層$\hat{u}_{nj}$を全ての中間層の位置$j$の値に基づいて正規化を行うことで得る。バッチ正規化はある程度の数のバッチサイズがある前提の計算であるので、バッチが少ない場合やサンプル$1$つの推論を行う際はそのままの処理を用いることができない。特に推論を行う際はサンプル$1$つの計算を行う場合が多いので、学習時に計算を行った$\mu_{j}$や$\sigma_{j}$の値の移動平均を用いるなどで代用することが多い。また、$\beta_{j}, \gamma_{j}$は初期値を$\beta_{j}=0, \gamma_{j}=1$に設定した上でMLPのアフィン変換のパラメータと同様に学習を行います。
レイヤー正規化
前項「バッチ正規化」の$(1)$のようにサンプル集合を定義するとき、レイヤー正規化(layer normalization)の演算は下記のような式で定義される。
$$
\large
\begin{align}
\hat{u}_{nj} &= \gamma_{j} \frac{u_{nj} \, – \, \mu}{\sqrt{\sigma^{2} + \varepsilon}} + \beta_{j} \\
\mu &= \frac{1}{ND} \sum_{n=1}^{N} \sum_{j=1}^{D} u_{nj} \\
\sigma &= \sqrt{\frac{1}{ND} \sum_{n=1}^{N} \sum_{j=1}^{D} (u_{nj}-\mu)^{2}}
\end{align}
$$
[…] 【MLP】DeepLearningで用いられる正規化 〜バッチ正規化、レイヤー正規化〜 […]