「细聊」torch.nn.init 初始化

权重初始化对深度学习模型的性能至关重要,它决定了优化过程的起点。本文介绍了PyTorch中的一系列初始化方法,如均匀分布、正态分布、常数填充、单位矩阵、Dirac函数、Xavier和He初始化等,这些方法通过控制权重的初始值,帮助模型更好地学习和收敛。
摘要由CSDN通过智能技术生成

权重初始化如何影响深度学习模型的性能?

答:权重初始化是训练深度学习模型的重要步骤,因为它决定了优化过程的起点。如果用小的随机值初始化权重,模型将很难从数据中学习,因为梯度太小了。
另一方面,如果权重初始化随机值较大,则模型收敛速度较快,但可能无法找到损失函数的全局最小值。选择合适的权值初始化方法,如He初始化或Glorot初始化,有助于提高模型的性能。


1、init.uniform

init.uniform(tensor, a=0, b=1)

>>> w = torch.Tensor(3, 5)
>>> nn.init.uniform(w)

均匀分布 U ( a , b ) \mathcal{U}(a, b) U(a,b)中生成值,填充输入的张量或变量

Parameters:

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

2、nn.init.normal

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

>>> w = torch.Tensor(3, 5)
>>> nn.init.normal(w)

从给定均值和标准差的正态分布 N ( m e a n , s t d ) \mathcal{N}(mean, std) N(mean,std)中生成值,填充输入的张量或变量

Parameters:

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

3、nn.init.constant

nn.init.constant(tensor, val)

>>> w = torch.Tensor(3, 5)
>>> nn.init.constant(w)

用val的值填充输入的张量或变量

Parameters:

  • tensor – n维的torch.Tensor 或 autograd.Variable
  • val – 用来填充张量的值

4、nn.init.eye

nn.init.eye(tensor)

>>> w = torch.Tensor(3, 5)
>>> nn.init.eye(w)

用单位矩阵来填充2维输入张量或变量。在线性层尽可能多的保存输入特性

Parameters:

  • tensor – 2维的torch.Tensor 或 autograd.Variable

5、nn.init.dirac

nn.init.dirac(tensor)

>>> w = torch.Tensor(3, 16, 5, 5)
>>> nn.init.dirac(w)

用Dirac δ \delta δ 函数来填充{3, 4, 5}维输入张量或变量。在卷积层尽可能多的保存输入通道特性

Parameters:

  • tensor – {3, 4, 5}维的torch.Tensor 或 autograd.Variable

6、nn.init.xavier_uniform

nn.init.xavier_uniform(tensor, gain=1)

>>> w = torch.Tensor(3, 5)
>>> nn.init.xavier_uniform(w, gain=math.sqrt(2.0))

用一个均匀分布生成值,填充输入的张量或变量。结果张量中的值采样自U(-a, a),其中 a = g a i n ∗ 6 f a n _ i n + f a n _ o u t a= gain * \sqrt{ \frac{6}{fan\_in + fan\_out}} a=gainfan_in+fan_out6 ,该方法也被称为Glorot initialisation
参考:Glorot, X.和Bengio, Y.等“Understanding the difficulty of training deep feedforward neural networks”

Parameters:

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

7、nn.init.xavier_normal

nn.init.xavier_normal(tensor, gain=1)

>>> w = torch.Tensor(3, 5)
>>> nn.init.xavier_normal(w)

用一个正态分布生成值,填充输入的张量或变量。结果张量中的值采样自均值为0,标准差为 g a i n ∗ 2 f a n _ i n + f a n _ o u t gain * \sqrt{\frac{2}{fan\_in + fan\_out}} gainfan_in+fan_out2 的正态分布。也被称为Glorot initialisation
参考:Glorot, X.和Bengio, Y. 等“Understanding the difficulty of training deep feedforward neural networks”

Parameters:

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

8、nn.init.kaiming_uniform

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

>>> w = torch.Tensor(3, 5)
>>> nn.init.kaiming_uniform(w, mode='fan_in')

用一个均匀分布生成值,填充输入的张量或变量。结果张量中的值采样自U(-bound, bound),其中 b o u n d = g a i n × 3 f a n _ m o d e bound = gain \times \sqrt{\frac{3}{fan\_mode}} bound=gain×fan_mode3 ,也被称为He initialisation
参考:He, K等“Delving deep into rectifiers: Surpassing human-level performance on ImageNet classification”

Parameters:

  • tensor – n维的torch.Tensor或autograd.Variable
  • a -这层之后使用的rectifier的斜率系数(ReLU的默认值为0)
  • mode -可以为“fan_in”(默认)或 “fan_out”
    “fan_in”保留前向传播时权值方差的量级
    “fan_out”保留反向传播时的量级
  • nonlinearity=‘leaky_relu’ - 非线性函数 建议“relu”或“leaky_relu”(默认值)使用。

9、nn.init.kaiming_normal

nn.init.kaiming_normal(tensor, a=0, mode='fan_in')

>>> w = torch.Tensor(3, 5)
>>> nn.init.kaiming_normal(w, mode='fan_out')

用一个正态分布生成值,填充输入的张量或变量。结果张量中的值采样自均值为0,标准差为 s t d = 2 ( 1 + a 2 ) ∗ f a n i n std=\sqrt{\frac{2}{(1 + a^2) * fan_in}} std=(1+a2)fanin2 的正态分布
参考:He, K 在 “Delving deep into rectifiers: Surpassing human-level performance on ImageNet classification”

Parameters:

  • tensor – n维的torch.Tensor或 autograd.Variable
  • a -这层之后使用的rectifier的斜率系数(ReLU的默认值为0)
  • mode -可以为“fan_in”(默认)或 “fan_out”
    “fan_in”保留前向传播时权值方差的量级
    “fan_out”保留反向传播时的量级

10、nn.init.orthogonal

nn.init.orthogonal(tensor, gain=1)

>>> w = torch.Tensor(3, 5)
>>> nn.init.orthogonal(w)

用(半)正交矩阵填充输入的张量或变量。输入张量必须至少是2维的,对于更高维度的张量,超出的维度会被展平,视作行等于第一个维度,列等于稀疏矩阵乘积的2维表示
【其中非零元素生成自均值为0,标准差为std的正态分布】
参考:Saxe, A等人(2013)的“Exact solutions to the nonlinear dynamics of learning in deep linear neural networks”

Parameters:

  • tensor – n维的torch.Tensor 或 autograd.Variable,其中n>=2
  • gain -可选

11、nn.init.sparse

nn.init.sparse(tensor, sparsity, std=0.01)

>>> w = torch.Tensor(3, 5)
>>> nn.init.sparse(w, sparsity=0.1)

将2维的输入张量或变量当做 稀疏矩阵填充,其中非零元素根据一个均值为0,标准差为std的正态分布生成
参考:Martens, J.(2010)的 “Deep learning via Hessian-free optimization”

Parameters:

  • tensor – n维的torch.Tensor或autograd.Variable
  • sparsity - 每列中需要被设置成零的元素比例
  • std - 用于生成非零值的正态分布的标准差
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ViatorSun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值