PyTorch 中降低 Adam 优化器学习率的首选方法

Moh*_*mba 4 pytorch

我一直在看到使用 Adam 优化器的代码。他们降低学习率的方式如下:


    optimizer = torch.optim.Adam(net.parameters(),lr=0.01)
    (training...
    optimizer.step()...)

    if iteration >= some_threshold:
        for param_group in optimizer.param_groups:
            param_group['lr'] = 0.001

Run Code Online (Sandbox Code Playgroud)

我认为所有参数的学习率都相同。那么为什么要迭代 param_groups 并为每个参数单独设置学习率呢?

下面的方法不是更快并且具有相同的效果吗?


    optimizer = torch.optim.Adam(net.parameters(),lr=0.01)
    scheduler = MultiStepLR(optimizer, milestones=[some_threshold], gamma=0.1)
    (training...
    optimizer.step()
    scheduler.step())

Run Code Online (Sandbox Code Playgroud)

谢谢

Mic*_*ngo 5

您需要进行迭代,param_groups因为如果您没有在优化器中指定多组参数,那么您将自动拥有一组参数。这并不意味着您为每个参数设置学习率,而是为每个参数组设置学习率。

事实上,PyTorch 的学习率调度程序也做同样的事情。来自_LRScheduler(学习率调度程序的基类)

with _enable_get_lr_call(self):
    if epoch is None:
        self.last_epoch += 1
        values = self.get_lr()
    else:
        warnings.warn(EPOCH_DEPRECATION_WARNING, UserWarning)
        self.last_epoch = epoch
        if hasattr(self, "_get_closed_form_lr"):
            values = self._get_closed_form_lr()
        else:
            values = self.get_lr()

for param_group, lr in zip(self.optimizer.param_groups, values):
    param_group['lr'] = lr
Run Code Online (Sandbox Code Playgroud)

是的,在这种情况下它具有相同的效果,但不会更快。