深度学习模型的训练是一个困难的任务,很多要素会影响最终的训练结果,其中参数初始化方法就是重要因素之一。pytorch内置了很多初始化方法,除了一般我们会使用的正态分布、均匀分布,Xavier、Kaiming初始化,还包括截断的正态分布对参数初始化。本文主要记录pytorch内置的采样截断的正态分布的使用方法。
def trunc_normal_(
tensor: Tensor,
mean: float = 0.,
std: float = 1.,
a: float = -2.,
b: float = 2.):
该方法从截断的正态分布中采样并填充到输入张量中。这些值取自正态分布N(mean,std)
。超出[a, b]
范围的值会进行重新采样,直到取值在范围内。
tensor
:输入张量。
mean
:正态分布均值。
std
:正态分布标准差。
a
:最小截断值。
b
:最大截断值。
w = torch.empty(3, 5)
torch.nn.init.trunc_normal_(w)
print(w)
#
tensor([[ 1.0918, -0.6006, -1.7575, 1.0590, -0.2732],
[ 0.6826, -1.1973, 0.5271, 0.8488, -0.6203],
[ 0.6100, -1.6671, -1.2157, -0.4831, 0.4103]])
深度学习模型的训练算法通常是迭代的。因此要求使用者指定一些开始迭代的初始点。
此外,训练深度模型是一个足够困难的问题,以至于大多数算法都很大程度地受到初始化选择的影响。初始点能够决定算法是否收敛。有些初始点十分不稳定,使得该算法会遭遇数值困难,并完全失败。
当学习收敛时,初始点可以决定学习收敛得多快,以及是否收敛到一个代价高或低的点。此外,差不多代价的点可以具有区别极大的泛化误差,初始点也可以影响泛化。
——摘自《深度学习》花书
torch.nn.init.uniform_(tensor, a=0.0, b=1.0)
>>> w = torch.empty(3, 5)
>>> nn.init.uniform_(w)
torch.nn.init.normal_(tensor, mean=0.0, std=1.0)
>>> w = torch.empty(3, 5)
>>> nn.init.normal_(w)
torch.nn.init.xavier_normal_(tensor, gain=1.0)
>>> w = torch.empty(3, 5)
>>> nn.init.xavier_normal_(w)
torch.nn.init.kaiming_uniform_(tensor, a=0, mode='fan_in', nonlinearity='leaky_relu')
>>> w = torch.empty(3, 5)
>>> nn.init.kaiming_uniform_(w, mode='fan_in', nonlinearity='relu')