PyTorch 学习率调度器(LR Scheduler)

PyTorch 学习率调度器(LR Scheduler)


1. 一句话定义

每过一段时间 / 满足某条件,自动按规则修改优化器学习率的工具。


2. 通用使用套路

optimizer = torch.optim.Adam(model.parameters(), lr=初始LR)
scheduler = XXXLR(optimizer, ...)   # 选下面任意一种
for epoch in range(EPOCH):
    train(...)
    val_loss = validate(...)
    optimizer.step()                # ① 先更新参数
    scheduler.step(val_loss)        # ② 再调度LR(ReduceLROnPlateau需传loss)

顺序:先 optimizer.step() → 再 scheduler.step(),否则报警告。


3. 内置调度器对比速览

调度器触发规则主要参数参数解释典型场景
LambdaLR自定义函数 f(epoch) 返回乘数lr_lambda, last_epochlr_lambda: 接收 epoch,返回 LR 乘数;last_epoch: 重启训练时设为上次 epochwarmup、分段线性
StepLR固定每 step_size epoch 降一次step_size, gamma, last_epochstep_size: 隔多少 epoch 降;gamma: 乘性衰减系数常规“等间隔”下降
MultiStepLR指定里程碑 epoch 列表降milestones, gamma, last_epochmilestones: List,到这些 epoch 就 ×gamma训练中期多段下降
CosineAnnealingLR余弦曲线从初始→η_minT_max, eta_min, last_epochT_max: 半个余弦周期长度;eta_min: 最小 LR退火、cosine 重启
ReduceLROnPlateau监控指标停止改善时降mode, factor, patience, threshold, cooldown, min_lr见下方详注验证 loss/acc 卡住时

ReduceLROnPlateau 参数详注

  • mode='min''max':指标越小/越大越好
  • factor=0.1:新 LR = 旧 LR × factor
  • patience=3:连续 3 次 epoch 无改善才降
  • threshold=0.01:改善幅度小于阈值视为无改善
  • cooldown=1:降 LR 后冻结监控的 epoch 数
  • min_lr=1e-6:下限,降到此值不再降

4. 各调度器最小模板

① LambdaLR(线性 warmup)

scheduler = LambdaLR(optimizer, lr_lambda=lambda epoch: epoch / 5 if epoch < 5 else 1)

② StepLR

scheduler = StepLR(optimizer, step_size=2, gamma=0.1)   # 每 2 epoch ×0.1

③ MultiStepLR

scheduler = MultiStepLR(optimizer, milestones=[2, 6], gamma=0.1)

④ CosineAnnealingLR

scheduler = CosineAnnealingLR(optimizer, T_max=10, eta_min=1e-6)

⑤ ReduceLROnPlateau(必须传指标)

scheduler = ReduceLROnPlateau(
    optimizer, mode='min', factor=0.1, patience=3,
    threshold=0.01, cooldown=1, min_lr=1e-6)
val_loss = validate(...)
scheduler.step(val_loss)          # ← 记得传指标

5. 常用调试 API

scheduler.get_last_lr()   # 当前实际 LR 列表(每个 param_group)
scheduler.last_epoch      # 已完成的 epoch 计数(从 0 开始)

6. 易踩坑 Top-3

  1. optimizer.step()scheduler.step()
    否则报警告 “Detected call of lr_scheduler.step() before optimizer.step()”。
  2. ReduceLROnPlateau 必须传监控值
    不传 → RuntimeError。
  3. Lambda/MultiStep 等无需监控值,传了 → TypeError。

7. 速记口诀

“优化先迈步,调度再跟进;Plateau 传 loss,其余不用问。”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员miki

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值