メモ: PyTorch 重み、バイアスの初期化について
はじめに
PyTorchのニューラルネットワークの重み・バイアスの初期化についてのメモを記す。
重み
重みの内容は次のようにして確認できる。
>>> import torch.nn as nn >>> l = nn.Linear(1, 3) >>> l.weight Parameter containing: tensor([[ 0.6204], [-0.5651], [-0.6809]], requires_grad=True)
重みの初期化は次のようにnn.init
モジュールの関数を使用することで実施できる。
>>> nn.init.xavier_uniform_(l.weight) # Xavierの初期値 Parameter containing: tensor([[ 0.5318], [-0.8438], [-1.1093]], requires_grad=True) >>> nn.init.kaiming_uniform_(l.weight) # Heの初期値 Parameter containing: tensor([[ 2.3349], [-0.9218], [-1.3357]], requires_grad=True)
単純な正規分布・一様分布や定数を設定できる関数もnn.init
内に準備されている。
詳しくはこちらを参照: https://pytorch.org/docs/master/nn.init.html
バイアス
バイアスの内容は重みと同様に確認できる。
>>> l.bias Parameter containing: tensor([-0.9920, 0.6406, -0.6558], requires_grad=True)
バイアスの初期化も重みと同様のやり方。
>>> nn.init.uniform_(l.bias, 0, 1) # 一様分布 Parameter containing: tensor([0.8032, 0.7810, 0.1619], requires_grad=True) >>> nn.init.constant_(l.bias, 0) # 定数 Parameter containing: tensor([0., 0., 0.], requires_grad=True)
デフォルトの初期値
nn.Linear
のソースを見ると重みについてはHeの初期値が入っている模様。
pytorch/linear.py at master · pytorch/pytorch · GitHub
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)
参考
python - How to initialize weights in PyTorch? - Stack Overflow
What is the default initialization of a conv2d layer and linear layer? - PyTorch Forums