Xavier初期化(ザビエルショキカ)
Xavier Glorot が 2010 年に提案した、ニューラルネットワークの重み初期化手法。入力ノード数 fan_in と出力ノード数 fan_out の和に基づいて分散をスケーリングし、各層の活性化値と勾配の分散を一定に保つ。Sigmoid・Tanh 活性化関数で理論的に最適であり、初期の Transformer モデルや BERT の初期化に広く採用された。
Xavier初期化とは
Xavier 初期化(Xavier Initialization)は、2010 年に Xavier Glorot と Yoshua Bengio が論文「Understanding the difficulty of training deep feedforward neural networks」で提案した重み初期化手法である。ニューラルネットワークの各層で順伝播時の活性化値の分散と逆伝播時の勾配の分散が層をまたいでも一定に保たれるよう、重みの分散を Var(W) = 2 / (fan_in + fan_out) に設定する。fan_in は入力ユニット数、fan_out は出力ユニット数である。
この手法が登場する以前は、重みを N(0, 0.01) や一様分布 U(-1, 1) で適当に初期化することが一般的で、5 層以上のネットワークでは勾配消失・爆発が頻発していた。Xavier 初期化により深層ネットワークの安定訓練が初めて実用的になり、ディープラーニング革命の基盤技術の一つとなった。
数学的導出
順伝播の分散保存
線形層 y = Wx + b において、入力 x の各要素が独立同分布で E[x]=0, Var[x]=σ²_x、重み W の各要素も独立で E[W]=0, Var[W]=σ²_w とすると:
Var[y_j] = fan_in × σ²_w × σ²_x
各層で分散を保存する条件 Var[y] = Var[x] を満たすには σ²_w = 1/fan_in が必要。
逆伝播の勾配保存
同様に逆伝播では σ²_w = 1/fan_out が条件となる。Xavier 初期化はこの 2 条件の妥協として:
σ²_w = 2 / (fan_in + fan_out)
を採用する。一様分布版では U(-a, a) で a = √(6 / (fan_in + fan_out)) となる。
2 つのバリアント
| バリアント | 分布 | PyTorch API | 分散 |
|---|---|---|---|
| Xavier Uniform | U(-a, a) | torch.nn.init.xavier_uniform_ | 2/(fan_in+fan_out) |
| Xavier Normal | N(0, σ²) | torch.nn.init.xavier_normal_ | 2/(fan_in+fan_out) |
Uniform 版は a = √(6/(fan_in+fan_out)) で一様分布、Normal 版は σ = √(2/(fan_in+fan_out)) で正規分布を使う。実用上の差は小さいが、Uniform 版の方がわずかに収束が速いとの報告がある。
PyTorch 実装例
import torch.nn as nn
import torch.nn.init as init
class XavierLinear(nn.Module):
def __init__(self, in_features, out_features):
super().__init__()
self.linear = nn.Linear(in_features, out_features)
# Xavier Uniform 初期化
init.xavier_uniform_(self.linear.weight, gain=1.0)
init.zeros_(self.linear.bias)
def forward(self, x):
return torch.tanh(self.linear(x))
# gain パラメータの活用
# Tanh: gain = 5/3 ≈ 1.6667
init.xavier_uniform_(layer.weight, gain=nn.init.calculate_gain('tanh'))
# Sigmoid: gain = 1.0
init.xavier_uniform_(layer.weight, gain=nn.init.calculate_gain('sigmoid'))
# ReLU: gain = √2(ただし ReLU には Kaiming 推奨)
init.xavier_uniform_(layer.weight, gain=nn.init.calculate_gain('relu'))
Xavier 初期化の限界と Kaiming 初期化との違い
Xavier 初期化は活性化関数が原点付近で線形(Sigmoid/Tanh の線形領域)であることを仮定している。ReLU は負の入力を 0 にクリップするため、活性化値の分散が半分になる。この問題に対処するため He(Kaiming)初期化では Var(W) = 2/fan_in とスケールを 2 倍にする。
| 比較項目 | Xavier | Kaiming |
|---|---|---|
| 提案年 | 2010 | 2015 |
| 対象活性化 | Sigmoid, Tanh | ReLU, GELU, SiLU |
| 分散式 | 2/(fan_in+fan_out) | 2/fan_in |
| LLM での利用 | BERT, Transformer-XL | Llama 3, Mistral |
| gain 考慮 | 活性化ごとに gain 指定 | mode=fan_in/fan_out |
2026 年の LLM は GELU・SiLU・SwiGLU など ReLU 系活性化が主流であるため、Kaiming 初期化が標準となっている。ただし Attention の Query/Key のドット積には活性化関数がないため、Xavier が依然として適切なケースもある。
BERT・Transformer-XL での採用事例
BERT(2018)
BERT は全結合層に N(0, 0.02) の Truncated Normal を使うが、これは d_model=768 での Xavier Normal(σ = √(2/(768+768)) ≈ 0.036)に近い値である。実質的に Xavier 派生の初期化と見なせる。
Transformer-XL(2019)
Transformer-XL はセグメント再帰機構を持つため、層間の勾配伝播が通常の Transformer より長くなる。Xavier Normal を採用し、再帰経路での勾配安定化に寄与している。
よくある質問(FAQ)
Q1: Xavier 初期化はいつ使うべきですか? A: Sigmoid・Tanh 活性化関数を使う層、または活性化関数を適用しない線形層(Attention の QK 射影など)で使用します。ReLU/GELU/SiLU を使う層では Kaiming 初期化を推奨します。
Q2: Xavier Uniform と Xavier Normal のどちらが良いですか? A: 実用上の差はほぼありません。PyTorch のデフォルトは Kaiming Uniform ですが、Xavier を使う場合は Uniform 版がわずかに収束が速いとする実験報告があります。大規模モデルでは Normal 版が好まれる傾向です。
Q3: gain パラメータの正しい設定方法は?
A: nn.init.calculate_gain(activation_name) で自動計算できます。Tanh は 5/3、Sigmoid は 1.0、ReLU は √2 です。GELU や SiLU はカスタム gain が必要で、経験的に √2 に近い値が使われます。
まとめ
- Xavier 初期化は fan_in + fan_out ベースの分散スケーリングで勾配安定化を実現
- Sigmoid/Tanh 活性化で理論的に最適、BERT 系モデルの基盤
- ReLU 系には Kaiming 初期化が推奨される
- PyTorch では
xavier_uniform_/xavier_normal_でワンライナー適用 - 2026 年の LLM では直接使用は減少したが、理論的重要性は不変