LLMファインチューニングのためのNLPと深層学習入門 #12 バッチ正規化(2)

今回は、前回記事の続きです。

前回はCVMLエキスパートガイドより、『バッチ正規化(Batch Normalization) とその発展型』の、実際の計算手順まで勉強しました。
本記事では、前回記事で学んだアルゴリズムの中身を理解するための、バッチ正規化の各性質や長所と短所、そしてバッチ正規化の発展形について学んでいきます。


1. バッチ正規化の性質

中間層における特徴分布のコントロールによる最適化の容易化

バッチ正規化で最も大きな働きを担っているのは、SGD(Stochastic Gradient Descent : 確率的勾配降下法)学習中に隠れ層の$${c}$$次元目の特徴分布を、正規化後にスケール・シフトされた固定分布へ変換する仕組みです。

これにより、隠れ層の分布がチャンネルごとに正規化され、SGD学習が安定し、また高速に収束できるようになりました。

正規化と白色化

データの前処理手法の一つに、「白色化」(Whitening)があります。
これは、データに対し以下の2つの操作を行います。

  1. 正則化
    各特徴(次元)の平均が0、分散が1となるようにデータをスケーリングします。

  2. 無相関化
    すべての特徴間の共分散が0になるように、つまりデータの各特徴間の相関を排除するようにデータを変換します。
    (計算コスト高い)

正則化と無相関化は、どちらもニューラルネットワークの学習を促進し、SGDの収束を早める効果があります。

一方、バッチ正規化は、白色化とは異なり「無相関化」は行わず「正則化」だけを行いますが、それでも十分にSGDの収束を早くする効果があるとされています。

内部共分散シフトと最適化

「ニューラルネットワークの正規化」という観点では、以前は入力層でのみ正規化や白色化を行うことに主眼が置かれていました。

しかし、そのような入力層での正規化や白色化にもかかわらず、ニューラルネットワークの学習には、(互いに離れたところにある)隠れ層間で活性化値の分散がシフトしてズレが生じる内部共分散シフト (Internal Covariate Shift)という問題が存在しました。
これは、学習過程で各層の入力データ分布が変化する現象で、収束の鈍化や勾配爆発、勾配消失を招きやすくなります。

よって、それらを防ぐために当時(2015年まで)のCNNでは、
(1)繊細な重み初期化や、
(2)学習率を低めに抑えた(ゆっくりな)学習
が必要でした。

それが、バッチ正規化を導入したことで、
(1)重みパラメータの初期化が容易になり(適当で済むようになり)、
(2)高い学習率の値を用いて学習を高速化しやすくなりました。

※バッチ正規化の初期の論文 [Ioffe and Szegedy, 2015] では、「バッチ正規化が内部共分散シフトを減らす」ことで、ニューラルネットワークの最適化を容易にすると主張されていました。

しかし、その後の研究 [Santurkar et al., 2018] では、内部共分散シフトの削減よりも、バッチ正規化による「最適化問題の再パラメータ化」が効果的であるとされています。
具体的には以下の2点です。

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

つまり、バッチ正規化が損失関数の「急激な変化」を抑制し、「なめらかさ」を保つことで、学習の安定性と効率性を向上させるということです。

バッチ正規化の正則化効果

以上のように、特にDNN向けの学習を助ける便利な層として登場したバッチ正規化でしたが、最初の提案時では以下のような課題や弱点がありました。

  • バッチサイズが小さいとデータ統計分布が小さすぎて上手く正規化できない

  • 学習時とテスト時で平均と分散の値が変わってしまう

  • バッチサイズが大きいほど正則化の効果が減る
    (汎化性能の向上に寄与しなくなる)

  • 動画入力ネットワーク向けに使用すると、隣接フレーム同士でデータの相関が高いことから、平均・分散の推定が安定せず、学習がなかなか進行しない

よって、これらの課題を克服するために、バッチ正規化の発展型が提案されていきました。
発展型の提案を通じて、CNN以外の損失関数や他のニューラルネットでもバッチ正規化系の層は使用され、また応用されていきます。

2. バッチ正規化の発展形

2.1 レイヤー正規化:系列モデル向け

レイヤー正規化(Layer Normalization)は、バッチ正規化の系列モデル・系列変換モデル向けの改善版として提案された手法で、正規化の方向を「チャンネル(バッチ)方向」から「レイヤー」に変更し、層(タイムスタンプ)単位で正規化できるようにしたものです。

図1 レイヤー正規化の処理
CVMLエキスパートガイドより

レイヤー正規化は、RNNやseq2seq、Transformerなどを用いた「NLPむけのRNN言語モデル・系列対系列変換モデル」でよく使用されます。

バッチ正規化を系列モデルに適用すると、各サンプル系列の長さの違いからバッチ内の総数が一定にならず、平均・分散を同一の分母で計算できなくなる問題があります。

しかし、レイヤー正規化を用いると、各層単位での正規化とスケーリングが可能になり、これによりバッチ正規化の恩恵(学習の高速化、汎用性の向上など)が得られます。

このように、レイヤー正規化は、現代のニューラルネットワーク、特にTransformer系のモデルにおいて頻繁に使用されており、重要な部品となっています。

2.2 インスタンス正規化:ニューラルスタイルトランスファー向け

インスタンス正規化は、バッチ正規化の発展形で、画像1枚(=インスタンス)単位でチャンネルごとのバッチ正規化を行います。
ニューラル画像スタイルトランスファーなどでよく用いられます。

図2 インスタンス正規化の処理
CVMLエキスパートガイドより

また、適応的インスタンス正規化(AdalN)は、コンテンツ画像とスタイル画像との間で適応的に調整を行う機能が追加されたインスタンス正規化の一種です。
AdalNを用いることで、1つのモデルだけで多様なスタイル画像を参照入力として変換できるスタイルトランスファーモデルを実現することができます。

スタイルトランスファー以外でも、インスタンス正規化はpix2pixHDなどの画像対画像変換モデルでも用いられています。
また、画像生成GANにおいても、スタイルトランスファー技術を画像生成GANに組み込んだStyleGANなどにおいて、AdalNが応用されています。

2.3 グループ正規化:小バッチ、多タスクの大規模CNN向け改善

図3 グループ正規化の処理
CVMLエキスパートガイドより

 グループ正規化は、各サンプル(インスタンス)内のグループ単位で正規化を行う手法で、効率計算かつ性能の保持を可能にしました。
(デフォルトでは32グループ)

元のバッチ正規化が不得意にしていた、小バッチサイズで複数GPUを用いて学習する場合でも、グループ正規化を用いることでCNNの学習を安定・高速化させやすくなりました。

例えば、「Mask R-CNN の fine-tuning」では、高画質入力画像を使用したいため、「1 or 2画像/バッチ」×「8GPU」のような小バッチサイズで学習を行う必要があります。
これを実験で行った結果、バッチ正規化よりも高速に学習でき、認識精度も向上することが確認できました。
さらに、事前学習なしに、スクラッチからの学習でMask R-CNNが学習できることも示されました。

グループ正規化はバッチ数に依存しない正規化であり、系列モデルにも有効に機能します。また、レイヤー正規化とインスタンス正規化の両方の分割方向を使用した手法であるため、これらの中間解の提案ともみなせます。

3. おわりに

今回はバッチ正規化の性質とその発展型について学びました。

次回からは、Transformerで良く使用されるレイヤー正規化について、どのようにしてバッチ正規化の欠点を改善していったのかを学んでいきたいと思います。

それでは。

進捗上げてます

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

参考

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