層正規化(Layer Normalization)とは、ニューラルネットワークの各層における出力の数値を正規化する手法です。この手法では、層内のアクティベーションの分布を整えることで、モデルの学習を安定させ、より効率的に進めることを目的としています。層正規化は、特にTransformerモデルのように多くの層を持つネットワークにおいて有効です。
どのような値がどのように正規化されるのか?
層正規化の手順を具体的に説明するために、具体的な数値を使って考えてみましょう。
例えば、ある層の出力が以下のような具体的な数値を持っているとします:
- \[[3.5, 1.2, -2.1, 4.0, -0.5]\]
これらの値に対して層正規化を行う際には、次のステップを踏みます:
- 平均の計算 各出力の平均を計算します。
\[ \mu = \frac{1}{5} (3.5 + 1.2 – 2.1 + 4.0 – 0.5) = 1.22 \] - 分散の計算 次に、各出力から平均を引いた値の二乗の平均を計算して分散を求めます。
\[ \sigma^2 = \frac{1}{5} [(3.5 – 1.22)^2 + (1.2 – 1.22)^2 + (-2.1 – 1.22)^2 + (4.0 – 1.22)^2 + (-0.5 – 1.22)^2] = 4.0544 \] - 正規化 各要素に対して平均を引き、分散の平方根で割ります。この操作により、各出力が標準正規分布(平均0、分散1)に近づきます。
\[ \hat{h}_i = \frac{h_i – \mu}{\sqrt{\sigma^2 + \epsilon}} \] 例えば、\(h_1 = 3.5\) の場合:
$$ \hat{h}_1 = \frac{3.5 – 1.22}{\sqrt{4.0544 + 0.00001}} \approx 1.13 $$ この操作をすべての要素に対して行うと、正規化された値のベクトルは以下のようになります:
- \[[1.13, -0.01, -1.64, 1.38, -0.86]\]
- スケーリングとシフト 最後に、スケーリングパラメータ \(\gamma\) とシフトパラメータ \(\beta\) を使って調整します。これにより、正規化後の出力に適切なスケールとバイアスを追加してモデルの表現力を保持します。
$$ \hat{h}_i = \gamma \cdot \hat{h}_i + \beta $$ 例えば、\(\gamma = 1.5\), \(\beta = 0.5\) とした場合:
$$ \hat{h}_1 = 1.5 \cdot 1.13 + 0.5 = 2.195 $$
層正規化の利点
層正規化を行うことにより、ニューラルネットワークの学習が以下のように改善されます:
- 学習の安定性向上:各層の出力のスケールを一定に保つことで、勾配の流れが安定し、勾配消失や勾配爆発といった問題を抑えられます。
- バッチサイズへの依存なし:バッチ正規化とは異なり、層正規化は各サンプルごとに独立して正規化を行うため、バッチサイズに依存せず、特に小さいバッチサイズでも効果を発揮します。
- シーケンシャルデータに強い:RNNやTransformerのようなシーケンスデータの処理において、層正規化はバッチ正規化よりも適用しやすく、高い性能を発揮します。
まとめ
層正規化は、各層ごとの出力を標準化し、学習を安定させることで、特に深層ニューラルネットワークの性能を向上させる手法です。具体的には、各出力の平均と分散を計算し、それらを用いて標準化を行い、さらにスケーリングとシフトを行うことで、適応的に出力を調整します。これにより、層正規化は様々な状況でモデルの学習を安定化させ、効率的に学習することを助けます。