Ch.06
正規化層(Batch & Layer Normalization)
ディープラーニングを学ぶと「正規化」という言葉に何度も出会います。日本語でも似た訳になりがちですが、過学習を防ぐ正則化(Regularization:L2・ドロップアウトなど)と層ごとに信号の大きさを揃える正規化(Normalization:バッチ正規化・層正規化など)はまったく別の役割です。本章では、層が渡す活性化値が大きすぎたり小さすぎたりするのを防ぎ、モデルが安定して学習できるよう支える正規化層(Normalization Layer)を深く扱います。
オーケストラを想像してください。バイオリンが大きすぎ、ピアノが小さすぎれば、指揮者がどんなにリズムを合わせても美しい音楽にはなりません。深いニューラルネットも同様で、層を通るたび信号の大きさが揺れると学習が遅くなったり止まったりします。バッチ正規化は複数サンプルをまとめて基準を取り、層正規化はサンプル1つ内で基準を取ります。学習時と本番サービス時で基準の取り方がどう違うか、初心者にもわかる比喩で順を追って整理します。
下の図はバッチ正規化・層正規化・学習/推論・役割の区別を適用前→適用後でやさしく示します。
左=適用前、右=適用後。バッチ正規化は複数サンプル、層正規化はサンプル内。学習は今のバッチ、推論は蓄積した基準。過学習防止(L2/dropout)=暗記・重み、正規化層=信号の大きさ。
層ごとに信号の大きさを揃える
学習を安定化、役割を区別
正規化層:層ごとにスケールを合わせる
1. なぜ層ごとにスケールを合わせるのか
やさしい説明: ニューラルネットは多くの層を通って答えを探します。浅い層の重みが学習中に少し変わるだけで、深い層が受け取るデータの大きさや分布は雪だるま式に変わり得ます。この層ごとの信号の揺れ(内部共変量シフト)があると、モデルは混乱して正しく学習できません。
比喩: リレーでは前の走者が一定のペースで走ってこないと、次の走者はバトンを安定して受け取れません。正規化層は各層が渡す信号の「歩幅」を一定にし、次の層が常に安定した範囲の信号を受け取れるようにします。
実践Tip: lossが急に跳ねたり勾配が消えたり(Vanishing)するとき、学習率だけをいじる前に正規化層の位置と学習/推論モードを確認しましょう。
2. バッチ正規化(Batch Normalization)— 複数サンプルをまとめて
やさしい説明: データは通常ミニバッチで入れます。バッチ正規化はそのまとまり全体を基準に、各値が平均からどれだけ離れているかで大きさを調整します。0〜1に硬く固定すると表現力が落ちるので、学習可能なパラメータ(, )を掛け足して柔軟に戻します。
核心式:
式の一言説明: 入力 からミニバッチ平均 を引き、標準偏差 で割ります。 は分母が0にならないための小さな安全装置です。
比喩: テスト後、素点だけでなくクラス全体の平均と標準偏差で自分の位置(偏差値のようなもの)を知るのと同じです。
実践Tip: 画像を32・64枚ずつ十分まとめて入れられるCNNでは特に有効。ConvやLinearの直後に置くことが多いです。
3. 層正規化(Layer Normalization)— サンプル1つの中でバランス
やさしい説明: バッチ正規化は他サンプルを参照する必要があります。層正規化は他データを無視し、サンプル1つ内の特徴値だけの平均・分散で基準を取ります。バッチ1や文長が可変なTransformer・RNNで真価を発揮します。
比喩: クラス全体の数学平均がバッチ正規化なら、層正規化は1人の国語・英語・数学・理科の点をその人の中だけでバランスを取るイメージ。隣の席の成績は見ません。
実践Tip: ChatGPTの骨格であるTransformerブロックやRNN/LSTMでは層正規化が定番。メモリ不足でミニバッチ1〜2しか無理なときも、バッチ正規化より層正規化が安全です。
4. 学習(Train)vs 推論(Inference)— バッチ正規化の二つの顔
やさしい説明: バッチ正規化は学習時とサービス(推論)時で動きが違います。学習時は今のミニバッチで正規化しながら、全体の平均とばらつき(移動平均)をこっそり記録します。本番ではユーザーが1枚だけ送っても、学習中に蓄積した統計で正規化します。
比喩: 代表チームの練習は「今日参加した選手」のコンディション基準、ワールドカップは「何十試合も積んだ経験」基準でメンバーと戦術を決めるのに似ます。
実践Tip: PyTorchでは `model.train()` と `model.eval()` で切り替えます。デプロイで `model.eval()` を忘れると、アップロードのたび基準が変わり結果がブレます。本番前に推論モードを必ずオンに。
核心概念と式を一覧で
バッチ正規化(Batch Normalization) — ミニバッチ基準で全体のバランスを取ります。
やさしい説明: 中間層が異常に大きい/小さい値を出すと次の層は衝撃を受けます。バッチ正規化は一度に入れたデータの束を見て、「束の平均より大きいから下げ、小さいから上げる」ように調整します。
要点: 一度に32個以上入れられるとき最強。1〜2個だけだと基準が揺れて有害になることも。
身近な比喩: テスト後、クラス平均に対する自分の位置(標準化スコア)を出すのと同じ。
層正規化(Layer Normalization) — サンプル1つ内で独立にバランスを取ります。
やさしい説明: 文長がバラバラなチャットデータはきれいに束にしにくい。他データを見ず、1サンプル(1文)内だけで平均を取って基準を揃えます。
要点: バッチ1でも完璧に動作。Transformer系LLMの核心部品。
身近な比喩: 他人と比べず、自分の国・英・数・理の平均で科目バランスを取る。
学習(Train)vs 推論(Inference) — 練習と本番は動き方が違います。
やさしい説明: バッチ正規化は学習時は今のミニバッチ統計を使いつつ、全体の累積平均もこっそり計算。本番は1枚だけでもこの累積基準を使います。
要点: デプロイ前に必ず `model.eval()`。忘れると予測が毎回変わる大バグに。
身近な比喩: 練習は今日のメンバー基準、ワールドカップは数十試合の経験基準。
混同しやすい二つの「正規化」を完全区別
やさしい説明: 訳は似ても仕事は別。過学習防止正則化(L2・ドロップアウト)は暗記を防ぐ。バッチ/層正規化は内部のデータ圧力を一定にし学習の爆発を防ぐ。
要点: 訓練高・本番低→前者。訓練中NaNやloss乱高下→後者。
身近な比喩: 前者=荷物を軽くする(重み抑制)、後者=オーケストラの音量ミックス(信号サイズ)。
なぜ重要ですか?
1. 想像上の深いネットを「実際に」実装できる
理論上は数百層積めば賢くなるはずですが、かつては活性化や勾配が爆発・消失し学習不能でした。バッチ正規化と層正規化はこの不安定さを抑え、実務でより高い学習率とより深いモデルを可能にした最大の功労者です。
2. 同じ「正規化」という名前の役割を混同しない
日本語でも訳が似て初心者が最も混乱します。L2・ドロップアウト(Regularization)は過学習と重みのダイエット、バッチ/層正規化(Normalization)は層間の信号サイズを整える役割です。練習は得意で本番だけ失敗→前者、最初からガタつきloss→後者。
3. データとモデルに合った「服」を選ぶ
どんなに良い技法も状況次第です。画像CNNにはバッチ正規化がぴったりですが、TransformerやRNNに無理やりバッチ正規化を入れると学習が壊れることも。バッチサイズや系列長などを理解し、適切な正規化層を選んで最高性能を引き出しましょう。
実務ではこう使います
① 診断:エンジンはガタついていないか
身近な例: 車のエンジンが激しく震え、速度計が乱高下したら正常走行は無理です。lossが跳ねたり `NaN` が出たらデータの流れが壊れています。アクセル(学習率)だけ踏む前に、エンジンオイル交換のように正規化層を適切な位置に試してください。
訓練精度99%なのに新データで50%しか当たらない(過学習)なら、正規化層よりドロップアウトやデータ増強(Regularization)が正しい処方です。
② 写真・ビジョン:バッチ正規化の主舞台
身近な例: スマホで犬と猫を見分けるAIを作るとき、GPUメモリが十分なら32・64枚ずつ学習できます。「今入った64枚の束」全体の明るさや特徴分布でスケールを揃えるバッチ正規化がよく働きます。
高解像度医療画像で1〜2枚しか入らない場合、束の基準が揺れて逆効果になります。バッチサイズを工夫するか、別の正規化を検討しましょう。
③ チャットボット・翻訳:層正規化の独壇場
身近な例: ユーザーの入力は「こんにちは?」の2文字もあれば、長い要約依頼もあります。長さバラバラの文を無理にまとめて平均するのは困難です。
テキストモデルでは隣の文を見ず、今分析中の1文の中だけで単語の信号サイズを調整する層正規化を使います。自分のペースで走るマラソン選手のようです。
④ サービス公開前の必須チェック:推論モード(eval)
身近な例: 学習を終えWebサービスを公開したのに、画像を上げるたび結果がブレる。原因は「本番モード(推論)」に切り替えていないことです。
PyTorchで `model.eval()` を呼ぶと、新データの束平均を使わず学習中に固く蓄積した統計で正規化します。練習の癖を捨て、本番マニュアルどおり動かす最後の重要ステップです。
要点3行まとめ
本章の核心は、層を通る信号の大きさを一定にして学習を安定させるバッチ正規化と層正規化です。L2やドロップアウトの過学習防止用正則化(Regularization)と名前は似ていますが混同してはいけません。正則化は暗記を抑え、正規化層(Normalization)はデータの通り道の水圧(信号サイズ)を均一に保ちます。
バッチ正規化は複数データ(ミニバッチ)をまとめて基準を取り、画像CNNで活躍。サービス時は学習中に蓄積した統計を使う設定が必須です。層正規化は他データを見ず1サンプル内だけで基準を取り、文長可変のNLPや極小バッチで欠かせません。
実務Tip:学習が拒否してlossが爆発するなら正規化層で鎮静、検証だけ落ちるなら正則化技法を——状況と役割に合わせて処方することが重要です。
問題を解くための説明
本章は学習不安定、バッチ vs 層正規化、同名の「正規化」区別の三つで解きます。
学習が揺れるときは loss NaN・勾配爆発/消失・train lossの激振動を確認。層を深くする前に正規化層の位置と学習/推論モードを点検。
train良・val悪→過学習(暗記)。バッチ正規化だけでは不足のことも。L2・ドロップアウト・早期終了・増強も検討。
バッチ正規化=複数サンプル(batch 32+)。層正規化=サンプル内(batch=1・Transformer)。学習=今のバッチ+蓄積、推論=蓄積基準。`model.eval()`必須。
手がかり: batch=1/Transformer→層正規化、推論モード/蓄積基準→バッチ正規化、NaN→正規化層、重みペナルティ/ニューロンoff→過学習防止側(本章の主答ではない)。
定義問題 — まず選択肢番号と役割を対応させます。
「正規化層の目的?」→
① 重みL2ペナルティ・
③ ニューロンoffは過学習防止側。
② 層の信号サイズ安定化が本章の核心 → 答え2。
「バッチ正規化の基準?」→
① 複数サンプル(ミニバッチ)がバッチ正規化。
② サンプル内は層正規化 → バッチ正規化の設問なら 答え1。
「推論時バッチ正規化?」→
① 学習中に蓄積した平均・ばらつきを使用。
② 今のバッチのみは学習向き → 答え1。
応用問題 — 状況を先に読みます。
loss NaN・勾配不安定 →
① 層を深くするより
② 正規化層追加が先 → 答え2。
Transformer・batch=1 →
② 層正規化が自然 → 答え2。
デプロイ後の揺れ →
① 推論モード(`model.eval()`) 確認が先 → 答え1。
`model.train()` のままデプロイすると、バッチ正規化が毎回違うミニバッチ統計を使い結果がブレます → 答え2。
計算問題 — 式に順に代入します。
平均2・値5・ばらつき9 → √9=3、(5−2)÷3=1 → 選択肢
② → 答え2。
正規化−1、×4+2 → −4+2=−2 → 答え2。
正誤問題 — 「推論でも毎回現バッチのみ」はよくある誤解。推論は蓄積基準を使う → 誤(0)。
「バッチ正規化とL2が同目的」→ L2=重み・暗記、BN=信号サイズ → 誤(0)。
「学習中バッチ正規化がrunning mean・running varianceを更新できる」→ 正しい → 正(1)。
「小batchで基準が揺れる」→ 正しい → 正(1)。
選択問題 — 「平均からの距離で整える」→ 正規化層の核心形 → 答え1。
「過学習防止 vs 正規化層」→
①同一・
③無関係ではなく目的違い
②(重み・暗記 vs 信号サイズ)→ 答え2。
概念問題 — batch=1でバッチ正規化のみ → 不安定。層正規化
② → 答え2。
Transformer・文モデル → 層正規化
② が標準に近い → 答え2。
計算問題 — 正規化2、×3+1 → 6+1=7 → 答え3。
推論で蓄積基準を使うのはバッチ正規化
② → 答え2。