← 機械学習テキスト 一覧

🎓 レベル:標準 | 重要度:B(標準)

📎 前提:誤差逆伝播法活性化関数(勾配消失/爆発)

要点(BLUF)


1. なぜ初期化が重要なのか

深いネットの学習がうまくいくかどうかは、最初の重みのスケールに驚くほど敏感です。理由は 誤差逆伝播法活性化関数 で見た勾配消失/爆発にあります。

順伝播でも逆伝播でも、信号は層を通るたびに「重み行列を掛ける」操作を繰り返します。掛け算の連鎖なので、1 層あたり信号がわずかに縮む(または膨らむ)だけでも、LL 層重なれば指数的に消失(または発散)します。

要するに:初期化とは「対称性を破る乱数」かつ「信号が指数的に消えも爆発もしないスケール」を選ぶ作業です。

ここから「ちょうど良いスケール」を分散保存という条件から数式で導きます。


2. Xavier/Glorot 初期化:分散を層をまたいで保つ

順伝播の分散をたどる

1 つのニューロンの入力前活性 yy を、ninn_{\text{in}} 本の入力 xix_i と重み wiw_i の和で書きます(バイアスは省略)。

y=i=1ninwixiy = \sum_{i=1}^{n_{\text{in}}} w_i x_i

仮定を置きます:重みと入力は独立、どちらも平均 0、各 wiw_i は同分布、各 xix_i も同分布。すると分散は次のように展開できます。

Var(y)=Var ⁣(i=1ninwixi)=i=1ninVar(wixi)=ninVar(w)Var(x)\mathrm{Var}(y) = \mathrm{Var}\!\left(\sum_{i=1}^{n_{\text{in}}} w_i x_i\right) = \sum_{i=1}^{n_{\text{in}}} \mathrm{Var}(w_i x_i) = n_{\text{in}}\,\mathrm{Var}(w)\,\mathrm{Var}(x)

ここで使った事実は2つです。(1) 独立な確率変数の和の分散は分散の和になる。(2) 平均 0 で独立な2変数の積では Var(wixi)=Var(wi)Var(xi)\mathrm{Var}(w_i x_i)=\mathrm{Var}(w_i)\mathrm{Var}(x_i) になる(平均 0 が効いて交差項が消えます)。

層をまたいで分散を一定に保つ、つまり Var(y)=Var(x)\mathrm{Var}(y)=\mathrm{Var}(x) にしたいので、

ninVar(w)=1Var(w)=1ninn_{\text{in}}\,\mathrm{Var}(w)=1 \quad\Longrightarrow\quad \boxed{\mathrm{Var}(w)=\frac{1}{n_{\text{in}}}}

要するに:入力が ninn_{\text{in}} 本あって足し合わせる分、1 本あたりの重みの分散を 1/nin1/n_{\text{in}} に抑えれば、出力の散らばりが入力と同じになり、層を重ねても信号が一定スケールに保たれます。

逆伝播も考えて折衷する

誤差逆伝播法 で見たように、勾配は逆向きに同じ重み行列を掛けて伝わります。逆伝播で分散を保つには、対称的な議論から

Var(w)=1nout\mathrm{Var}(w)=\frac{1}{n_{\text{out}}}

が要求されます。順伝播(1/nin1/n_{\text{in}})と逆伝播(1/nout1/n_{\text{out}})の両方を同時に満たすのは一般に不可能ninnoutn_{\text{in}}\neq n_{\text{out}} なら矛盾)なので、Glorot と Bengio は両者の**調和(折衷)**を取りました。

Var(w)=2nin+nout\boxed{\mathrm{Var}(w)=\frac{2}{n_{\text{in}}+n_{\text{out}}}}

具体的には、一様分布なら区間 [6nin+nout, 6nin+nout]\left[-\sqrt{\dfrac{6}{n_{\text{in}}+n_{\text{out}}}},\ \sqrt{\dfrac{6}{n_{\text{in}}+n_{\text{out}}}}\right] から引きます(一様分布の分散が (半幅)2/3(\text{半幅})^2/3 なので、6/3=26/3=2 で辻褄が合います)。

要するに:Xavier は「順と逆の両方向で信号の分散を保つ」よう、入力数と出力数の平均で重みのスケールを決める初期化です。tanh や sigmoid のように原点まわりで線形に近い(微分が 1 付近の)活性化に向きます


3. He 初期化:ReLU のための補正

Xavier の導出では「活性化が原点まわりで線形(傾き ≈ 1)」を暗に仮定していました。ところが ReLU は max(0,x)\max(0,x) なので、入力の半分(負の側)を問答無用で 0 にします

平均 0 で対称な分布の入力に ReLU を通すと、分散はおよそ半分になります。直観的には「半分のニューロンが死ぬ」ので、出力の散らばりが半減するイメージです。式で書くと、ReLU 通過後の分散は通過前の約 12\tfrac{1}{2} です。

すると分散保存の条件式に 12\tfrac{1}{2} の係数が入ります。

12ninVar(w)=1Var(w)=2nin\frac{1}{2}\,n_{\text{in}}\,\mathrm{Var}(w)=1 \quad\Longrightarrow\quad \boxed{\mathrm{Var}(w)=\frac{2}{n_{\text{in}}}}

これが He(Kaiming)初期化です。Xavier の 1/nin1/n_{\text{in}} に対し、ちょうど 2 倍になっています。この 2 倍が、ReLU が削り取る半分をぴったり埋め合わせます。

要するに:ReLU は信号の分散を半分にするので、重みの分散を 2 倍(2/nin2/n_{\text{in}})にして相殺する。ReLU 系(ReLU・Leaky ReLU など)を使うなら He 初期化が標準です。

