我一直在看到使用 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)
谢谢
您需要进行迭代,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)
是的,在这种情况下它具有相同的效果,但不会更快。
| 归档时间: |
|
| 查看次数: |
2380 次 |
| 最近记录: |