PyTorch:如何在任何给定时刻更改优化器的学习率(无 LR 计划)

Posted

技术标签:

【中文标题】PyTorch:如何在任何给定时刻更改优化器的学习率(无 LR 计划)【英文标题】:PyTorch: How to change the learning rate of an optimizer at any given moment (no LR schedule) 【发布时间】:2018-06-27 16:39:43 【问题描述】:

在 PyTorch 中是否可以在训练过程中动态改变优化器的学习率(我不想事先定义学习率计划)?

假设我有一个优化器:

optim = torch.optim.SGD(model.parameters(), lr=0.01)

现在由于我在训练期间进行的一些测试,我意识到我的学习率太高了,所以我想把它改成0.001。似乎没有方法optim.set_lr(0.001),但有什么方法可以做到这一点吗?

【问题讨论】:

【参考方案1】:

所以学习率存储在optim.param_groups[i]['lr']optim.param_groups 是可以具有不同学习率的不同权重组的列表。因此,只需这样做:

for g in optim.param_groups:
    g['lr'] = 0.001

会成功的。

或者,

正如 cmets 中提到的,如果您的学习率仅取决于 epoch 数,您可以使用learning rate scheduler。

例如(来自文档的修改示例):

torch.optim.lr_scheduler import LambdaLR
optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
# Assuming optimizer has two groups.
lambda_group1 = lambda epoch: epoch // 30
lambda_group2 = lambda epoch: 0.95 ** epoch
scheduler = LambdaLR(optimizer, lr_lambda=[lambda1, lambda2])
for epoch in range(100):
    train(...)
    validate(...)
    scheduler.step()

还有,还有一个prebuilt learning rate scheduler to reduce on plateaus.

【讨论】:

@MehmetBurakSayıcı 提出一个新问题。 2020年使用this automatic updaters 我尝试使用它,但我没有更改 lr。必须做出这样的改变: for i in range(len(optimizer.param_groups)): optimizer.param_groups[i]['lr'] = new_lr【参考方案2】:

您可以直接通过以下方式来代替patapouf_ai's answer 中的循环:

optim.param_groups[0]['lr'] = 0.001

【讨论】:

这仅适用于您有一个参数组的情况。 (这可能是大部分时间。)

以上是关于PyTorch:如何在任何给定时刻更改优化器的学习率(无 LR 计划)的主要内容,如果未能解决你的问题,请参考以下文章

Pytorch中adam优化器的参数问题

Pytorch 模型的超参数优化

如何在 TF2 中更改 Adam 的学习率?

Pytorch框架学习---优化器Optimizer

基于Pytorch的强化学习(DQN)之价值学习

在 ADAM 优化器的 CNTK 实现中,参数 alpha、beta1、beta2 和 epsilon 如何与学习率和动量相关