ひとことで言うと
正規化手法の選択は、式の形よりも「どの軸の値を一緒にして平均と分散を計算するか」で決まります。BNはバッチをまたぎ、LNは1サンプルの特徴をまたぎ、GNは1サンプル内のチャネルをグループに分け、INは1サンプル・1チャネル内の空間要素を使います。同じテンソルに平均と分散を適用していても、束ねる軸が違えば別の挙動です。
温度計をそろえるとき、同じ時刻に測った全員の値を基準にするのがBN、1人の持つ複数のセンサーを基準にするのがLN、センサーをいくつかの部署に分けて部署ごとに基準を作るのがGN、1人の1種類のセンサーだけで基準を作るのがINです。人数が毎回変わる現場では、全員基準だけが不安定になります。
なぜ必要か
実装で最初に見るべきなのは、正規化層の名前ではなく入力の形状と運用条件です。画像の畳み込み層で、十分な枚数を同時に処理できるなら、チャネルごとにバッチ統計を共有するBNが候補になります。大きなモデルを高解像度画像で学習するとGPUメモリの都合でバッチが2や4まで下がることがあります。このときBNは、統計を推定する人数そのものが少なく、更新ごとに基準が揺れます。GNはチャネルを群に分けて1サンプル内で統計を取るので、この制約をバッチ軸から切り離せます。
一方、系列モデルでは系列長がサンプルごとに異なることがあります。BNではパディングを統計に含めるか、マスクを統計計算にも反映するかを考えなければなりません。時刻ごとの隠れ状態を特徴方向に正規化するLNなら、他のサンプルの長さや値に依存しません。可変長だから必ずLNではありませんが、バッチ統計とマスクの整合性を設計できないならLNの方が判断しやすいです。
さらに、学習と推論の境界も選択軸です。BNは学習中のミニバッチ統計と、推論時の蓄積統計を切り替えます。したがって、学習時に見たバッチ分布と本番入力の分布がずれると、蓄積値の質が結果に影響します。LN、GN、INは通常、各サンプルからその都度統計を作るため、BNのような移動平均を持ちません。推論時も入力単体の値から計算できることは、バッチを1件ずつ処理するサービスや、学習済みモデルを別のバッチ構成へ移す場合に有利です。
| まず確認する条件 | その条件が選択に与える意味 |
|---|---|
| バッチを十分に確保できるか | できるならBNの候補性が上がり、できないならGN・LN・INを比較する |
| サンプル間で統計を共有してよいか | 共有してよいならBN、独立させたいならバッチ非依存の手法を選ぶ |
| 推論を1件ずつ行うか | BNの蓄積統計の品質を確認し、入力から毎回計算する手法も候補にする |
| パディングやマスクがあるか | バッチ・系列軸の統計に無効値が混ざらない軸設計を優先する |
仕組み
入力をバッチ 、チャネル 、空間または系列方向 のテンソル とします。ここで はサンプル、 はチャネル、 は空間位置または時刻です。各手法の違いは、平均 と分散 の添字をどこまで残すかです。
| 手法 | 1つの統計にまとめる軸 | バッチサイズへの依存 | 典型的な判断 |
|---|---|---|---|
| BN | と必要な 、ただし は残す | 依存する | 十分なバッチを組める画像学習 |
| LN | 1サンプル内の特徴軸(設計した ) | 依存しない | 系列・可変長・バッチ1の処理 |
| GN | 1サンプル内でまとめたチャネル群と | 依存しない | 小バッチの畳み込みモデル |
| IN | 1サンプル・1チャネルの | 依存しない | サンプルごとの外観差を消したい画像処理 |
正規化の共通部分だけを書けば、統計を取る集合を として、
となります。 は統計を共有する要素の集合、 はその要素数、 はゼロ除算を防ぐ定数です。BNなら同じチャネルのバッチ要素が に入り、GNなら同じサンプルの同じグループに属するチャネルが入ります。LNとINの境界も同じ見方で切れます。LNは特徴全体を、INはチャネルごとの空間要素を集合にするためです。
BNだけは、推論用に学習中の統計を保存します。学習ステップ のバッチ平均を 、保存値を 、更新係数を とすれば、代表的には
のように更新します。 は推論で使う移動平均です。係数の向きや実装上の補正はライブラリで異なり得ますが、判断上重要なのは「BNは推論時に現在のバッチ統計をそのまま使わず、学習時に蓄積した状態を使う」点です。LN、GN、INではこの状態を持たず、学習と推論で同じ軸の統計を入力から計算します。
試験でどう問われるか
| 問われ方 | 正解に寄る条件 | 引っかけ |
|---|---|---|
| 統計を取る軸の比較 | BNはバッチ、LNは特徴、GNはチャネル群、INはサンプル内のチャネルごとの空間 | 「正規化層は全要素を一括で標準化する」とする |
| 小バッチでの選択 | BNは推定が揺れやすい。GNやLNなどバッチ非依存を候補にする | バッチが小さいほどBNの統計が精密になる |
| 学習・推論の違い | 移動平均・移動分散を保存して切り替えるのはBN | LNやGNも推論用移動平均を必ず持つ |
| 可変長の系列 | 他サンプルやパディングに依存しにくい特徴軸のLNを検討する | 可変長なら全手法を無条件に使えないとする |
| GNの説明 | 1サンプル内のチャネルを複数群に分ける | バッチを複数群に分ける |
実装で確かめる
軸の違いをNumPyで固定します。x の形を (batch, channel, position) とし、BNはバッチと位置、LNはチャネルと位置、GNは指定したチャネル群と位置をまとめます。実際のライブラリでは、マスクやレイアウト変換がこの軸対応を壊していないかを確認します。
import numpy as np
x = np.arange(2 * 4 * 3, dtype=float).reshape(2, 4, 3)
def standardize(x, axes):
mean = x.mean(axis=axes, keepdims=True)
var = x.var(axis=axes, keepdims=True)
return (x - mean) / np.sqrt(var + 1e-5)
bn = standardize(x, (0, 2))
ln = standardize(x, (1, 2))
gn = standardize(x.reshape(2, 2, 2, 3), (2, 3)).reshape(2, 4, 3)
assert np.allclose(bn.mean(axis=(0, 2)), 0)
assert np.allclose(ln.mean(axis=(1, 2)), 0)
assert np.allclose(gn.reshape(2, 2, 2, 3).mean(axis=(2, 3)), 0)
この確認で大切なのは、平均が0になること自体ではなく、どの添字を平均から消したかです。axis を取り違えてもコードは実行でき、別の正規化として値を返します。BNなら学習モードと推論モードを分け、推論時に同居例を変えても結果が意図せず変わらないことを確認します。
取り違えやすいもの
| 判断軸 | BN | LN | GN | IN |
|---|---|---|---|---|
| 統計の共有範囲 | サンプル間で共有 | 1サンプルの特徴全体 | 1サンプルのチャネル群 | 1サンプル・1チャネル |
| 小バッチ | 不利になりやすい | 影響なし | 影響なし | 影響なし |
| 移動平均 | 推論用に持つ | 持たない | 持たない | 持たない |
| 系列長の変化 | マスクと軸設計が必要 | 時刻ごとに適用しやすい | 主に畳み込みのチャネル設計向き | 空間・時刻方向の情報を個別にそろえる |
「バッチに依存しない」だけでLN、GN、INを同一視しないことが要点です。系列の隠れ状態を特徴方向に整えるならLN、画像のチャネル表現を群で保つならGN、サンプルごとのチャネル内の外観をそろえるならINです。GNのグループ数を変えると、全チャネルをまとめるLN寄りから、1チャネルずつにするIN寄りまで挙動が変わります。手法名より、正規化後にも残したい相関の範囲を軸で指定する方が実装の移植に強いです。
想起チェック
4手法を分ける最初の判断軸は何か
平均と分散を計算する集合、つまりバッチ・特徴・チャネル群・チャネル内空間のどの軸をまとめるかです。
学習時と推論時に移動平均を使い分ける代表的な手法は何か
BNです。学習中のミニバッチ統計を蓄積し、推論ではその移動平均・移動分散を使います。LN、GN、INは通常、入力サンプルから同じ軸の統計を計算します。
小バッチの画像モデルでBN以外を検討する理由は何か
BNはバッチ統計の推定に依存し、例数が少ないと基準が揺れやすいからです。GNは1サンプル内のチャネル群、LNやINもバッチ外の軸から統計を作るため候補になります。
可変長系列でLNを候補にする条件は何か
各時刻の隠れ状態を特徴方向に正規化し、他サンプルの長さやパディングを統計に混ぜない設計にできる場合です。可変長という事実だけで自動的に決まるわけではありません。