PyTorchで各レイヤーごとに違うLearning Rateを設定する方法.
例として,以下のようなネットワークを想定する.
class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.fc1 = nn.Linear(784, 128) self.fc2 = nn.Linear(128, 256) self.fc3 = nn.Linear(256, 10) def forward(self, x): h = F.relu(self.fc1(x)) h = F.relu(self.fc2(h)) h = F.relu(self.fc3(h)) return h
オプティマイザを定義する際に,第一引数に以下のようにパラメータを渡せば良い.
net = Net() optimizer = torch.optim.Adam(params=[ {"params": net.fc1.parameters(), "lr": 1e-5}, {"params": net.fc2.parameters(), "lr": 1e-4}, {"params": net.fc3.parameters(), "lr": 1e-3}, ])
Adam ( Parameter Group 0 amsgrad: False betas: (0.9, 0.999) eps: 1e-08 lr: 1e-05 weight_decay: 0 Parameter Group 1 amsgrad: False betas: (0.9, 0.999) eps: 1e-08 lr: 0.0001 weight_decay: 0 Parameter Group 2 amsgrad: False betas: (0.9, 0.999) eps: 1e-08 lr: 0.001 weight_decay: 0 )
このようなパラメータの渡し方をすることで,レイヤーごとに違う学習率を設定できる.
ちなみに,この方法を用いる場合,明示的にパラメータを指定しなかったレイヤーはoptimizer.step()
の際にパラメータ更新が行われないことに注意.
つまり,レイヤーごとに違うパラメータを指定したい場合は,すべてのレイヤーについて明示的にパラメータを設定する必要がある.