PyTorch-学习率调度器(Learning Rate Scheduler)
PyTorch 学习率调度器(Learning Rate Scheduler)技术指南
目录
- 学习率调度器概念
- 常用学习率调度器
- 2.1 StepLR
- 2.2 MultiStepLR
- 2.3 ExponentialLR
- 2.4 CosineAnnealingLR
- 2.5 ReduceLROnPlateau
- 2.6 OneCycleLR
- 2.7 LambdaLR
- 2.8 MultiplicativeLR
- 2.9 ConstantLR
- 2.10 LinearLR
- 2.11 PolynomialLR
- 2.12 CosineAnnealingWarmRestarts
- 2.13 CyclicLR
- 2.14 SequentialLR
- 2.15 ChainedScheduler
- 使用示例
- 选择合适的调度器
1. 学习率调度器概念
学习率(Learning Rate)是深度学习训练中最重要的超参数之一,它决定了模型参数更新的步长。设置合适的学习率对模型的训练效果和收敛速度至关重要。
学习率调度器(Learning Rate Scheduler)是PyTorch中用于在训练过程中自动调整学习率的工具。它允许我们根据训练的进度动态地改变学习率,从而实现更高效的训练过程。通常在训练初期使用较大的学习率以快速收敛,在训练后期降低学习率以精细调优。
在PyTorch中,学习率调度器位于torch.optim.lr_scheduler模块中,需要与优化器(Optimizer)配合使用。
2. 常用学习率调度器
2.1 StepLR
StepLR是最基础的学习率调度器之一,它每隔固定的epoch数将学习率乘以一个衰减因子。
参数:
step_size:学习率衰减的间隔epoch数gamma:衰减因子,默认为0.1last_epoch:最后一个epoch索引,默认为-1verbose:是否打印学习率更新信息,默认为False
使用场景:适用于训练过程中定期衰减学习率的场景。
2.2 MultiStepLR
MultiStepLR是StepLR的扩展,允许在指定的epoch点进行学习率衰减。
参数:
milestones:进行学习率衰减的epoch点列表gamma:衰减因子,默认为0.1last_epoch:最后一个epoch索引,默认为-1verbose:是否打印学习率更新信息,默认为False
使用场景:适用于需要在特定训练阶段调整学习率的场景。
2.3 ExponentialLR
ExponentialLR在每个epoch将学习率按指数函数进行衰减。
参数:
gamma:指数衰减因子last_epoch:最后一个epoch索引,默认为-1verbose:是否打印学习率更新信息,默认为False
使用场景:适用于需要平滑指数衰减学习率的场景。
2.4 CosineAnnealingLR
CosineAnnealingLR使用余弦函数将学习率从初始值调整到最小值,变化过程平滑。
参数:
T_max:余弦函数的周期eta_min:学习率的最小值,默认为0last_epoch:最后一个epoch索引,默认为-1verbose:是否打印学习率更新信息,默认为False
使用场景:适用于需要周期性调整学习率的场景,如SGDR(随机梯度下降退火)。
2.5 ReduceLROnPlateau
ReduceLROnPlateau根据某个指标(如验证集损失)是否停止改善来调整学习率,是唯一一个需要传入指标值的调度器。
参数:
mode:比较模式,'min'表示最小化指标,'max'表示最大化指标factor:学习率衰减因子patience:容忍指标没有改善的epoch数threshold:衡量新最优值的阈值threshold_mode:阈值模式,'rel'表示相对值,'abs'表示绝对值cooldown:学习率降低后恢复正常操作前等待的epoch数min_lr:学习率的下限eps:学习率衰减的最小值verbose:是否打印学习率更新信息,默认为False
使用场景:适用于需要根据模型性能动态调整学习率的场景。
2.6 OneCycleLR
OneCycleLR实现了一种称为"1周期"的学习率策略,在一个训练周期内先增加后减少学习率。
参数:
max_lr:学习率的上限total_steps:总步数epochs:训练总epoch数steps_per_epoch:每个epoch的步数pct_start:学习率增加阶段所占的百分比anneal_strategy:退火策略,'cos'或'linear'cycle_momentum:是否同时调整动量base_momentum:动量下限max_momentum:动量上限div_factor:初始学习率因子final_div_factor:最终学习率因子last_epoch:最后一个epoch索引,默认为-1verbose:是否打印学习率更新信息,默认为False
使用场景:适用于快速训练场景,可以显著加快收敛速度。
2.7 LambdaLR
LambdaLR允许用户通过自定义函数来设置学习率调整策略。
参数:
optimizer:优化器lr_lambda:自定义函数或函数列表,用于计算学习率的乘法因子last_epoch:最后一个epoch索引,默认为-1verbose:是否打印学习率更新信息,默认为False
使用场景:适用于需要完全自定义学习率调整策略的场景。
2.8 MultiplicativeLR
MultiplicativeLR通过用户自定义的函数逐epoch乘以一个因子来调整学习率。
参数:
optimizer:优化器lr_lambda:自定义函数或函数列表,用于计算学习率的乘法因子last_epoch:最后一个epoch索引,默认为-1verbose:是否打印学习率更新信息,默认为False
使用场景:适用于需要逐epoch乘法调整学习率的场景。
2.9 ConstantLR
ConstantLR在预定义的epoch数内将学习率乘以一个常数因子,然后恢复原始学习率。
参数:
optimizer:优化器factor:学习率乘以的因子,默认为1/3total_iters:应用因子的epoch数,默认为5last_epoch:最后一个epoch索引,默认为-1verbose:是否打印学习率更新信息,默认为False
使用场景:适用于训练初期需要降低学习率的场景。
2.10 LinearLR
LinearLR在线性变化过程中逐渐调整学习率,从[start_factor]到[end_factor]。
参数:
optimizer:优化器start_factor:初始学习率乘以的因子,默认为1/3end_factor:结束时学习率乘以的因子,默认为1.0total_iters:线性变化的总epoch数,默认为5last_epoch:最后一个epoch索引,默认为-1verbose:是否打印学习率更新信息,默认为False
使用场景:适用于需要线性调整学习率的场景。
2.11 PolynomialLR
PolynomialLR使用多项式函数来衰减学习率。
参数:
optimizer:优化器total_iters:学习率衰减的总步数,默认为5power:多项式的幂次,默认为1.0last_epoch:最后一个epoch索引,默认为-1verbose:是否打印学习率更新信息,默认为False
使用场景:适用于需要多项式衰减学习率的场景。
2.12 CosineAnnealingWarmRestarts
CosineAnnealingWarmRestarts使用余弦退火算法,并在每次重启时重置学习率。
参数:
optimizer:优化器T_0:第一次重启的迭代次数T_mult:重启后增加T_i的因子,默认为1eta_min:学习率下限,默认为0last_epoch:最后一个epoch索引,默认为-1verbose:是否打印学习率更新信息,默认为False
使用场景:适用于需要周期性重启训练的场景。
2.13 CyclicLR
CyclicLR在两个学习率边界之间周期性调整学习率。
参数:
optimizer:优化器base_lr:学习率下限max_lr:学习率上限step_size_up:上升阶段的训练迭代次数,默认为2000step_size_down:下降阶段的训练迭代次数,默认为Nonemode:调整策略,可选'triangular'、'triangular2'、'exp_range'gamma:'exp_range'策略中的常数因子scale_fn:自定义缩放策略函数scale_mode:定义scale_fn的评估方式,'cycle'或'iterations'cycle_momentum:是否同时调整动量,默认为Truebase_momentum:动量下限,默认为0.8max_momentum:动量上限,默认为0.9last_epoch:最后一个epoch索引,默认为-1verbose:是否打印学习率更新信息,默认为False
使用场景:适用于需要周期性调整学习率的场景。
2.14 SequentialLR
SequentialLR允许按顺序使用多个调度器,在不同的训练阶段使用不同的调度策略。
参数:
optimizer:优化器schedulers:调度器列表milestones:切换调度器的epoch点列表last_epoch:最后一个epoch索引,默认为-1verbose:是否打印学习率更新信息,默认为False
使用场景:适用于需要在不同训练阶段使用不同调度策略的场景。
2.15 ChainedScheduler
ChainedScheduler可以链式调用多个调度器,同时应用多种调度策略。
参数:
schedulers:调度器列表
使用场景:适用于需要同时应用多种调度策略的场景。
3. 使用示例
以下是一个使用学习率调度器的基本示例:
import torch
import torch.nn as nn
import torch.optim as optim
from torch.optim import lr_scheduler
import numpy as np
# 定义模型
model = nn.Sequential(
nn.Linear(10, 5),
nn.ReLU(),
nn.Linear(5, 1)
)
# 定义优化器
optimizer = optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
# 选择一个学习率调度器
# 示例1: StepLR
scheduler = lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)
# 示例2: ReduceLROnPlateau
# scheduler = lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=10)
# 示例3: CosineAnnealingWarmRestarts
# scheduler = lr_scheduler.CosineAnnealingWarmRestarts(optimizer, T_0=10, T_mult=1)
# 示例4: OneCycleLR
# scheduler = lr_scheduler.OneCycleLR(optimizer, max_lr=0.01, total_steps=100)
# 示例5: SequentialLR
# scheduler1 = lr_scheduler.ConstantLR(optimizer, factor=0.5, total_iters=5)
# scheduler2 = lr_scheduler.ExponentialLR(optimizer, gamma=0.9)
# scheduler = lr_scheduler.SequentialLR(optimizer, schedulers=[scheduler1, scheduler2], milestones=[5])
# 训练循环
for epoch in range(100):
# 训练代码...
train(...)
# 验证代码...
val_loss = validate(...)
# 更新学习率
# 对于大多数调度器
scheduler.step()
# 对于ReduceLROnPlateau
# scheduler.step(val_loss)
# 打印当前学习率
print(f"Epoch {epoch+1}, Learning Rate: {optimizer.param_groups[0]['lr']}")
4. 选择合适的调度器
选择合适的学习率调度器需要考虑以下因素:
- 训练数据集大小:大数据集通常可以使用更复杂的学习率调度策略
- 模型复杂度:复杂模型可能需要更精细的学习率调整
- 训练时间要求:如果需要快速训练,可以考虑OneCycleLR等策略
- 验证指标监控:如果有可靠的验证指标,ReduceLROnPlateau是不错的选择
- 先验知识:如果有相关经验,可以使用StepLR或MultiStepLR
一般来说:
- 如果刚开始训练模型,可以先尝试StepLR或MultiStepLR
- 如果希望根据模型性能调整学习率,使用ReduceLROnPlateau(我个人很喜欢这个scheduler,方便快捷,其他的不见得有很大优势)
- 如果追求快速训练,可以尝试OneCycleLR
- 如果需要周期性训练,可以使用CosineAnnealingLR或CosineAnnealingWarmRestarts
- 如果需要完全自定义学习率调整策略,可以使用LambdaLR
- 如果需要组合多种调度策略,可以使用SequentialLR或ChainedScheduler
通过合理使用学习率调度器,可以显著提高模型训练的效率和最终性能。

浙公网安备 33010602011771号