核心要点
知道 torch.optim.lr_scheduler 模块
能举例 StepLR、CosineAnnealingLR、OneCycleLR
理解 scheduler.step() 调用时机
了解 warmup 在大模型训练中的重要性
标准回答
一、先把结论讲清楚
学习率调度是稳定训练、提升收敛质量的关键技巧。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 点)
【例子】举一个真实项目、论文或产品中的例子
【对比】与易混淆概念或替代方案比较(如有)
【收尾】总结适用场景 + 一个局限或风险
常见误区
⚠️ 常见踩坑
误区一:容易答偏的地方:scheduler.step() 与 optimizer.step() 顺序搞反;OneCycleLR 未按 batch step;忘记在 resume 训练时恢复 scheduler state。
追问
追问 1:scheduler.step() 放在 epoch 内还是 epoch 外?
多数按 epoch 调度(StepLR、Cosine)在 epoch 循环末尾 step;OneCycleLR、部分 warmup 需每个 batch step。以所用 scheduler 文档为准,放错会导致 lr 曲线错误。
追问 2:Cosine 和 Step 衰减如何选?
Step 简单可控,CV 常用;Cosine 后期 lr 很小利于精细收敛,Transformer/BERT 微调常见。可结合 warmup:先升后 cosine 降。
追问 3:ReduceLROnPlateau 监控什么指标?
默认监控传入的 metric(通常验证 loss),若 mode="min" 且若干 epoch 无下降则 lr × factor。注意过拟合验证集时盲目降 lr 可能欠拟合。
🔗 相似问题
同一考点的不同问法,换着练更稳
延伸学习
按主题分类的相关资源,便于系统复习
