Pytorch不同层的学习率设置,学习率的调节,对参数施加L2 Penalty

##1.Pytorch对于不同层设置不同的学习率

1
2
3
4
optim.SGD([
{'params': model.base.parameters()},
{'params': model.classifier.parameters(), 'lr': 1e-3}
], lr=1e-2, momentum=0.9)

  • model.base.parameters()将使用1e-2的学习率,
  • model.classifier.parameters()将使用1e-3的学习率,
  • 0.9的momentum作用于所有的parameters。
    ##2.甚至可以对于同一层的weight和bias设置不同的lr
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    import torch
    import torch.nn as nn
    import torch.optim as optim
    from torch.autograd import Variable

    class Net(nn.Module):
    def __init__(self):
    super(Net, self).__init__()
    self.layer = nn.Linear(1, 1)

    def forward(self, x):
    return self.layer(x)

    if __name__=="__main__":
    net = Net()
    optimizer = optim.Adam([
    {'params': net.layer.weight},
    {'params': net.layer.bias, 'lr': 0.01}
    ], lr=0.1, weight_decay=0.0001)
    out = net(Variable(torch.Tensor(1)))
    out.backward()
    optimizer.step()

##3.训练过程中学习率的调节
torch.optim.lr_scheduler中提供了多种方法,如

  • LambdaLR
  • StepLR
  • MultiStepLR
  • ExponentialLR
    举个官网给的例子
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> # Assuming optimizer uses lr = 0.05 for all groups
    >>> # lr = 0.05 if epoch < 30
    >>> # lr = 0.005 if 30 <= epoch < 80
    >>> # lr = 0.0005 if epoch >= 80
    >>> scheduler = MultiStepLR(optimizer, milestones=[30,80], gamma=0.1)
    >>> for epoch in range(100):
    >>> scheduler.step()
    >>> train(...)
    >>> validate(...)

##4.对参数加 L2 penalty
Pytorch中的Adam,RMSprop,SGD等都有一个weight_decay的参数,默认为0,如果设置不为0,对参数会实施L2 penalty

optimizer = torch.optim.Adam(model.parameters(), lr=1e-4, weight_decay=1e-5)