MSRA初始化简介

MSRA初始化(又称He初始化)是由微软亚洲研究院(MSRA)的Kaiming He等人提出的一种神经网络参数初始化方法,特别适用于使用ReLU激活函数的深度神经网络。

数学原理

MSRA初始化的核心思想是保持各层激活值的方差一致。对于使用ReLU激活函数的网络,其权重应按照以下分布初始化:

$$
W \sim \mathcal{N}(0, \sqrt{\frac{2}{n_{in}}})
$$

其中:

  • $n_{in}$ 是该层的输入维度
  • $\mathcal{N}$ 表示正态分布

为什么需要MSRA初始化

  1. 解决梯度消失/爆炸问题:传统的Xavier初始化假设激活函数是线性的,而ReLU是非线性的
  2. 保持信号强度:确保前向传播和反向传播时信号不会过度衰减或放大
  3. 加速收敛:使网络在训练初期就能获得较好的梯度流

实现代码(PyTorch示例)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import torch.nn as nn
import torch.nn.init as init

def msra_init(m):
if isinstance(m, nn.Conv2d):
init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
if m.bias is not None:
init.constant_(m.bias, 0)
elif isinstance(m, nn.Linear):
init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
init.constant_(m.bias, 0)

# 应用初始化
model = YourNetwork()
model.apply(msra_init)

与其他初始化方法的比较

初始化方法 适用激活函数 公式
Xavier/Glorot tanh, sigmoid $\sqrt{\frac{1}{n_{in}}}$
MSRA/He ReLU家族 $\sqrt{\frac{2}{n_{in}}}$
LeCun SELU $\sqrt{\frac{1}{n_{in}}}$

实际应用建议

  1. 在使用ReLU及其变体(LeakyReLU, PReLU等)时优先选择MSRA初始化
  2. 对于卷积网络,注意区分’fan_in’和’fan_out’模式
  3. 配合Batch Normalization使用效果更佳

参考文献

  1. He, K., Zhang, X., Ren, S., & Sun, J. (2015). Delving deep into rectifiers: Surpassing human-level performance on imagenet classification. In Proceedings of the IEEE international conference on computer vision (pp. 1026-1034).