在 PyTorch 中,有多种用于初始化神经网络权重的函数,常用的包括:

  • nn.init.normal_: 将权重张量初始化为从正态分布中采样的随机值。具体来说,对于一个大小为 (n, m) 的权重张量 W W Wnn.init.normal_ 的操作相当于 W i , j ∼ N ( 0 , s t d 2 ) W_{i,j} \sim \mathcal{N}(0, std^2) Wi,jN(0,std2),其中 s t d std std 是一个标准差,可以通过调整参数 std 的值来控制权重的初始化范围。

  • nn.init.xavier_normal_: 将权重张量初始化为从均匀分布中采样的随机值。具体来说,对于一个大小为 (n, m) 的权重张量 W W Wnn.init.xavier_normal_ 的操作相当于 W i , j ∼ U ( − 6 n + m , 6 n + m ) W_{i,j} \sim \mathcal{U}(-\sqrt{\frac{6}{n+m}}, \sqrt{\frac{6}{n+m}}) Wi,jU(n+m6 ,n+m6 ),其中 n n n m m m 分别是权重张量的输入和输出维度。这个方法是基于 Xavier Glorot 和 Yoshua Bengio 在他们的论文 “Understanding the difficulty of training deep feedforward neural networks” 中提出的启发式方法,旨在使初始化的权重分布更适合于反向传播算法,并提高模型的训练效果。

  • nn.init.kaiming_normal_: 将权重张量初始化为从正态分布中采样的随机值,并根据激活函数的特性对权重进行缩放。具体来说,对于一个大小为 (n, m) 的权重张量 W W Wnn.init.kaiming_normal_ 的操作相当于 W i , j ∼ N ( 0 , 2 n ) W_{i,j} \sim \mathcal{N}(0, \sqrt{\frac{2}{n}}) Wi,jN(0,n2 ),其中 n n n 是权重张量的输入维度。对于不同的激活函数,缩放因子也不同,可以通过调整参数 modenonlinearity 来控制。

  • nn.init.orthogonal_: 将权重张量初始化为正交矩阵。具体来说,对于一个大小为 (n, m) 的权重张量 W W Wnn.init.orthogonal_ 的操作相当于对 W W W 进行 QR 分解,然后将 Q Q Q 作为初始化的权重张量。这个方法在循环神经网络 (RNN) 中常被使用,可以减少梯度爆炸和消失的问题。

  • nn.init.constant_: 将权重张量初始化为常数值。具体来说,对于一个大小为 (n, m) 的权重张量 W W Wnn.init.constant_ 的操作相当于 W i , j = v a l W_{i,j} = val Wi,j=val,其中 val 是一个常数值,可以通过调整参数 val 的值来控制权重的初始化。

这些初始化函数可以通过 torch.nn.init 模块进行调用,例如:

import torch.nn.init as init

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

在神经网络的训练过程中,权重的初始化对模型的收敛速度和泛化能力都有重要影响。选择适当的初始化方法可以提高模型的训练效果。

Logo

欢迎加入我们的广州开发者社区,与优秀的开发者共同成长!

更多推荐