活性化推奨初期化重みの分散
tanh / sigmoidXavier / Glorot2nin+nout\dfrac{2}{n_{\text{in}}+n_{\text{out}}}
ReLU / Leaky ReLUHe / Kaiming2nin\dfrac{2}{n_{\text{in}}}

4. バッチ正規化(BatchNorm):層の入力を毎回そろえる

初期化は「学習開始時点」の分散をそろえる対策でした。しかし学習が進むと前の層の重みが動き、各層への入力分布はまた崩れていきます。BatchNorm は学習中、各層の入力を毎ステップ標準化し直すことでこれに対処します。

ミニバッチ B={x1,,xm}B=\{x_1,\dots,x_m\}(特徴の各次元ごと)に対し、次の4ステップを行います。

μB=1mi=1mxi,σB2=1mi=1m(xiμB)2\mu_B=\frac{1}{m}\sum_{i=1}^{m}x_i, \qquad \sigma_B^2=\frac{1}{m}\sum_{i=1}^{m}(x_i-\mu_B)^2 x^i=xiμBσB2+ϵ,yi=γx^i+β\hat x_i=\frac{x_i-\mu_B}{\sqrt{\sigma_B^2+\epsilon}}, \qquad y_i=\gamma\,\hat x_i+\beta
flowchart LR
    X["層への入力 x(ミニバッチ)"] --> M["平均 μ_B を計算"]
    X --> V["分散 σ_B^2 を計算"]
    M --> N["標準化 x_hat =(x − μ_B)/ √(σ_B^2 + ε)"]
    V --> N
    N --> S["スケール・シフト y = γ・x_hat + β"]
    S --> OUT["次の層へ(活性化へ)"]
    G["学習可能 γ(scale)"] --> S
    B["学習可能 β(shift)"] --> S

学習時と推論時で統計量が違う(最重要)

ここが BatchNorm 最大の注意点です。

y=γxE[x]Var[x]+ϵ+β(推論時:μB,σB2 の代わりに移動平均)y=\gamma\cdot\frac{x-\mathbb{E}[x]}{\sqrt{\mathrm{Var}[x]+\epsilon}}+\beta \quad(\text{推論時:}\mu_B,\sigma_B^2\ \text{の代わりに移動平均})
flowchart TB
    subgraph TRAIN["学習時"]
        A1["ミニバッチ統計 μ_B, σ_B^2 を使う"] --> A2["同時に移動平均を更新して蓄積"]
    end
    subgraph INFER["推論時"]
        B1["蓄えた移動平均(母集団統計)を固定で使う"]
    end
    A2 -. "学習で貯めた統計を引き継ぐ" .-> B1

要するに:学習時は「今のバッチ」で標準化、推論時は「学習中ずっと観測した平均」で標準化。フレームワークの model.train() / model.eval() 切り替えはこの統計量の出し分けを担っており、切り替え忘れは推論結果を壊すバグの定番です。

なぜ効くのか(内部共変量シフト説には議論がある・要最新確認)

原論文(Ioffe & Szegedy, 2015)は「内部共変量シフト(学習中に各層の入力分布が動いてしまう現象)を抑えるから効く」と説明しました。直観的でわかりやすい説明です。

しかし後続研究(Santurkar et al., 2018)はこれに反論しています。わざとノイズを加えて共変量シフトを増やしても BatchNorm の効果は落ちなかったという実験から、「共変量シフトの抑制が効く理由ではない」と主張しました。代わりに提示されたのが損失地形の平滑化(smoothing the loss landscape)という説明です。BatchNorm は損失と勾配のリプシッツ性を改善(β\beta-平滑性を高める) し、勾配がより予測可能で滑らかになる——式の上では勾配の大きさを γ2/σ2\gamma^2/\sigma^2 のスケールで抑える——ため、学習率を大きく取れて収束が速くなる、というものです。

実務上の効果として観測されるのは次の3点です。

  1. 学習率を上げられる(収束が速い)
  2. 初期化への頑健性が増す(多少ラフな初期化でも学習が進む)
  3. 軽い正則化効果(ミニバッチごとに統計が揺れるノイズが効く。そのため Dropout を弱める/外すこともある)

⚠️ 要最新確認:「なぜ効くか」は今も決着していない研究テーマです。内部共変量シフト説は直観的入口として有用ですが、それが本質だと断定はできません。


5. LayerNorm:Transformer の定番(要最新確認)

BatchNorm は「バッチ方向(同じ特徴次元を、バッチ内のサンプル間で)」標準化します。一方 LayerNorm は「特徴方向(1 サンプル内の全特徴を)」標準化します。正規化の向きが 90 度違う、と覚えると整理しやすいです。

LayerNorm が系列モデル・Transformer で好まれる理由:

⚠️ 要最新確認:近年の LLM では LayerNorm を簡略化した RMSNorm が主流になりつつあり、正規化を層の前に置く Pre-LN 構成が安定とされます。この辺りは動きが速い領域です。詳細は 深層学習アーキテクチャ 目次 側(Transformer)で扱います。


⚠️ よくある誤解・落とし穴


まとめ


対応するシミュレーション

simulations/init_and_vanishing.py:30層の深いネットワーク(ReLU)に入力を順伝播させ、層ごとの活性化の標準偏差を測ります。初期化スケールが小さすぎると信号が層を経るごとに 00 へ消え、大きすぎると爆発するのに対し、He初期化(分散 2/n2/n)なら活性化の大きさが深さを通じてほぼ保たれることを対数軸で確認できます。BatchNorm が初期化への過敏さを別角度から緩和する話とも対応します。

初期化スケールと信号の消失/爆発・He初期化

関連ノート