在模型权重的初始化函数一文中,已经介绍了常见的网络权重初始化方法,本文再分下在pytorch源码中,对各网络层的默认初始化策略。
在pytorch的所有自带网络层中,均通过reset_parameters
函数在初始化网络Parameters
:
1. FC层
weight参数采用了He-uniform初始化策略,而bias采用了简单的均匀分布初始化策略(均匀分布参数根据特征数计算)
def reset_parameters(self):
init.kaiming_uniform_(self.weight, a=math.sqrt(5))
if self.bias is not None:
fan_in, _ = init._calculate_fan_in_and_fan_out(self.weight)
bound = 1 / math.sqrt(fan_in)
init.uniform_(self.bias, -bound, bound)
2. Embedding层
采用了标准的(-1,1)匀分布初始化策略,注意若设置了padding,则其初始化值为元素为0的张量,且不参与梯度的更新。
def reset_parameters(self):
init.normal_(self.weight)
if self.padding_idx is not None:
with torch.no_grad():
self.weight[self.padding_idx].fill_(0)
3. Conv层
卷积网络的基类中采用了和FC层一样的初始化方法,即weight参数采用了He-uniform初始化策略,而bias采用了简单的均匀分布初始化策略(均匀分布参数根据特征数计算):
def reset_parameters(self):
n = self.in_channels
init.kaiming_uniform_(self.weight, a=math.sqrt(5))
if self.bias is not None:
fan_in, _ = init._calculate_fan_in_and_fan_out(self.weight)
bound = 1 / math.sqrt(fan_in)
init.uniform_(self.bias, -bound, bound)
4.RNN层
递归网络的基类采用了均匀分布的初始化策略,其参数由设置的hidden_size
计算:
def reset_parameters(self):
stdv = 1.0 / math.sqrt(self.hidden_size)
for weight in self.parameters():
init.uniform_(weight, -stdv, stdv)