核心要点

  • 知道 torch.optim.lr_scheduler 模块

  • 能举例 StepLR、CosineAnnealingLR、OneCycleLR

  • 理解 scheduler.step() 调用时机

  • 了解 warmup 在大模型训练中的重要性

简要回答

PyTorch 用 torch.optim.lr_scheduler 在训练中动态调整学习率:创建 scheduler 包装 optimizer,每个 epoch 或 step 后调用 scheduler.step(),常用 CosineAnnealing、StepLR、OneCycleLR 等。

标准回答

一、先把结论讲清楚

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

二、常见调度器

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

三、示例

示例代码可以这样理解:
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 末

面试里不要只停在公式或名词,可以补 在 PyTorch 中实现学习率调度 对训练稳定性、泛化、收敛速度或显存/算力的影响。再说明一个常见调参或排错场景,面试官会更容易判断你真的用过这些方法。

四、Warmup

大模型训练常先线性增大 lr 再衰减,可用 LambdaLR 或 HuggingFace get_scheduler 实现,避免初期大梯度破坏预训练权重。
详见 深度学习训练技巧

回答思路

  • 【定义】用一句话说清「如何在 PyTorch 中实现学习率调度」

  • 【原理】讲清关键机制或步骤(2~3 点)

  • 【例子】举一个真实项目、论文或产品中的例子

  • 【对比】与易混淆概念或替代方案比较(如有)

  • 【收尾】总结适用场景 + 一个局限或风险

延伸学习

工具:PyTorch。知识库:深度学习训练技巧。术语:梯度

常见误区

⚠️ 常见踩坑

误区一:容易答偏的地方:scheduler.step() 与 optimizer.step() 顺序搞反;OneCycleLR 未按 batch step;忘记在 resume 训练时恢复 scheduler state。

追问

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

多数按 epoch 调度(StepLR、Cosine)在 epoch 循环末尾 step;OneCycleLR、部分 warmup 需每个 batch step。以所用 scheduler 文档为准,放错会导致 lr 曲线错误。

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

Step 简单可控,CV 常用;Cosine 后期 lr 很小利于精细收敛,Transformer/BERT 微调常见。可结合 warmup:先升后 cosine 降。

追问 3ReduceLROnPlateau 监控什么指标?

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

🔗 相似问题

同一考点的不同问法,换着练更稳

延伸学习

按主题分类的相关资源,便于系统复习