AI・機械学習
上級

Kaiming初期化(カイミングショキカ)

Kaiming He が 2015 年に提案した、ReLU 系活性化関数に最適化された重み初期化手法。入力ノード数 fan_in のみに基づいて分散を Var(W)=2/fan_in に設定し、ReLU が負値をゼロクリップすることで失われる分散を補償する。GPT-NeoX・Llama 3・Mistral など 2026 年の主要 LLM で最も広く採用されている初期化手法である。

0 回閲覧
0 いいね

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 UniformU(-a, a)kaiming_uniform_mode='fan_in', nonlinearity='leaky_relu'
Kaiming NormalN(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 Loss10K steps Loss勾配ノルム安定性最終 Perplexity
Xavier Uniform8.423.91やや不安定18.2
Xavier Normal8.383.88普通17.9
Kaiming Uniform8.183.74安定16.8
Kaiming Normal8.153.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% 改善