核心要点

  • 能说清 scheduler 包装 optimizer,每个 epoch(或 step)末调用 scheduler.step() 才生效

  • 会按场景选调度器:CV 用 StepLR/MultiStepLR,Transformer 微调用 CosineAnnealingLR,快速收敛用 OneCycleLR,指标停滞用 ReduceLROnPlateau

  • 能指出 scheduler.step() 必须在 optimizer.step() 之后调用,否则首个 epoch 学习率错位

  • 能说明大模型训练前期需 warmup 线性升 lr,避免初期大梯度破坏预训练权重

简要回答

学习率调度是稳定训练、提升收敛质量的关键技巧;PyTorch 通过 torch.optim.lr_scheduler 实现

标准回答

学习率调度是稳定训练、提升收敛质量的关键技巧。PyTorch 通过 torch.optim.lr_scheduler 实现。

常见调度器

调度器 行为 场景
StepLR 每 N epoch lr × γ 基础衰减
MultiStepLR 指定 milestone 衰减 CV 经典
CosineAnnealingLR 余弦退火至 η_min Transformer 微调
OneCycleLR 先升后降单周期 快速收敛
ReduceLROnPlateau 验证指标停滞时降 lr 自适应

示例

python
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=100)
for epoch in range(100):
    train_one_epoch()
    scheduler.step()  # 通常每个 epoch 末

Warmup:大模型训练常先线性增大 lr 再衰减,可用 LambdaLR 或 HuggingFace get_scheduler 实现,避免初期大梯度破坏预训练权重。

详见 深度学习训练技巧

常见误区

⚠️ 常见踩坑

OneCycleLR、CosineAnnealingWarmRestarts 这类按 step 设计的调度器,却写成每 epoch 才 step 一次,导致 lr 曲线被拉长几十倍、训练末期 lr 还很高;另一个是 resume 训练只 load 了 optimizer.state_dict 却忘了 scheduler.state_dict(),重启后 lr 跳回初值。

追问

追问 1scheduler.step() 放在 epoch 内还是 epoch 外?

取决于调度器设计:StepLR、CosineAnnealingLR、MultiStepLR 按 epoch 衰减,放 epoch 循环末尾;OneCycleLR、按 step 的 cosine warmup 则放在每个 batch 的 optimizer.step() 之后。ReduceLROnPlateau 特殊,需传入验证指标 scheduler.step(val_loss),通常每 epoch 验证后调用。

追问 2Cosine 和 Step 衰减如何选?

Cosine 平滑连续下降到 η_min,无需手调衰减点,是 Transformer 训练和现代默认;Step/MultiStepLR 在指定 epoch 阶梯式 ×γ,可控性强、复现经典 CV 论文(如 ResNet 在 30/60/90 epoch 降 lr)时常用。不确定时优先 Cosine + warmup。

追问 3ReduceLROnPlateau 监控什么指标?

默认监控传入的 metric(通常验证 loss),若 mode="min" 且若干 epoch 无下降则 lr × factor。注意过拟合验证集时盲目降 lr 可能欠拟合。

延伸学习

与本题相关的知识库文章、术语、工具与行业资讯。

🛠️ AI 工具

  • Pytorch

    Meta 开源的深度学习框架,100K+ stars。以动态计算图和 Pythonic 风格著称,在学术界和工业界都有广泛应用,支持分布式训练、移动端部署和 ONNX 导出

  • Tensorflow

    全球最流行的机器学习框架之一,195K+ stars。Google 开源的端到端 ML 平台,支持 TensorFlow、Keras 等多种 API,覆盖深度学习、强化学习、移动端部署等全场景,是 AI 工程师的必备工具