PyTorch 中可用的参数初始化方法主要分为三类:Xavier初始化、kaiming初始化和其他。(比较懒、推导过程公式太多,打起来实在是很麻烦,就忽略推导过程了~~~)
目 录
1. Xavier 初始化
又称为 Glorot 初始化,来自于论文:
Understanding the difficulty of training deep feedforward neural networks - Glorot, X. & Bengio, Y. (2010)
1.1 Xavier 均匀分布
- torch.nn.init.xavier_uniform_(tensor, gain=1.0)
从均匀分布 u ( − a , a ) u(-a,a) u(−a,a) 中选值来填充需要初始化的 tensor,这里的
其中,fan_in 、fan_out 分别为输入和输出的维度,gain 为可选择的缩放参数,是非线性函数(也就是激活函数)相对应的最优增益,例如 gain=nn.init.calculate_gain('relu')
,此时 gain 为
2
\sqrt 2
2 。
1.2 Xavier 正态分布
- torch.nn.init.xavier_normal_(tensor, gain=1.0)
从正态分布 N ( 0 , s t d 2 ) N(0 , std^2) N(0,std2) 中选值来填充需要初始化的 tensor,这里的
fan_in 、fan_out 、gain 的含义同上。
2. kaiming 初始化
又称为 He 初始化,来自于论文:
Delving deep into rectifiers: Surpassing human-level performance on ImageNet classification - He, K. et al. (2015)
2.1 kaiming 均匀分布
- torch.nn.init.kaiming_uniform_(tensor, a=0, mode=‘fan_in’, nonlinearity=‘leaky_relu’)
- 参数 a 只有选用 leaky_relu 的时候才需要指定,意为其公式中的 negative_slope
- 参数 mode 可选 fan_in 和 fan_out,分别为前向传播和后向传播的输入通道数,默认为 fan_in ,即 fan_mode = fan_in(含义同 Xavier)
- 参数 nonlinearity 为非线性函数(即激活函数),默认为 leaky_relu,推荐使用默认值或 relu
从均匀分布
u
(
−
b
o
u
n
d
,
b
o
u
n
d
)
u(-bound,bound)
u(−bound,bound) 中选值来填充需要初始化的 tensor,这里的
2.2 kaiming 正态分布
- torch.nn.init.kaiming_normal_(tensor, a=0, mode=‘fan_in’, nonlinearity=‘leaky_relu’)
- 参数含义同 kaiming 均匀分布,不再重复赘述
从正态分布
N
(
0
,
s
t
d
2
)
N(0 , std^2)
N(0,std2) 中选值来填充需要初始化的 tensor,这里的
3. 其他初始化方法
3.1 均匀分布初始化
- torch.nn.init.uniform_(tensor, a=0.0, b=1.0)
从均匀分布 u ( − a , b ) u(-a,b) u(−a,b) 中选值来填充需要初始化的 tensor 。
3.2 正态分布初始化
- torch.nn.init.normal_(tensor, mean=0.0, std=1.0)
从正态分布 N ( m e a n , s t d 2 ) N(mean , std^2) N(mean,std2) 中选值来填充需要初始化的 tensor 。
3.3 常数初始化
- torch.nn.init.constant_(tensor, val)
使用常数 val 来填充需要初始化的 tensor(即代码中指定的 val,注意这里不是 var )。
更为特殊的情况是使用常数 1 或 0 去初始化 tensor,这里可以直接使用torch.nn.init.ones_(tensor)
或 torch.nn.init.zeros_(tensor)
。
3.4 单位矩阵初始化
- torch.nn.init.eye_(tensor)
将输入的二维 tensor 初始化为单位矩阵。
3.5 正交初始化
- torch.nn.init.orthogonal_(tensor, gain=1)
来自论文:
Exact solutions to the nonlinear dynamics of learning in deep linear neural networks - Saxe, A. et al. (2013)
这里要求所输入的 tensor 是 2维及以上的。初始化后的 tensor 是正交的。
3.6 稀疏初始化
- torch.nn.init.sparse_(tensor, sparsity, std=0.01)
- 参数 sparsity 为零元素所占比例
- 参数 std 为非零元素所服从的正态分布的标准差
将输入的2维 tensor 初始化为一个稀疏矩阵,其中的非零元素将服从正态分布 N ( 0 , 0.01 ) N(0 , 0.01) N(0,0.01) 。
来自论文:
Deep learning via Hessian-free optimization - Martens, J. (2010)
代码演示
for layer in model.modules():
if isinstance(layer, torch.nn.Conv2d):
torch.nn.init.kaiming_normal_(layer.weight, mode='fan_out',
nonlinearity='relu')
if layer.bias is not None:
torch.nn.init.constant_(layer.bias, val=0.0)
elif isinstance(layer, torch.nn.BatchNorm2d):
torch.nn.init.constant_(layer.weight, val=1.0)
torch.nn.init.constant_(layer.bias, val=0.0)
elif isinstance(layer, torch.nn.Linear):
torch.nn.init.xavier_normal_(layer.weight)
if layer.bias is not None:
torch.nn.init.constant_(layer.bias, val=0.0)