在深度学习的训练过程中,经常需要调整模型的学习率以及其他超参数。PyTorch 提供了调度器(scheduler)来自动调整学习率,这对于优化模型的训练过程非常重要。PyTorch 提供了多种学习率调度器,常用的有 StepLR、MultiStepLR、ExponentialLR、CosineAnnealingLR 等。

StepLR 调度器将学习率按照指定的步骤进行调整。具体来说,每过一定的步骤,学习率会乘以一个特定的因子。下面是一个使用 StepLR 的示例代码。在这个示例中,我们定义了一个线性模型和一个 SGD 优化器,初始学习率为 0.1。然后我们创建了一个 StepLR 调度器,并将其与优化器关联起来。这个调度器将会在每 10 个步骤后将学习率乘以 0.1。

import torch.nn as nn
import torch.optim as optim
from torch.optim import lr_scheduler

model = nn.Linear(10, 1)
optimizer = optim.SGD(model.parameters(), lr=0.1)
scheduler = lr_scheduler.StepLR(optimizer, step_size=10, gamma=0.1)

for epoch in range(1, 31):
    # train
    optimizer.zero_grad()
    optimizer.step()
    print("第%d个epoch的学习率:%f" % (epoch, optimizer.param_groups[0]['lr']))
    scheduler.step()

输出结果为:

第1个epoch的学习率:0.100000
第2个epoch的学习率:0.100000
第3个epoch的学习率:0.100000
第4个epoch的学习率:0.100000
第5个epoch的学习率:0.100000
第6个epoch的学习率:0.100000
第7个epoch的学习率:0.100000
第8个epoch的学习率:0.100000
第9个epoch的学习率:0.100000
第10个epoch的学习率:0.100000
第11个epoch的学习率:0.010000
第12个epoch的学习率:0.010000
第13个epoch的学习率:0.010000
第14个epoch的学习率:0.010000
第15个epoch的学习率:0.010000
第16个epoch的学习率:0.010000
第17个epoch的学习率:0.010000
第18个epoch的学习率:0.010000
第19个epoch的学习率:0.010000
第20个epoch的学习率:0.010000
第21个epoch的学习率:0.001000
第22个epoch的学习率:0.001000
第23个epoch的学习率:0.001000
第24个epoch的学习率:0.001000
第25个epoch的学习率:0.001000
第26个epoch的学习率:0.001000
第27个epoch的学习率:0.001000
第28个epoch的学习率:0.001000
第29个epoch的学习率:0.001000
第30个epoch的学习率:0.001000

由此可以看出这个StepLR调度器将会在每 10 个步骤后将学习率乘以 0.1。

补充:MultiStepLR 调度器

MultiStepLR 调度器与 StepLR 调度器的原理类似,不同之处在于它可以在任意指定的步骤上调整学习率。下面是一个使用 MultiStepLR 的示例代码:

scheduler = lr_scheduler.MultiStepLR(optimizer, milestones=[5, 25], gamma=0.1)

在这个示例中,我们将学习率调整的步骤分别设置为 5 和 25,并将学习率调整因子设置为 0.1。这意味着在模型训练的第 5 步和 25 步时,学习率会乘以 0.1。运行结果如下所示:

第1个epoch的学习率:0.100000
第2个epoch的学习率:0.100000
第3个epoch的学习率:0.100000
第4个epoch的学习率:0.100000
第5个epoch的学习率:0.100000
第6个epoch的学习率:0.010000
第7个epoch的学习率:0.010000
第8个epoch的学习率:0.010000
第9个epoch的学习率:0.010000
第10个epoch的学习率:0.010000
第11个epoch的学习率:0.010000
第12个epoch的学习率:0.010000
第13个epoch的学习率:0.010000
第14个epoch的学习率:0.010000
第15个epoch的学习率:0.010000
第16个epoch的学习率:0.010000
第17个epoch的学习率:0.010000
第18个epoch的学习率:0.010000
第19个epoch的学习率:0.010000
第20个epoch的学习率:0.010000
第21个epoch的学习率:0.010000
第22个epoch的学习率:0.010000
第23个epoch的学习率:0.010000
第24个epoch的学习率:0.010000
第25个epoch的学习率:0.010000
第26个epoch的学习率:0.001000
第27个epoch的学习率:0.001000
第28个epoch的学习率:0.001000
第29个epoch的学习率:0.001000
第30个epoch的学习率:0.001000