LLMファインチューニングのためのNLPと深層学習入門 #13 レイヤー正規化

今回は、CVMLエキスパートガイドより、『レイヤー正規化 』を勉強します。


1. 概要

レイヤー正規化とは

レイヤー正規化(Layer Normalization)とは、可変長の系列データが入力の系列モデルや系列変換モデルでも扱いやすいように、元となるバッチ正規化をバッチ内で、レイヤー方向の正規化を行うようにアレンジしたものです。

当初のレイヤー正規化は、バッチ正規化層が使いづらいRNN向けに提案されました。

図1. レイヤー正規化(Layer Normalization) [RNN, FNN, Transformerの隠れ層における特徴ベクトル向け]
CVMLエキスパートガイドより)

図1を見るとわかる通り、レイヤー正規化はバッチ正規化と違い、バッチ長$${B}$$に依存していません。
バッチ正規化はバッチ全体にわたって各サンプルのチャンネル方向に正規化していましたが、レイヤー正規化は、バッチ内でレイヤー方向の正規化を行います。
つまり、「サンプル単位での正規化」です。

サンプル間をまたいでの正規化を行わないで、サンプル内で正規化が済むので、系列長が一定でない系列モデルに向いているという性質に加え、RNNなどの自己回帰モデルで必要になりがちな「オンライン学習」にも向いています。

その後、レイヤー正規化はTransformerに採用されたことで、GPT/BERTや、画像認識向けのViT/DETRなどでも使用されています。

バッチ正規化の欠点とレイヤー正規化での改善

旧来のバッチ正規化は、バッチ全体にわたって各サンプルのチャンネル方向に正規化を行います。
つまり各サンプルの長さが同じであることが求められるため、RNNなどの系列モデル向けの「可変長系列データ」に適用しようとすると、各文章ごとに長さが異なるデータには不向きでした。

それが、各隠れ層のサンプル文単位で正規化を行う「レイヤー正規化」が提案されたことにより、バッチサイズNが小さかったり、最悪N=1だったりした場合でも使用できるようになり、系列モデルや系列変換モデルでも、バッチ正規化型の層の恩恵を受けられるようになりました。

2. レイヤー正規化の処理手順

図1 [再掲]. レイヤー正規化 (Layer Normalization) [RNN, FNN, Transformerの隠れ層における特徴ベクトル向け]
CVMLエキスパートガイドより)

レイヤー正規化では、RNNの、あるタイムフレーム$${l}$$における自己回帰において、$${x^l}$$の中のみで、各特徴$${x_i}$$の平均と分散を取って「レイヤー方向の正規化」を行います。
この処理はバッチ内のサンプル数Bに依存しないので、自己回帰モデル・RNN・Transformer系の系列モデルの学習に向いています。

以上のRNNでのレイヤー正規化の処理を数式にまとめると、次のようになります。

$$
\mu^l = \frac{1}{N}\sum\limits^N_{i=1}x_i^l
$$

$$
\sigma^l = \sqrt{\frac{1}{N}\sum\limits^N_{i=1}(x_i^l-\mu^l)^2}
$$

$$
h_{out}^l = f[\frac{\gamma}{\sigma^l + \eta }\odot(x^l - \mu^l) + \beta]
$$

ここで、$${\gamma_i}$$と$${\beta_i}$$は、バッチ正規化と同じく各次元$${i}$$を正規化した後(リ)スケール・(リ)センターを行うためのパラメータであり、ネットワークの学習中に一緒に推定されます。
また、$${f}$$はRNNの隠れ状態の遷移の際に用いられる全結合層の変換を表した関数です。

バッチ正規化の手順(復習)

図2. バッチ正規化 (Batch Normalization)
CVMLエキスパートガイドより)

ここで、レイヤー正規化とバッチ正規化を比較しやすくするために、一度バッチ正規化について軽く復習しておきます。
バッチ正規化は、図2のようにサンプル$${x_i}$$間をまたいで、バッチ内全体で各チャンネル$${c}$$ごとに、各特徴値の正規化とスケーリング・シフトを行います。
計算手順を以下に示します。

$$
\mu^\beta=\frac{1}{N}\sum\limits_{i=1}^Nx_i^l
$$

$$
\sigma^\beta = \sqrt{\frac{1}{N}\sum\limits_{i=1}^{N}(x_i^l-\mu^\beta)^2}
$$

3. レイヤー正規化への発展の動機

