我一直看到code使用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
我认为我们对所有参数的学习率都相同。那么为什么要遍历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())
谢谢
答案 0 :(得分:2)
您需要遍历param_groups
,因为如果未在优化器中指定多组参数,则会自动有一个组。这并不意味着您要为每个参数设置学习率,而是每个参数组。
实际上,PyTorch的学习率调度程序可以做同样的事情。来自_LRScheduler
(base class of learning rate schedulers):
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
是的,在这种情况下它具有相同的效果,但是不会更快。