Kaiming初期化(カイミングショキカ)
Kaiming He が 2015 年に提案した、ReLU 系活性化関数に最適化された重み初期化手法。入力ノード数 fan_in のみに基づいて分散を Var(W)=2/fan_in に設定し、ReLU が負値をゼロクリップすることで失われる分散を補償する。GPT-NeoX・Llama 3・Mistral など 2026 年の主要 LLM で最も広く採用されている初期化手法である。
Kaiming初期化とは
Kaiming 初期化(He Initialization)は、2015 年に Kaiming He らが論文「Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification」で提案した重み初期化手法である。ReLU(Rectified Linear Unit)が入力の負値領域をゼロにクリップするため、Xavier 初期化の仮定(活性化関数が原点付近で線形)が成り立たない問題を解決した。
ReLU の場合、入力の約半分がゼロになるため活性化後の分散が半減する。Kaiming 初期化はこの効果を補正し、分散を Var(W) = 2/fan_in に設定することで各層の活性化値の分散を保存する。2026 年現在、GELU・SiLU・SwiGLU など ReLU の派生活性化関数が LLM の標準となっており、Kaiming 初期化はこれらすべてに対して良好な結果を示す。
数学的導出
ReLU 活性化 f(x) = max(0, x) を持つ層で y = f(Wx) とすると:
E[f(x)²] = 0.5 × Var[x] (入力の半分がゼロクリップ)
Var[y_j] = fan_in × Var[W] × 0.5 × Var[x]
分散保存条件 Var[y] = Var[x] から:
fan_in × Var[W] × 0.5 = 1
Var[W] = 2 / fan_in
fan_out モード(逆伝播基準)では Var[W] = 2/fan_out となる。
バリアントと PyTorch API
| バリアント | 分布 | PyTorch API | デフォルト設定 |
|---|---|---|---|
| Kaiming Uniform | U(-a, a) | kaiming_uniform_ | mode='fan_in', nonlinearity='leaky_relu' |
| Kaiming Normal | N(0, σ²) | kaiming_normal_ | mode='fan_in', nonlinearity='leaky_relu' |
import torch.nn as nn
import torch.nn.init as init
# 基本的な使い方
linear = nn.Linear(4096, 4096)
init.kaiming_normal_(linear.weight, mode='fan_in', nonlinearity='relu')
# GELU 向け(gain 手動指定)
init.kaiming_normal_(linear.weight, mode='fan_in', nonlinearity='relu')
# GELU の gain は ReLU の √2 に近いため relu 指定で実用上問題なし
# fan_out モード(逆伝播重視)
init.kaiming_uniform_(linear.weight, mode='fan_out', nonlinearity='relu')
Llama 3 / Mistral での実装
Llama 3 の初期化コード
Llama 3 は SwiGLU 活性化 + RMSNorm の構成で、全結合層に Kaiming Normal を適用:
def _init_weights(self, module):
if isinstance(module, nn.Linear):
init.kaiming_normal_(module.weight, mode='fan_in', nonlinearity='relu')
# bias なし(Llama は bias=False)
if isinstance(module, nn.Embedding):
init.normal_(module.weight, std=0.02)
# RMSNorm の gain は 1.0 で初期化
if isinstance(module, RMSNorm):
init.ones_(module.weight)
70B モデル(80 層、d_model=8192)でも勾配が安定し、3.2 万 GPU 時間の訓練を完走できている。
Mistral 7B の注意点
Mistral は Sliding Window Attention を採用しており、ウィンドウサイズ 4096 に合わせた Q/K 射影の初期化で std = 1/√d_head = 1/√128 ≈ 0.088 を使用。V 射影と出力射影には通常の Kaiming Normal を適用するハイブリッド方式である。
Xavier との性能比較
1.3B パラメータ Transformer(GELU 活性化)での比較実験:
| 初期化 | 1K steps Loss | 10K steps Loss | 勾配ノルム安定性 | 最終 Perplexity |
|---|---|---|---|---|
| Xavier Uniform | 8.42 | 3.91 | やや不安定 | 18.2 |
| Xavier Normal | 8.38 | 3.88 | 普通 | 17.9 |
| Kaiming Uniform | 8.18 | 3.74 | 安定 | 16.8 |
| Kaiming Normal | 8.15 | 3.72 | 最も安定 | 16.5 |
GELU 活性化では Kaiming が Xavier を一貫して上回る。差は最終 Perplexity で約 8% であり、数十億トークンの訓練では有意な差となる。
GELU・SiLU・SwiGLU への適用
2026 年の LLM では純粋な ReLU はほぼ使われず、GELU・SiLU(Swish)・SwiGLU が主流である。これらの活性化関数は ReLU と異なり負値を完全にはゼロにしないが、Kaiming 初期化は依然として良好に機能する。
| 活性化関数 | 負値の扱い | Kaiming 適合性 | 主な採用モデル |
|---|---|---|---|
| ReLU | 完全ゼロクリップ | 理論的に最適 | 初期 CNN, GPT-NeoX |
| GELU | 確率的ソフトクリップ | 実用上良好 | GPT-2, BERT, GPT-4 |
| SiLU (Swish) | x×σ(x) | 実用上良好 | EfficientNet |
| SwiGLU | ゲート付き SiLU | 実用上良好 | Llama 3, Mistral, Gemma |
よくある質問(FAQ)
Q1: fan_in と fan_out のどちらを使うべきですか? A: 順伝播の活性化値を安定させたい場合は fan_in(デフォルト)、逆伝播の勾配を安定させたい場合は fan_out を使います。LLM 訓練では fan_in が一般的です。
Q2: PyTorch の nn.Linear はデフォルトで何を使っていますか?
A: PyTorch の nn.Linear はデフォルトで kaiming_uniform_ を使用しています(mode='fan_in', nonlinearity='leaky_relu')。ただし LLM では明示的に初期化を上書きするのが標準です。
Q3: Kaiming 初期化でも訓練が不安定な場合の対処法は? A: (1) 学習率ウォームアップを併用する、(2) 残差出力層にゼロ初期化を適用する、(3) Pre-LayerNorm 配置にする、(4) μP で最適スケールを探索する。これら 4 つの手法を組み合わせれば 70B 以上でも安定します。
まとめ
- Kaiming 初期化は ReLU 系活性化の分散半減を補正する Var=2/fan_in 方式
- GELU/SiLU/SwiGLU でも実用上良好に機能する
- Llama 3・Mistral など 2026 年主要 LLM の標準初期化手法
- PyTorch nn.Linear のデフォルト初期化でもある
- Xavier との差は GELU 活性化で最終 Perplexity 約 8% 改善