Pytorch(4):权值初始化

权值初始化

在深度学习中,有两类参数:参数和超参数。

简单来说,参数是机器自动学习出来的,超参数是根据经验手动设置的。

这章节讨论参数的初始化,对应 Pytorch 中的 torch.nn.Parameter)。

权值初始化(也就是参数初始化)非常重要,为什么呢?因为初始化初始得太差,会导致梯度消失或爆炸的情况发生。

这里简单解释一下,在反向传播(了解更多)过程中,因为 Chain Rule 的关系,过程中的一个结点的梯度爆炸(消失),会导致后续的结点的梯度跟着爆炸(消失)。

常用初始化方法(十种三大类)

第一类:常见分布

  1. 均匀分布
  2. 正态分布
  3. 常数分布

第二类:Xavier & He

  1. Xavier 均匀分布

  2. Xavier 标准正态分布

  3. Kaiming 均匀分布

  4. Kaiming 标准正态分布

第三类:特殊矩阵

  1. 正交矩阵初始化

  2. 单位矩阵初始化

  3. 稀疏矩阵初始化

参考:https://pytorch.org/docs/stable/nn.init.html

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

主要功能:计算激活函数的方差变化尺度主要参数(就是输入的方差与输出的方差的比例,用于观察方差的变化,例如 tanh 的 calculate_gain 结果大约是 1.6 左右,就可以知道,经过 tanh 输出的方差会比输入的方差减小 1.6 倍)。

对应关系如下表:

非线性函数增益
Linear / Identity
Conv{1,2,3}D
Sigmoid
Tanh
ReLU
Leaky Relu

参数:

  • nonlinearity – 非线性函数 (nn.functional 中的名字)
  • param – 对应非线性函数的可选参数,如 Leaky ReLU 的 negative_slop

例子

>>> gain = nn.init.calculate_gain('leaky_relu')

第一类:常见分布
init.uniform_
torch.nn.init.uniform_(tensor, a=0, b=1)

用均匀分布 U ( a , b ) U(a,b) U(a,b) 初始化输入 Tensor

参数:

  • tensor – n 维 torch.Tensor
  • a – 均匀分布的下界
  • b – 均匀分布的上界

例子

>>> w = torch.empty(3, 5)
>>> nn.init.uniform_(w)

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

用正态分布 N ( m e a n , s t d ) N(mean,std) N(mean,std) 初始化输入 Tensor

参数:

  • tensor – n 维 torch.Tensor
  • mean – 正态分布的均值
  • std – 正态分布的标准差

例子

>>> w = torch.empty(3, 5)
>>> nn.init.normal_(w)

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

用常数 val 初始化输入 Tensor

参数:

  • tensor – n 维 torch.Tensor
  • val – 用以填入张量的常数

例子

>>> w = torch.empty(3, 5)
>>> nn.init.constant_(w, 0.3)

第二类:基于方差放缩
init.xavier_uniform_
torch.nn.init.xavier_uniform_(tensor, gain=1)

用论文 “Understanding the difficulty of training deep feedforward neural networks” - Glorot, X. & Bengio, Y. (2010) 中提及的均匀分布初始化输入 Tensor。初始化后的张量中的值采样自 U ( a , b ) U(a,b) U(a,b)

也被称作 Glorot 初始化。

参数:

  • tensor – n 维 torch.Tensor
  • gain – 可选缩放因子

例子

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

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

用论文 “Understanding the difficulty of training deep feedforward neural networks” - Glorot, X. & Bengio, Y. (2010) 中提及的正态分布初始化输入 Tensor。初始化后的张量中的值采样自 N ( 0 , s t d ) N(0,std) N(0,std)

也被称作 Glorot initialization。

参数:

  • tensor – n 维 torch.Tensor
  • gain – 可选缩放因子

例子

>>> w = torch.empty(3, 5)
>>> nn.init.xavier_normal_(w)

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

用论文 “Delving deep into rectifiers: Surpassing human-level performance on ImageNet classification” - He, K. et al. (2015) 中提及的均匀分布初始化输入 Tensor。初始化后的张量中的值采样自 U ( − b o u n d , b o u n d ) U(-bound,bound) U(bound,bound)

也被称作 He initialization。

参数:

  • tensor – n 维 torch.Tensor
  • a – 该层后面一层的整流函数中负的斜率 (默认为 0,此时为 Relu)
  • mode – ‘fan_in’ (default) 或者 ‘fan_out’。使用fan_in保持weights的方差在前向传播中不变;使用fan_out保持weights的方差在反向传播中不变。
  • nonlinearity – 非线性函数 (nn.functional 中的名字),推荐只使用 ‘relu’ 或 ‘leaky_relu’ (default)。

例子

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

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

用论文 “Delving deep into rectifiers: Surpassing human-level performance on ImageNet classification” - He, K. et al. (2015) 中提及的正态分布初始化输入 Tensor。初始化后的张量中的值采样 N ( 0 , s t d ) N(0,std) N(0,std)

也被称作 He initialization。

参数:

  • tensor – n 维 torch.Tensor
  • a – 该层后面一层的整流函数中负的斜率 (默认为 0,此时为 Relu)
  • mode – ‘fan_in’ (default) 或者 ‘fan_out’。使用fan_in保持weights的方差在前向传播中不变;使用fan_out保持weights的方差在反向传播中不变。
  • nonlinearity – 非线性函数 (nn.functional 中的名字),推荐只使用 ‘relu’ 或 ‘leaky_relu’ (default)。

例子

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

第三类:特殊矩阵
init.orthogonal_
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 维,如果输入张量的维度大于 2, 则对后续维度进行放平操作。

参数:

  • tensor – n 维 torch.Tensor,且 n > 2 n>2 n>2
  • gain – 可选缩放因子

例子

>>> w = torch.empty(3, 5)
>>> nn.init.orthogonal_(w)

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

用论文 “Deep learning via Hessian-free optimization” - Martens, J. (2010). 提及的稀疏矩阵初始化 2 维输入 Tensor,且使用正态分布 N ( 0 , 0.01 ) N(0,0.01) N(0,0.01) 初始化非零元素。

参数:

  • tensor – n 维 torch.Tensor
  • sparsity – 每一行置零元素的比例
  • std – 初始化非零元素时使用正态分布的标准差

例子

>>> w = torch.empty(3, 5)
>>> nn.init.sparse_(w, sparsity=0.1)

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

用单位矩阵初始化 2 维输入 Tensor。 保持输入张量输入 Linear 时的独一性,并且越多越好.

参数:

  • tensor – 2 维 torch.Tensor

例子

>>> w = torch.empty(3, 5)
>>> nn.init.eye_(w)

init.dirac_
torch.nn.init.dirac_(tensor)

用狄拉克 δ δ δ 函数初始化 {3, 4, 5} 维输入 Tensor。 保持输入张量输入 Convolutional 时的独一性,并且越多通道越好。

参数:

  • tensor – {3, 4, 5} 维 torch.Tensor

例子

>>> w = torch.empty(3, 16, 5, 5)
>>> nn.init.dirac_(w)

参考

https://blog.csdn.net/oldmao_2001/article/details/102895144

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值