参考来源:
pytorch 文档:http://pytorch.org/docs/nn.html#torch-nn-init
CSDN:Pytorch神经网络初始化kaiming分布
博客园:PyTorch 学习笔记(四):权值初始化的十种方法
博客园:xavier,kaiming初始化中的fan_in,fan_out在卷积神经网络是什么意思

pytorch 在 torch.nn.init 中提供了常用的初始化方法函数,这里简单介绍,方便查询使用。
介绍分两部分:

  1. Xavierkaiming 系列;
  2. 其他方法分布。

函数的增益值

[SOURCE]

  1. torch.nn.init.calculate_gain(nonlinearity, param=None)

返回给定非线性函数的推荐增益值。这些值如下:
image.png

fan_in 与 fan_out

对于全连接层,fan_in 是输入维度,fan_out 是输出维度;
对于卷积层,设其维度为 [Cout , Cin , H , W],其中 H × Wkernel 规模。则 fan_inH × W × Cinfan_outH × W × Cout
举例: 设输入的数都是出于同一数量级。输入维度较小时,x = [1,1]T,此时方差较大,正态分布生成的参数初始值都比较大,w = [0.5,0.5]T,得到的值 wTx = 1 。当输入维度较大时, x = [1,1,1,1]T,此时方差较小,正态分布生成的参数初始值都比较小, w = [0.25,0.25,0.25,0.25]T,得到的值 wTx = 1,数量级是不变的。
pytorch 计算 fan_infan_out 的源码:

  1. def _calculate_fan_in_and_fan_out(tensor):
  2. dimensions = tensor.ndimension()
  3. if dimensions < 2:
  4. raise ValueError("Fan in and fan out can not be computed for tensor with fewer than 2 dimensions")
  5. if dimensions == 2: # Linear
  6. fan_in = tensor.size(1)
  7. fan_out = tensor.size(0)
  8. else:
  9. num_input_fmaps = tensor.size(1)
  10. num_output_fmaps = tensor.size(0)
  11. receptive_field_size = 1
  12. if tensor.dim() > 2:
  13. receptive_field_size = tensor[0][0].numel()
  14. fan_in = num_input_fmaps * receptive_field_size
  15. fan_out = num_output_fmaps * receptive_field_size
  16. return fan_in, fan_out

Xavier 初始化方法

xavier分布解析:https://prateekvjoshi.com/2016/03/29/understanding-xavier-initialization-in-deep-neural-networks/
假设使用的是 sigmoid 函数。当权重值(值指的是绝对值)过小,输入值每经过网络层,方差都会减少,每一层的加权和很小,在 sigmoid 函数 0 附近的区域相当于线性函数,失去了 DNN 的非线性性。
当权重的值过大,输入值经过每一层后方差会迅速上升,每层的输出值将会很大,此时每层的梯度将会趋近于 0 。
xavier 初始化可以使得输入值 x 方差经过网络层后的输出值 y 方差不变。

1. Xavier 均匀分布-xavieruniform()

[SOURCE]

  1. torch.nn.init.xavier_uniform_(tensor, gain=1.0)

xavier 初始化方法中服从均匀分布 U(−a,a) ,分布的参数为:
权值初始化 - 图2
这里有一个gain,增益的大小是依据激活函数类型来设定 ;eg:nn.init.xavier_uniform_(w, gain=nn.init.calculate_gain('relu'))
上述初始化方法,也称为 Glorot initialization 。

  1. w = torch.empty(3, 5)
  2. nn.init.xavier_uniform_(w, gain=nn.init.calculate_gain('relu'))

2. Xavier 正态分布-xaviernormal()

[SOURCE]

  1. torch.nn.init.xavier_normal_(tensor, gain=1)

xavier 初始化方法中服从正态分布 N(0,std2) ,分布的参数为:
权值初始化 - 图3
也称为 Glorot initialization 。

kaiming初始化方法

kaiming 初始化方法,论文在《 Delving deep into rectifiers: Surpassing human-level performance on ImageNet classification》,公式推导同样从“方差一致性”出法,kaiming 是针对 xavier 初始化方法在 relu 这一类激活函数表现不佳而提出的改进,详细可以参看论文。
Xavier 在 tanh 中表现的很好,但在 Relu 激活函数中表现的很差,所何凯明提出了针对于 Relu 的初始化方法。pytorch 默认使用 **kaiming** 正态分布初始化卷积层参数。

3. kaiming 均匀分布-kaiminguniform()

  1. torch.nn.init.kaiming_uniform_(tensor, a=0, mode='fan_in', nonlinearity='leaky_relu')

使用均匀分布 U(-bound,bound) ,分布的参数为:
权值初始化 - 图4
参数:

  • **a**:激活函数的负半轴的斜率,Relu0
  • **mode**:默认为 fan_in 模式,fan_in 可以保持前向传播的权重方差的数量级,fan_out 可以保持反向传播的权重方差的数量级。

也被称为 He initialization。

  1. w = torch.empty(3, 5)
  2. nn.init.kaiming_uniform_(w, mode='fan_in', nonlinearity='relu')

4. kaiming 正态分布-kaimingnormal()

  1. torch.nn.init.kaiming_normal_(tensor, a=0, mode='fan_in', nonlinearity='leaky_relu')

使用正态分布 N(0,std),分布的参数为:
权值初始化 - 图5
参数:

  • **a**:激活函数的负半轴的斜率,Relu0
  • **mode**:默认为 fan_in 模式,fan_in 可以保持前向传播的权重方差的数量级,fan_out 可以保持反向传播的权重方差的数量级。

也被称为 He initialization 。

  1. w = torch.empty(3, 5)
  2. nn.init.kaiming_normal_(w, mode='fan_out', nonlinearity='relu')

5. 均匀分布初始化

  1. torch.nn.init.uniform_(tensor, a=0, b=1)

使值服从均匀分布 U(a,b)

6. 正态分布初始化

  1. torch.nn.init.normal_(tensor, mean=0, std=1)

使值服从正态分布 N(mean, std),默认值为 0,1

7. 常数初始化

  1. torch.nn.init.constant_(tensor, val)

使值为常数 val

  1. nn.init.constant_(w, 0.3)

8. 单位矩阵初始化

  1. torch.nn.init.eye_(tensor)

将二维 tensor 初始化为单位矩阵(the identity matrix

9. 正交初始化

  1. torch.nn.init.orthogonal_(tensor, gain=1)

使得 tensor 是正交的。
论文:Exact solutions to the nonlinear dynamics of learning in deep linear neural networks” - Saxe, A. et al. (2013)

10. 稀疏初始化

  1. torch.nn.init.sparse_(tensor, sparsity, std=0.01)

从正态分布N(0,std) 中进行稀疏化,使每一个 column 有一部分为 0
参数:

  • **sparsity**:每一个 column 稀疏的比例,即为 0 的比例。
    1. nn.init.sparse_(w, sparsity=0.1)