Heng's Blog
01 02

神经网络的权重初始化会直接影响前向传播中的激活分布,以及反向传播时梯度能否稳定流动。本文从一个线性层出发,逐步比较零初始化、小随机数、Xavier 初始化和 Kaiming 初始化。

本文整理自 hengproject/ML_recall 中的 basics/weight_initialization.ipynb。课程内容参考 USC CSCI 566: Deep Learning and Its Applications。

从零初始化开始#

以一个线性层为例。使用增广记号,将偏置合并到输入向量中:

x=[x0,x1,,xn,b],Y=wTx.\underline{x} = [x_0, x_1, \ldots, x_n, b], \qquad Y = \underline{w}^{T}\underline{x}.

如果所有权重都初始化为零,那么无论输入如何变化,线性层的输出都会是零:

更重要的是,对具有多个同构神经元的网络而言,相同的初始权重会产生相同的输出和梯度,神经元无法学习出不同特征。因此,需要用非零随机值打破对称性。

小随机数初始化#

一种直观方法是从方差很小的高斯分布中采样权重:

wN(μ,σ2).\underline{w} \sim \mathcal{N}(\mu, \sigma^2).
np.random.seed(2025)
w = 0.01 * np.random.randn(100)
y = w.T @ x
python

单层网络中,这似乎没有问题;但在深层网络中,每一层都会继续缩小信号。下面构造一个六层、使用 tanh 激活函数的网络:

h0=x,hi=tanh(hi1WiT).h_0 = x, \qquad h_i = \tanh(h_{i-1}W_i^T).

小随机数初始化下各层的激活分布

越靠后的层,激活值越集中在零附近。信号和梯度逐层衰减,网络会变得难以训练。

Xavier 初始化#

Xavier 初始化的目标是让输入与输出的方差尽可能保持一致。对 fan_in 个输入,常用的正态分布形式为:

WN(0,1nin).W \sim \mathcal{N}\left(0, \frac{1}{n_{in}}\right).

假设 WjiW_{ji}xix_i 相互独立、均值为零,且

WjiN(0,1nin),Var(xi)=σ2.W_{ji} \sim \mathcal{N}\left(0, \frac{1}{n_{in}}\right), \qquad \operatorname{Var}(x_i) = \sigma^2.

对线性变换 zj=iWjixi+bjz_j = \sum_i W_{ji}x_i + b_j,有:

Var(zj)=i=1ninVar(Wjixi)=i=1ninVar(Wji)Var(xi)=nin1ninσ2=σ2.\begin{aligned} \operatorname{Var}(z_j) &= \sum_{i=1}^{n_{in}} \operatorname{Var}(W_{ji}x_i) \\ &= \sum_{i=1}^{n_{in}} \operatorname{Var}(W_{ji})\operatorname{Var}(x_i) \\ &= n_{in} \cdot \frac{1}{n_{in}} \cdot \sigma^2 \\ &= \sigma^2. \end{aligned}

tanh 在零附近近似线性,因此这种初始化能够在一定程度上让各层激活保持相近的方差:

Xavier 初始化下各层的 tanh 激活分布

Xavier 与 ReLU#

将相同的 Xavier 初始化直接用于 ReLU,激活分布仍然会随网络加深而收缩:

for fan_in, fan_out in zip(dims[:-1], dims[1:]):
    w = np.random.randn(fan_in, fan_out) / np.sqrt(fan_in)
    x = np.maximum(0, x @ w.T)
python

Xavier 初始化下各层的 ReLU 激活分布

ReLU 会把负值截断为零。在输入关于零对称的近似条件下,可将其视为使 E[z2]E[z^2] 大约减半。为保持尺度,需要令:

ReLU 对 E[z²] 的影响

zz 关于零对称时,正负两侧对 E[z2]E[z^2] 的贡献相同。ReLU 将负数一侧截断为零,因此保留下来的 E[z2]E[z^2] 约为原来的一半:

E[ReLU(z)2]12E[z2].E[\operatorname{ReLU}(z)^2] \approx \frac{1}{2}E[z^2].

取一组关于零对称的数值:

z=[2,1,1,2],z2=[4,1,1,4],E[z2]=104=2.5.\begin{aligned} z &= [-2,-1,1,2], \\ z^2 &= [4,1,1,4], \\ E[z^2] &= \frac{10}{4}=2.5. \end{aligned}

经过 ReLU 后,负数被置为零:

ReLU(z)=[0,0,1,2],ReLU(z)2=[0,0,1,4],E[ReLU(z)2]=54=1.25=12×2.5.\begin{aligned} \operatorname{ReLU}(z) &= [0,0,1,2], \\ \operatorname{ReLU}(z)^2 &= [0,0,1,4], \\ E[\operatorname{ReLU}(z)^2] &= \frac{5}{4}=1.25 = \frac{1}{2}\times 2.5. \end{aligned}

对于具有 ninn_{in} 个输入的线性层,其输出满足:

E[z2]ninVar(w)E[x2].E[z^2] \approx n_{in}\operatorname{Var}(w)E[x^2].

经过 ReLU 后:

E[ReLU(z)2]12ninVar(w)E[x2].E[\operatorname{ReLU}(z)^2] \approx \frac{1}{2}n_{in}\operatorname{Var}(w)E[x^2].

为了让每一层前后的信号尺度基本不变,需要满足:

12ninVar(w)1,\frac{1}{2}n_{in}\operatorname{Var}(w) \approx 1,

由此得到 He 初始化采用的关系 Var(w)2/nin\operatorname{Var}(w) \approx 2/n_{in}

Var(zj)=ninσw2σx2,Var(ReLU(zj))12ninσw2σx2.\begin{aligned} \operatorname{Var}(z_j) &= n_{in}\sigma_w^2\sigma_x^2, \\ \operatorname{Var}(\operatorname{ReLU}(z_j)) &\approx \frac{1}{2}n_{in}\sigma_w^2\sigma_x^2. \end{aligned}

要求输出尺度与输入一致,可得:

12ninσw2σx2=σx2σw2=2nin.\frac{1}{2}n_{in}\sigma_w^2\sigma_x^2 = \sigma_x^2 \quad\Longrightarrow\quad \sigma_w^2 = \frac{2}{n_{in}}.

Kaiming 初始化#

因此,对 ReLU 网络可按下面的标准差初始化权重:

σw=2nin.\sigma_w = \sqrt{\frac{2}{n_{in}}}.

Kaiming 初始化下各层的 ReLU 激活分布

小结#

初始化方法典型尺度更适合的激活函数
小随机数0.01N(0,1)0.01 \cdot \mathcal{N}(0, 1)浅层网络或实验基线
XavierVar(W)1/nin\operatorname{Var}(W) \approx 1 / n_{in}tanhsigmoid 等近似对称激活
KaimingVar(W)2/nin\operatorname{Var}(W) \approx 2 / n_{in}ReLU 及其变体

初始化方法的核心不是记住常数,而是控制信号在网络深度方向上的尺度。实际使用时,还应结合激活函数、残差连接、归一化层和框架提供的初始化 API 共同考虑。

深度学习中的权重初始化
https://heng-blog.pages.dev/blog/ml-weight-initialization
Author 杨苏恒
Published at April 17, 2025