化学系エンジニアがAIを学ぶ

PyTorchでディープラーニング、強化学習を学び、主に化学工学の問題に取り組みます

メモ: 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)

参考

まるまるにっき | pytorchの重みの初期化の方法

python - How to initialize weights in PyTorch? - Stack Overflow

What is the default initialization of a conv2d layer and linear layer? - PyTorch Forums