ゼロ初期化・残差初期化(ゼロショキカザンサショキカ)
ニューラルネットワークの特定層(残差ブロックの出力射影など)の重みをゼロで初期化する手法。全層ゼロ初期化は対称性問題で訓練不能となるが、残差接続の出力層のみをゼロ初期化すると各残差ブロックが訓練初期に恒等関数として振る舞い、深層ネットワークの勾配安定化に貢献する。GPT-2・GPT-3・OPT で標準採用されている。
ゼロ初期化・残差初期化とは
ゼロ初期化(Zero Initialization)は、重み行列のすべての要素を 0 に設定する初期化手法である。単独で全層に適用すると「対称性問題(symmetry problem)」により訓練が完全に停滞するため禁忌とされるが、残差接続(Residual Connection)の出力射影層に限定して適用する「残差初期化(Residual Initialization)」は深層 Transformer の安定化に極めて有効であり、GPT-2 以降の主要 LLM で広く採用されている。
残差ブロック y = x + F(x) において、F(x) の最終層をゼロ初期化すると、訓練開始時 F(x) ≈ 0 となり y ≈ x(恒等写像)として動作する。これにより、初期状態では入力がそのまま伝播し、勾配も安定して逆伝播する。訓練が進むにつれて F(x) の重みが更新され、徐々に非自明な変換を学習していく。
対称性問題:なぜ全層ゼロ初期化は使えないか
全層をゼロ初期化した場合の問題:
- 順伝播: すべてのニューロンが同一出力
y = 0を生成 - 勾配計算: すべてのニューロンが同一勾配を受け取る
- パラメータ更新: すべての重みが同一方向に同一量だけ更新される
- 結果: 全ニューロンが永遠に同一のまま → ネットワークの表現力が 1 ニューロンと等価
この対称性は訓練では決して破れないため、全層ゼロ初期化は必ず失敗する。
GPT-2 の残差スケーリング初期化
GPT-2(Radford et al., 2019)は以下の初期化戦略を採用した:
import torch.nn as nn
import torch.nn.init as init
class GPT2Block(nn.Module):
def __init__(self, d_model, n_heads, n_layers):
super().__init__()
self.attn = MultiHeadAttention(d_model, n_heads)
self.attn_proj = nn.Linear(d_model, d_model)
self.ffn_up = nn.Linear(d_model, 4 * d_model)
self.ffn_down = nn.Linear(4 * d_model, d_model)
self._init(n_layers)
def _init(self, n_layers):
# 通常層: Truncated Normal (σ=0.02)
for m in [self.attn, self.ffn_up]:
init.trunc_normal_(m.weight, std=0.02)
# 残差出力層: スケールダウン (σ=0.02/√(2N))
scale = 0.02 / (2 * n_layers) ** 0.5
init.trunc_normal_(self.attn_proj.weight, std=scale)
init.trunc_normal_(self.ffn_down.weight, std=scale)
GPT-2 の方式は厳密なゼロ初期化ではなく「残差スケーリング初期化」であり、1/√(2N) のスケールファクターで残差出力の初期値をゼロに近づける。N=48(GPT-2 Large)では scale ≈ 0.002 となり、ほぼゼロに近い。
各モデルの残差初期化比較
| モデル | 残差初期化方式 | スケール | 対象層 | 理由 |
|---|---|---|---|---|
| GPT-2 | Truncated Normal × 1/√(2N) | σ≈0.002 (N=48) | attn_proj, ffn_down | 漸進的残差学習 |
| GPT-3 | 同上 | σ≈0.001 (N=96) | 同上 | 96 層安定化 |
| OPT | ゼロ初期化 | 0 | attn_out, ffn_out | 完全恒等初期 |
| PaLM | 縮小スケーリング | σ=0.02/√d | ffn_output | d_model 依存 |
| Llama 3 | Kaiming + 残差なし | 標準 Kaiming | — | RMSNorm で安定化 |
| DeepSeek-V2 | Small Init | σ=2/(d×√L) | 全出力射影 | MoE 安定化 |
ReZero: 学習可能なゼロ初期化
ReZero(Bachlechner et al., 2020)は残差ブロックを y = x + α × F(x) と修正し、スカラー α をゼロ初期化する手法である。α は訓練可能パラメータで、訓練が進むにつれて自動的に最適な残差スケールを学習する。
class ReZeroBlock(nn.Module):
def __init__(self, d_model):
super().__init__()
self.alpha = nn.Parameter(torch.zeros(1)) # ゼロ初期化
self.ffn = FeedForward(d_model)
def forward(self, x):
return x + self.alpha * self.ffn(x)
ReZero は Pre-LayerNorm を使わずに 120 層の Transformer を安定訓練できることが示されたが、2026 年の主要 LLM では LayerNorm/RMSNorm との組み合わせが標準であり、ReZero 単体の採用は限定的である。
FixUp Initialization
Zhang et al.(2019)が提案した FixUp は、残差ネットワークで Normalization 層なしでも訓練できるよう初期化を設計した手法である:
- 残差ブロック内の最終層の重み・バイアスをゼロ初期化
- 残差ブロック内の他の層の重みを
L^(-1/(2m-2))でスケーリング(L はブロック数、m はブロック内層数) - 残差ブロックにスカラーバイアス(学習可能)を追加
FixUp は BatchNorm/LayerNorm を不要にする理論的に重要な結果だが、LLM の実装では RMSNorm のオーバーヘッドが極小であるため、FixUp を採用するモチベーションは薄い。
実践ガイド:いつゼロ初期化を使うか
| ユースケース | 推奨初期化 | 理由 |
|---|---|---|
| 残差出力射影(attn_proj, ffn_down) | ゼロまたは縮小スケール | 恒等初期化で勾配安定 |
| バイアス項 | ゼロ | 標準的な選択 |
| LayerNorm/RMSNorm のバイアス | ゼロ | 正規化後のシフトなし |
| LayerNorm のゲイン | 1.0(ones_) | 正規化後のスケール保持 |
| LoRA の B 行列 | ゼロ | 初期状態でアダプタが恒等 |
| 分類ヘッド(ファインチューニング) | ゼロまたは Xavier | 小スケールから学習開始 |
| 通常の全結合層 | ゼロ禁止 | 対称性問題で訓練不能 |
| Embedding 層 | ゼロ禁止 | 全トークンが同一表現 |
よくある質問(FAQ)
Q1: 全層ゼロ初期化と残差ゼロ初期化の違いは何ですか?
A: 全層ゼロ初期化はすべての層の重みを 0 にするため対称性問題で訓練不能です。残差ゼロ初期化は残差ブロックの出力射影層のみをゼロにし、他の層は Xavier/Kaiming で初期化します。残差接続 y = x + F(x) により F(x)=0 でも x は伝播するため、勾配が通ります。
Q2: LoRA のゼロ初期化はなぜ有効ですか?
A: LoRA は W = W₀ + BA でアダプタを追加する手法です。B 行列をゼロ初期化すると BA = 0 となり、初期状態でプリトレイン重み W₀ がそのまま使われます。訓練が進むにつれて B が更新され、タスク固有の微調整が徐々に加わります。A 行列はランダム初期化(Kaiming)です。
Q3: GPT-2 の 1/√(2N) スケーリングの 2 はどこから来ますか?
A: 各 Transformer ブロックには 2 つの残差接続(Attention 出力 + FFN 出力)があるためです。N ブロックで合計 2N 回の残差加算があり、各残差の寄与を 1/√(2N) にスケールすることで合計分散を一定に保ちます。
まとめ
- 全層ゼロ初期化は対称性問題で訓練不能 — 絶対に使わない
- 残差出力層のみのゼロ/縮小初期化は深層 Transformer 安定化の定石
- GPT-2/3 の
σ = 0.02/√(2N)方式が最も広く採用されている - LoRA の B 行列ゼロ初期化はファインチューニングの標準テクニック
- ReZero・FixUp は理論的に重要だが、LLM での実用採用は限定的