Kaiming 初始化(也称为 He 初始化)的核心目标是:让输入信号在前向传播和反向传播时,其方差保持稳定,避免随网络加深而指数级爆炸或消失。
对于使用 ReLU 激活函数的网络,Kaiming 初始化建议将权重方差设为 fan_in2(分子是 2,而不是 Xavier 初始化中的 1)。这个“2”正是为了补偿 ReLU 将大约一半的神经元输出置为 0 的特性。
假设第 l 层的权重 Wl 独立同分布,均值为 0,方差为 σl2。该层输入为 xl−1(来自上一层的 ReLU 输出),且 xl−1 均值为 0,方差为 Var[xl−1]。
前向传播:
yl=Wlxl−1,xl=ReLU(yl)我们希望 Var[xl]=Var[xl−1]。
设 Wl 形状为 dl×dl−1,其中 dl−1 是 fan_in。对于第 j 个神经元:
yl,j=k=1∑dl−1Wl,jkxl−1,k由于 W 与 xl−1 独立且零均值,方差为:
Var[yl,j]=dl−1⋅σl2⋅Var[xl−1,k]假设各分量同分布,记 Var[xl−1]=σx,l−12,则:
Var[yl]=dl−1σl2σx,l−12
ReLU 函数:xl=max(0,yl)。若 yl 服从均值为 0 的对称分布(通常如此),则 ReLU 后恰好有一半的数值被置为零,另一半保留原值。此时:
Var[xl]=21Var[yl]推导:对于零均值对称分布,E[yl]=0,则
E[xl2]=E[max(0,yl)2]=21E[yl2]因为一半的概率 y_l ≤ 0 贡献为 0,另一半 y_l > 0 贡献为 y_l^2。而 Var[xl]=E[xl2]−(E[xl])2,且 E[xl]=E[max(0,yl)]=2π1σyl 不为零,但主要影响是缩放因子约 1/2。更精确的推导(He et al., 2015)得到:
Var[xl]=21Var[yl]
要求 Var[xl]=σx,l−12,代入:
21⋅dl−1σl2σx,l−12=σx,l−12消去 σx,l−12,得:
σl2=dl−12因此,权重的方差应该设为 fan_in2。如果使用反向传播推导(考虑梯度),会得到类似结果,分子依然是 2。
Xavier 初始化针对的是 tanh 或 sigmoid 等关于原点对称且输出范围有限的激活函数。在理想情况下(激活函数近似线性区),梯度流可以保持方差不变,推导结果:
σl2=fan_in1这相当于假设激活函数不改变信号的方差(即线性激活)。而 ReLU 会主动砍掉一半的激活,导致信号方差减半,所以需要将输入权重的方差扩大一倍来补偿。
- 没有 ReLU:信号经过一层,方差乘以 dl−1σl2。要维持不变,需要 σl2=1/dl−1(分子=1)。
- 有 ReLU:信号经过 ReLU,方差损失一半,因此需要在前一步将方差放大一倍,即 σl2=2/dl−1。
PyTorch 的 nn.init.kaiming_normal_ 默认 nonlinearity='relu',此时会使用 a=0(负斜率),方差计算公式为:
std=(1+a2)⋅fan_in2当 a=0(ReLU),std = 2/fan_in,方差 = 2/fan_in。如果使用 leaky_relu 且 a=0.01,分母中的 (1+a2) 略大于 1,方差略小于 2/fan_in,因为负轴也保留了一点梯度。
- 分子为 2 正是因为 ReLU 在正半轴保留信号、负半轴置零,导致输出方差约为输入方差的一半。
- 为了保持信号幅度稳定,需要将权重的方差加倍补偿。
- 这一设计让 Kaiming 初始化在 ResNet 等深层 ReLU 网络中表现出色,成为事实标准。