训练一个深层网络的第一道坎经常不是优化器,而是初始化:第 1 层的输出方差还是正常的,传到第 20 层可能膨胀上千倍或衰减到 $10^{-10}$。信号死在半路,反向传播的梯度同样死在半路。Xavier(Glorot)和 Kaiming 初始化分别从"前向"和"前向+反向"两个角度对这个问题给出了解:让方差逐层守恒。
前向方差守恒
设第 $l$ 层是 $y = Wx + b$,$W \in \mathbb{R}^{n_{\text{out}}\times n_{\text{in}}}$,假设权重独立同分布、均值为零,输入各分量独立且与 $W$ 独立。则输出的方差为
$$ \mathrm{Var}(y) = \sum_{j=1}^{n_{\text{in}}} \mathrm{Var}(w_{ij})\,\mathrm{Var}(x_j) = n_{\text{in}}\,\sigma_w^2\,\mathrm{Var}(x), $$
其中 $\sigma_w^2$ 是权重的方差。逐层递推下去,第 $L$ 层输出的方差是
$$ \mathrm{Var}(x^{(L)}) = \Big(\prod_{l=1}^{L} n_{\text{in}}^{(l)}\,\sigma_w^{(l)2}\Big)\,\mathrm{Var}(x^{(0)}). $$
括号里是每个因子为 1 时,输入方差才能原样传到输出。这给出前向守恒条件:
$$ \sigma_w^2 = \frac{1}{n_{\text{in}}} \qquad (\text{Xavier 前向版}). $$
反向方差守恒
反向传播的梯度也走一遍同样的乘法链:
$$ \frac{\partial L}{\partial x} = W^\top \frac{\partial L}{\partial y} \;\Longrightarrow\; \mathrm{Var}\!\Big(\frac{\partial L}{\partial x}\Big) = n_{\text{out}}\,\sigma_w^2\,\mathrm{Var}\!\Big(\frac{\partial L}{\partial y}\Big). $$
要让梯度也从第 $L$ 层无损传回第 1 层,需要反向守恒条件:
$$ \sigma_w^2 = \frac{1}{n_{\text{out}}} \qquad (\text{Xavier 反向版}). $$
两个条件一般不能同时满足(除非 $n_{\text{in}} = n_{\text{out}}$),Xavier 初始化取几何平均作为折中:
$$ \sigma_w^2 = \frac{2}{n_{\text{in}} + n_{\text{out}}}. $$
落到具体分布上:正态初始化取 $W \sim \mathcal N\!\big(0,\ \frac{2}{n_{\text{in}}+n_{\text{out}}}\big)$;均匀分布 $\mathcal U(-a, a)$ 的方差是 $a^2/3$,令 $a^2/3 = \frac{2}{n_{\text{in}}+n_{\text{out}}}$,得
$$ a = \sqrt{\frac{6}{n_{\text{in}} + n_{\text{out}}}}. $$
这就是 Glorot uniform——PyTorch 里 nn.Linear 的默认初始化(init.xavier_uniform_)。
Kaiming 修正:ReLU 砍掉了一半方差
Xavier 的推导假设激活函数是线性的(或者说,雅可比在各处约为 1)。ReLU 不满足:它以 1/2 的概率把输入置零,输出均值从 0 变成 $\frac{1}{2}\sqrt{\frac{2}{\pi}}\sigma$(正态输入下),方差也大约减半。精确地说,若输入 $z \sim \mathcal N(0, \sigma_z^2)$,则
$$ \mathrm{Var}(\max(0, z)) = \frac{\sigma_z^2}{2}. $$
每过一层方差先被权重乘 $n_{\text{in}}\sigma_w^2$、再被 ReLU 乘 $1/2$,守恒条件变成
$$ \frac{1}{2}\,n_{\text{in}}\,\sigma_w^2 = 1 \;\Longrightarrow\; \sigma_w^2 = \frac{2}{n_{\text{in}}}. $$
这就是 Kaiming 初始化。注意它只按 $n_{\text{in}}$(fan_in)定,不做 Xavier 的几何平均折中——理由是从经验看,保证前向不爆炸比保证反向严格守恒更紧要(反向还有归一化层兜底,前向爆炸直接饱和死亡)。分布形式上 Kaiming 给了正态和均匀两个版本,对应 init.kaiming_normal_ / init.kaiming_uniform_。
更一般的版本带一个 gain 参数:对 $\mathrm{ReLU}$ 族 gain $=\sqrt{2}$,对 tanh/线性 gain $=1$,对 SELU 是特殊常数。本质是把"激活函数的方差缩放因子"从公式里显式化。
现代 Transformer 为什么不用它们
打开 LLaMA 或 GPT 的实现,找不到 Xavier/Kaiming 的调用。初始化策略换成了几条针对 Transformer 结构的专门规则:
- 嵌入层与输出头:正态分布 $\mathcal N(0, 0.02^2)$。0.02 这个数来自经验而非推导:词嵌入的方差太大,会让第一层的注意力 logits 方差失控。
- 残差分支的投影层:零初始化或小初始化(如 $\mathcal N(0, 0.02^2)$ 再乘 $1/\sqrt{2L}$ 这类深度缩放)。动机和方差守恒不同:残差块输出 $x + f(x)$,若 $f$ 的初始化方差是正常量级,$f(x)$ 的随机波动会直接污染信息流。让 $f$ 初始为零,网络初始时就是恒等映射,深度不再构成数值障碍——这和 Fixup、ReZero 一路的思路一致。
- QKV 与 FFN 的第一层:常用 $\mathcal N(0, 0.02^2)$ 或 Kaiming 正态,但后面紧跟 RMSNorm,初始化方差的绝对误差会被归一化吸收,这正是归一化层存在的意义之一:把初始化问题从"全局守恒"降级为"局部别爆炸"。
一个统一视角:Xavier/Kaiming 解决的是"无归一化、无残差的深网"的方差传输问题;Transformer 用残差保证信号有一条不被权重矩阵污染的通路,用归一化保证每条通路的局部方差可控,初始化只负责"别让分支在起点就捣乱"。要求的精度不同,规则也就不同。
小结
Xavier 从 $n_{\text{in}}\sigma_w^2 = 1$(前向)和 $n_{\text{out}}\sigma_w^2 = 1$(反向)两条方差守恒条件折中出 $\sigma_w^2 = 2/(n_{\text{in}}+n_{\text{out}})$;Kaiming 补上 ReLU 的 1/2 方差损耗,得到 $\sigma_w^2 = 2/n_{\text{in}}$。两者的共同前提是"逐层乘性传输",Transformer 用残差 + 归一化改写了这个前提,所以初始化规则换成了零初始化分支、小方差嵌入这类工程经验。推导的价值不在公式本身,在于看清每个规则背后的守恒对象——方差、信噪比,还是信息流。