バッチ正規化は、可変長の系列データを扱うモデルに使おうとすると、バッチごとに扱う系列長が異なるので、ミニバッチ内の平均・分散を同一の分母で計算することができない問題があり、これによりバッチ正規化は可変長の系列データにそのまま使用できません。

それに対してレイヤー正規化は、層単位でサンプル内の全チャンネルに対する正規化を行い、バッチ内の1サンプル内で正規化範囲をとどめることを提案しました。
このアレンジにより、「バッチサイズに依存せず、各ステップ$${t}$$ごとに正規化」でき、可変長入力にも適用できるようになりました。

また、バッチサイズ1だけの短いバッチ長でも正規化が可能であるため、RNNのBPTT(Back Propagation Through-Time)のような自己回帰モデルなどでのオンライン学習タスクにも向いているバッチ正規化型の層となりました。

Transformer時代に入ると、入力の系列長(トークン数)も数百トークンの長いものになってくるので、省メモリで「GPUフレンドリー」なレイヤー正規化が活躍することになります。

まとめると、レイヤー正規化によって、系列モデルのRNNやTransformerに相性の良い「層単位での正規化とスケーリング」が行えるようになり、バッチ正規化のもつ「学習の高速化」「収束安定化」「汎化性能の向上」の恩恵を受けやすくなりました。

※ただしLSTMはバッチ正規化の挿入によってもある程度高速になります。

4. Transformer系モデルでの使用

以下はTransformerのEncoderとDecoderそれぞれの内部構造の図です。

図3. Transformer Encoder
CVMLエキスパートガイドより)
図4. Transformer-Decoder
CVMLエキスパートガイドより)

Transformerでは、各ブロックにおいて「マルチヘッドアテンション後」に毎回レイヤー正規化が配置されています。(図3,4参照)
また、マルチヘッドアテンションの次の層であるFFNのあとにも、レイヤー正規化を行います。

Transformerでの広範囲の活用

このように、オリジナルのTransformerにおいて、ブロック内の正規化にレイヤー正規化が採用されたことにより、Transformerを使用したモデルがのちにたくさん登場する中で、レイヤー正規化もその部品として頻繁に使用されることとなりました。

たとえば、まずTransformer自体は旧来seq2seq with attentionで解かれていた多数の系列変換モデル問題を中心に使用されていきます。
ただし、入力系列がトークン入力かつ、変換後の出力系列側もトークン入力でsoftmaxクラス出力(one-hotベクトル)である問題でないと、系列変換モデルをそのまま使用できません。
よって、Text-to-SpeechやText-to-Imageなど、Decoder(Generator)側で「高次元の綺麗な生データ」を生成する問題では、Transformer-Encoderのみが使用されます。

LLM(BERT/GPT)でのTransformerの応用

自己教師あり事前学習を用いたBERT/GPTでTransformerが主部品に使われたことで、事前学習済みのBERTやGPTを特定のタスクにチューニングする場合でも、Transformerの一部が使用されていくことで、レイヤー正規化も部品として使用されていきました。

物体認識・物体検出バックボーンでのTransformerの応用

画像認識でも、Transformerを応用した以下の2つが登場して以降、その中でレイヤー正規化がよく使用されるようになっていきました。

  1. 物体認識向けViT(Vision Transformer)
    オリジナルのViTや、Swin-Transformerなど

  2. 物体検出向けDETR(DEtection TRansformer)
    DETRやdeformable DETRなど

ただし、当初はTransformerは畳み込み層が排除されたまま画像認識でも使用されていましたが、2022年後半からCNNバックボーンや畳み込み層も復権の兆しがあることに注意とのこと。

音声系でも、畳み込み層も使用したConformer系ネットワークが強いです。

また、レイヤー正規化は(2次元データで3次元特徴マップを生成する)画像データ相手には不自然なので、Transformer的な全体構造でも、YOLOFなど、バッチ正規化を正規化層に用いたケースが主流になってきた点に注意が必要です。

まとめると、レイヤー正規化は1次元トークン系列が相手の場合と相性がいい仕組みということです。

5. おわりに

今回はレイヤー正規化について学びました。
次回はいよいよ、Transformerの予定です(予定)(3敗)
がんばっていきます。
それでは。

進捗上げてます

「#AIアイネス」で私が作成しているLLMの進捗状況を更新しています。
ぜひ覗いてみて下さい。

参考


この記事が気に入ったらサポートをしてみませんか?