PyTorch系列 | 参数初始化方法(权值初始化)

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)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值