模型权值初始化的十种方法

2020-03-06  本文已影响0人  geekboys

作者:geekboys
日期:2020-3-5

当我们定义好一个模型后,通常我们还需要对权值进行初始化,才能开始训练。初始化方法会直接影响模型的收敛与否。

权值初始化流程

总共分两步:

1 先设定什么层用什么初始化方法,初始化方法在torch.nn.init中给出
2 实例化一个模型,执行该函数,即可完成初始化

常用初始化方法

PyTorch在torch.nn.init中提供了常用的初始化方法函数,可以大体的分两部分:

Xavier初始化方法,在论文《Understanding the difficulty of training deep feedforward neural networks》公式推导是从"方差一致性"出发,Xavier初始化分布有均匀分布和正态分布。

1.Xavier均匀分布

torch.nn.init.xavier_uniform_(tensor,gain=1)
xavier初始化方法中服从均匀分布U(-a,a),分布的参数a=gain*sqrt(6/fan_in+fan_out),这里有一个gain,增益的大小是依据激活函数类型来设定
例如:nn.init.xavier_uniform_(w,gain=nn.init.calculate_gain('relu'))
上述初始化方法,也称为Glorot inittialization

2.Xavier正态分布

torch.nn.init.xavier_normal_(tensor,gain=1)
xavier初始化方法中服从正态分布,
mean=0,std=gain*sqrt(2/fan_in+fan_out)

kaiming初始化方法

kaiming初始化方法,有何恺明大神提出来的初始化方法。公式推导同样从"方差一致性"出发,kaiming是针对xavier初始化方法在relu这一类激活函数表现不佳而提出的改进。详细可以查看论文《Delving deep into rectifiers: Surpassing human-level performance on ImageNet classification》

3.kaiming均匀分布

torch.nn.init.kaiming_uniform(tensor,a=0,model='fan_in',nonlinearity='leaky_relu').此为均匀分布,U~(-bound,bound),bound=sqrt(6/(1+a^2)*fan_in)
其中,a为激活函数的负半轴的斜率,relu是0
mode- 可选为fan_in或fan_out,fan_in使用正向传播,方差一致;fan_out使反向传播时,方差一致nonlinearity-可选relu和leaky_relu,默认值为:leaky_relu

4.kaiming正态分布

torch.nn.init.kaiming_normal_(tensor,a=0,model='fan_in',nonlinearity='leaky_relu')此为0均值的正态分布,N~(0,std),
其中std=sqrt(2/(1+a^2)*fan_in)其中,a为激活函数的负半轴的斜率,relu是0
mode- 可选为fan_in或fan_out,fan_in使正向传播时,方差一致;fan_out使反向传播时,方差一致。nonlinearity-可选relu和leaky_relu,默认值为leaky_relu.

其他

5.均匀分布初始化

torch.nn.init.uniform_(tensor,a=0,b=1)
使值服从均匀分布U(a,b)

6.正态分布初始化

torch.nn.init.normal_(tensor,mean=0,std=1)
使值服从正态分布N(mean,std),默认值为0,1

7.常数初始化

torch.nn.init.constant_(tensor,val)
值为常数val nn.init.constant_(w,0.3)

8.单位矩阵初始化

torch.nn.init.eye_(tensor)
将二维tensor初始化为单位矩阵

9.正交初始化

torch.nn.init.orthogonal_(tensor,gain=1)
使得tensor是正交的

10.稀疏初始化

torch.nn.init.sparse_(tensor,sparsity,std=0.01)
从正态分布N~(0,std)中进行稀疏化,使每一个column有一部分为0,sparsity-每一个column稀疏的比例,即为0的比例
**nn.init.sparse_(w,sparsity=0.1)

11.计算增益

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

其实,在创建网络实例的过程中,一旦调用nn.Conv2d的时候就会对权值进行初始化,初始化过程是在Conv2d的基类ConvNd中进行的。在torch0.X版本中采用的是均匀分布。但是在PyTorch1.0版本后,这里改用了kaiming_uniform()进行初始化。这里再次膜拜何恺明大神

上一篇 下一篇

猜你喜欢

热点阅读