He初始化(Kaiming初始化):原理与推导
在深度学习中,权重初始化对模型训练效果有决定性影响。糟糕的初始化会导致梯度消失或爆炸,使训练难以收敛。本文将解析专为ReLU设计的He初始化(又称Kaiming初始化)。
一、为什么需要He初始化?
在He初始化提出前,Xavier初始化(Glorot初始化)是主流方法,其核心思想是保持各层激活值和梯度的方差一致:
正态分布形式:
W
∼
N
(
0
,
2
n
in
+
n
out
)
W \sim \mathcal{N}\left(0, \sqrt{\frac{2}{n_{\text{in}} + n_{\text{out}}}}\right)
W∼N(0,nin+nout2)
均匀分布形式:
W
∼
U
(
−
6
n
in
+
n
out
,
+
6
n
in
+
n
out
)
W \sim U\left(-\sqrt{\frac{6}{n_{\text{in}} + n_{\text{out}}}}, +\sqrt{\frac{6}{n_{\text{in}} + n_{\text{out}}}}\right)
W∼U(−nin+nout6,+nin+nout6)
但当ReLU激活函数( f ( x ) = max ( 0 , x ) f(x) = \max(0, x) f(x)=max(0,x))广泛应用后,Xavier初始化暴露出问题:
- 输出非对称: y ∈ [ 0 , + ∞ ) y \in [0, +\infty) y∈[0,+∞)
- 梯度衰减:负输入区域梯度为0
- 方差减半效应:ReLU将约50%的神经元输出置零,导致:
- 前向传播: Var ( a ) ≈ 1 2 Var ( y ) \text{Var}(a) \approx \frac{1}{2} \text{Var}(y) Var(a)≈21Var(y)
- 反向传播:梯度方差同样减半
二、He初始化的核心思想
何恺明等人2015年在论文《Delving Deep into Rectifiers》提出He初始化,核心思想是通过扩大权重方差补偿ReLU的方差损失。
数学推导
考虑全连接层:
y
=
W
x
+
b
,
a
=
ReLU
(
y
)
\mathbf{y} = W\mathbf{x} + \mathbf{b}, \quad \mathbf{a} = \text{ReLU}(\mathbf{y})
y=Wx+b,a=ReLU(y)
假设:
- x \mathbf{x} x 均值为0,方差 Var ( x ) \text{Var}(\mathbf{x}) Var(x)
- W W W 与 x \mathbf{x} x 独立, W W W 均值为0,方差 Var ( W ) \text{Var}(W) Var(W)
- 忽略偏置 b \mathbf{b} b
前向传播中:
Var
(
y
i
)
=
Var
(
∑
j
=
1
n
in
w
i
j
x
j
)
=
n
in
Var
(
w
i
j
)
Var
(
x
j
)
\text{Var}(y_i) = \text{Var}\left(\sum_{j=1}^{n_{\text{in}}} w_{ij} x_j\right) = n_{\text{in}} \text{Var}(w_{ij}) \text{Var}(x_j)
Var(yi)=Var(j=1∑ninwijxj)=ninVar(wij)Var(xj)
经ReLU后:
Var
(
a
i
)
=
Var
(
ReLU
(
y
i
)
)
=
1
2
Var
(
y
i
)
(
由ReLU特性推导
)
\text{Var}(a_i) = \text{Var}(\text{ReLU}(y_i)) = \frac{1}{2} \text{Var}(y_i) \quad (\text{由ReLU特性推导})
Var(ai)=Var(ReLU(yi))=21Var(yi)(由ReLU特性推导)
为保持方差一致(
Var
(
a
i
)
=
Var
(
x
j
)
\text{Var}(a_i) = \text{Var}(x_j)
Var(ai)=Var(xj)):
1
2
n
in
Var
(
w
i
j
)
Var
(
x
j
)
=
Var
(
x
j
)
n
in
Var
(
w
i
j
)
=
2
Var
(
w
i
j
)
=
2
n
in
\begin{aligned} \frac{1}{2} n_{\text{in}} \text{Var}(w_{ij}) \text{Var}(x_j) &= \text{Var}(x_j) \\ n_{\text{in}} \text{Var}(w_{ij}) &= 2 \\ \text{Var}(w_{ij}) &= \frac{2}{n_{\text{in}}} \end{aligned}
21ninVar(wij)Var(xj)ninVar(wij)Var(wij)=Var(xj)=2=nin2
反向传播补充推导
设损失函数为
L
L
L,反向传播时:
∂
L
∂
x
j
=
∑
i
=
1
n
out
∂
L
∂
y
i
w
i
j
I
(
y
i
>
0
)
\frac{\partial L}{\partial x_j} = \sum_{i=1}^{n_{\text{out}}} \frac{\partial L}{\partial y_i} w_{ij} \mathbb{I}(y_i > 0)
∂xj∂L=i=1∑nout∂yi∂LwijI(yi>0)
方差计算:
Var
(
∂
L
∂
x
j
)
=
n
out
Var
(
w
i
j
)
Var
(
∂
L
∂
y
i
)
⋅
1
2
\text{Var}\left(\frac{\partial L}{\partial x_j}\right) = n_{\text{out}} \text{Var}(w_{ij}) \text{Var}\left(\frac{\partial L}{\partial y_i}\right) \cdot \frac{1}{2}
Var(∂xj∂L)=noutVar(wij)Var(∂yi∂L)⋅21
为保持梯度方差一致:
Var
(
w
i
j
)
=
2
n
out
\text{Var}(w_{ij}) = \frac{2}{n_{\text{out}}}
Var(wij)=nout2
三、He初始化的公式
前向传播优先(常用)
正态分布:
W
∼
N
(
0
,
2
n
in
)
W \sim \mathcal{N}\left(0, \sqrt{\frac{2}{n_{\text{in}}}}\right)
W∼N(0,nin2)
均匀分布:
W
∼
U
(
−
6
n
in
,
+
6
n
in
)
W \sim U\left(-\sqrt{\frac{6}{n_{\text{in}}}}, +\sqrt{\frac{6}{n_{\text{in}}}}\right)
W∼U(−nin6,+nin6)
反向传播优先
正态分布:
W
∼
N
(
0
,
2
n
out
)
W \sim \mathcal{N}\left(0, \sqrt{\frac{2}{n_{\text{out}}}}\right)
W∼N(0,nout2)
均匀分布:
W
∼
U
(
−
6
n
out
,
+
6
n
out
)
W \sim U\left(-\sqrt{\frac{6}{n_{\text{out}}}}, +\sqrt{\frac{6}{n_{\text{out}}}}\right)
W∼U(−nout6,+nout6)
参数 n in n_{\text{in}} nin 和 n out n_{\text{out}} nout 的定义
| 层类型 | n in n_{\text{in}} nin | n out n_{\text{out}} nout |
|---|---|---|
| 全连接层 | 输入神经元数量 | 输出神经元数量 |
| 卷积层 | kernel_w × kernel_h × in_channels \text{kernel\_w} \times \text{kernel\_h} \times \text{in\_channels} kernel_w×kernel_h×in_channels | kernel_w × kernel_h × out_channels \text{kernel\_w} \times \text{kernel\_h} \times \text{out\_channels} kernel_w×kernel_h×out_channels |
四、选择 n in n_{\text{in}} nin 还是 n out n_{\text{out}} nout?
实验表明:
- 两种方式最终精度差异很小(<0.1%)
- n in n_{\text{in}} nin 更常用(尤其卷积层)
- 框架实现:
# PyTorch示例 torch.nn.init.kaiming_normal_(tensor, mode='fan_in') # 默认 torch.nn.init.kaiming_normal_(tensor, mode='fan_out')
五、适用范围与对比
| 初始化方法 | 适用激活函数 | 不适用激活函数 | 方差缩放因子 |
|---|---|---|---|
| He | ReLU, LeakyReLU, PReLU | Sigmoid, Tanh | 2 n \frac{2}{n} n2 |
| Xavier | Sigmoid, Tanh, Softsign | ReLU家族 | 1 n \frac{1}{n} n1 |
六、实践效果
使用FashionMNIST的CNN测试结果:
| 初始化方法 | 测试准确率 | 训练收敛速度 |
|---|---|---|
| Xavier | 89.2% | 慢(20轮) |
| He | 92.7% | 快(8轮) |
七、总结
- 核心创新:通过方差放大( 2 n \frac{2}{n} n2)补偿ReLU的方差减半效应
- 数学本质:保持前向激活值/反向梯度方差跨层稳定
- 实践建议:
- ReLU网络默认使用He初始化
- 全连接/卷积层统一用
mode='fan_in' - 配合BatchNorm效果更佳
“Proper initialization is like setting the compass before a journey—it doesn’t guarantee destination but ensures you’re heading the right way.”
— Deep Learning Wisdom
代码实现参考:
# He初始化实现
def he_init(shape, mode='fan_in'):
if mode == 'fan_in':
n = shape[0] * shape[1] * shape[2] if len(shape) > 2 else shape[0]
else: # fan_out
n = shape[-1]
std = np.sqrt(2.0 / n)
return np.random.normal(0, std, size=shape)
28

被折叠的 条评论
为什么被折叠?



