深入理解PyTorch中的学习率调度器:torch.optim.lr_scheduler详解
在深度学习中,学习率是优化器中一个非常重要的超参数,它决定了模型在训练过程中每一步更新参数的幅度。合适的学习率可以帮助模型更快地收敛,并且有效地避免陷入局部最优解。
PyTorch 提供了 torch.optim.lr_scheduler 模块,用于实现学习率的调度。学习率调度器可以根据训练过程的不同阶段动态地调整学习率,例如随着训练进行的次数增加,逐渐减小学习率,以实现更好的模型收敛效果。
在使用 torch.optim.lr_scheduler 之前,我们需要先创建一个优化器对象,然后将其作为参数传递给学习率调度器。具体实现如下:
import torch import torch.optim as optim from torch.optim import lr_scheduler # 创建优化器 optimizer = optim.SGD(model.parameters(), lr=0.1) # 创建学习率调度器 scheduler = lr_scheduler.StepLR(optimizer, step_size=10, gamma=0.1)
上述代码中,我们先创建一个 SGD 优化器,并指定初始学习率为 0.1。然后,我们创建一个 StepLR 学习率调度器,并将优化器对象和相关参数传递给它。StepLR 调度器将在每个 epoch 结束时更新学习率,使其乘以一个 gamma 参数(这里设置为 0.1),并且每经过指定的 step_size(这里设置为 10)个 epoch,将学习率更新一次。也就是说,每隔 10 个 epoch,学习率将缩小为原来的 0.1。
除了 StepLR 调度器外,PyTorch 还提供了其他几种常用的学习率调度器,包括MultiStepLR、ExponentialLR、CosineAnnealingLR 和 ReduceLROnPlateau 等。下面将介绍这些调度器的具体使用方法。
1. MultiStepLR 调度器
MultiStepLR 调度器可以在指定的多个 epoch 过后缩小学习率。例子如下:
scheduler = lr_scheduler.MultiStepLR(optimizer, milestones=[30,80], gamma=0.1)
上述代码中,优化器将在第 30 和 80 个 epoch 结束时,将学习率乘以 0.1。
2. ExponentialLR 调度器
ExponentialLR 调度器会根据给定的 gamma 参数,每过一个 epoch 就将学习率缩小为原来的 gamma 倍。例子如下:
scheduler = lr_scheduler.ExponentialLR(optimizer, gamma=0.9)
上述代码中,优化器每个 epoch 结束时,都将学习率乘以 0.9。
3. CosineAnnealingLR 调度器
CosineAnnealingLR 调度器通过余弦函数调整学习率,使其随着 epoch 变化,具有周期性的变化特点。例子如下:
scheduler = lr_scheduler.CosineAnnealingLR(optimizer, T_max=10)
上述代码中,T_max 参数表示学习率达到最小值之前的总 epoch 数。学习率将在 T_max 个 epoch 内从初始值下降到最小值。
4. ReduceLROnPlateau 调度器
ReduceLROnPlateau 调度器会在模型验证集上的指标停止改善时,减小学习率。例子如下:
scheduler = lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=10)
上述代码中,mode 参数指定了验证集上的指标是最大化还是最小化。当验证集上的指标在连续 10 个 epoch 中没有改善时,学习率将乘以 0.1。
以上就是 PyTorch 中学习率调度器的详细介绍和使用示例,通过合理地运用学习率调度器,可以帮助模型更好地收敛,并且提高模型的性能。
