PyTorch网络权值初始化的几种方式

PyTorch网络权值初始化的几种方式

pytorch在torch.nn.init包中提供了常用的一些初始化权值方法函数,这里简单介绍,方便查询使用。
介绍分两部分:

  1. Xavier初始化方法以及kaiming系列初始化方法;
  2. 其他初始化方法分布

Xavier初始化方法,论文在Understanding the difficulty of training deep feedforward neural networks. 有着详细的推导过程及描述
其出发点是“方法一致性”,初始化的分布有均匀分布和正态分布两种。

1. Xavier均匀分布

torch.nn.init.xavier_uniform_(tensor, gain=1)
xavier初始化方法中服从均匀分布U(−a,a) ,分布的参数a = gain * sqrt(6/fan_in+fan_out),
这里有一个gain,增益的大小是依据激活函数类型来设定

eg:
nn.init.xavier_uniform_(w, gain=nn.init.calculate_gain(‘relu’))

PS:上述初始化方法,也称为Glorot initialization

2. Xavier正态分布

torch.nn.init.xavier_normal_(tensor, gain=1)
xavier初始化方法中服从正态分布,mean=0,std = gain * sqrt(2/fan_in + fan_out)
kaiming初始化方法,论文在Delving deep into rectifiers: Surpassing human-level performance on ImageNet classification,公式推导同样从“方差一致性”出法,kaiming是针对xavier初始化方法在relu这一类激活函数表现不佳而提出的改进,详细可以参看论文。

3. kaiming均匀分布

torch.nn.init.kaiming_uniform_(tensor, a=0, mode='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
nn.init.kaiming_uniform_(w, mode='fan_in', nonlinearity='relu')

4. kaiming正态分布

torch.nn.init.kaiming_normal_(tensor, a=0, mode='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
nn.init.kaiming_normal_(w, mode='fan_out', nonlinearity='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初始化为单位矩阵(the identity matrix)

9. 正交初始化

torch.nn.init.orthogonal_(tensor, gain=1)
使得tensor是正交的,论文:Exact solutions to the nonlinear dynamics of learning in deep linear neural networks” - Saxe, A. et al. (2013)

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)

Pytorch在网络中初始化权重的demo

import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.distributions import Normal

# Initialize Policy weights
def weights_init_(m):
    if isinstance(m, nn.Linear):
        torch.nn.init.xavier_uniform_(m.weight, gain=1)
        torch.nn.init.constant_(m.bias, 0)

class ValueNetwork(nn.Module):
    def __init__(self, num_inputs, hidden_dim):
        super(ValueNetwork, self).__init__()

        self.linear1 = nn.Linear(num_inputs, hidden_dim)
        self.linear2 = nn.Linear(hidden_dim, hidden_dim)
        self.linear3 = nn.Linear(hidden_dim, 1)
        # Initialize all Linear layer's weights
        self.apply(weights_init_)

    def forward(self, state):
        x = F.relu(self.linear1(state))
        x = F.relu(self.linear2(x))
        x = self.linear3(x)
        return x
上一篇:计算机视觉2 -AlexNet的原理


下一篇:人工智能|神经网络中的激活函数