简要回答
学习率调度是稳定训练、提升收敛质量的关键技巧;PyTorch 通过 torch.optim.lr_scheduler 实现
标准回答
学习率调度是稳定训练、提升收敛质量的关键技巧。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 末Warmup:大模型训练常先线性增大 lr 再衰减,可用 LambdaLR 或 HuggingFace get_scheduler 实现,避免初期大梯度破坏预训练权重。
详见 深度学习训练技巧。
常见误区
⚠️ 常见踩坑
OneCycleLR、CosineAnnealingWarmRestarts 这类按 step 设计的调度器,却写成每 epoch 才 step 一次,导致 lr 曲线被拉长几十倍、训练末期 lr 还很高;另一个是 resume 训练只 load 了 optimizer.state_dict 却忘了 scheduler.state_dict(),重启后 lr 跳回初值。
追问
追问 1:scheduler.step() 放在 epoch 内还是 epoch 外?
取决于调度器设计:StepLR、CosineAnnealingLR、MultiStepLR 按 epoch 衰减,放 epoch 循环末尾;OneCycleLR、按 step 的 cosine warmup 则放在每个 batch 的 optimizer.step() 之后。ReduceLROnPlateau 特殊,需传入验证指标 scheduler.step(val_loss),通常每 epoch 验证后调用。
追问 2:Cosine 和 Step 衰减如何选?
Cosine 平滑连续下降到 η_min,无需手调衰减点,是 Transformer 训练和现代默认;Step/MultiStepLR 在指定 epoch 阶梯式 ×γ,可控性强、复现经典 CV 论文(如 ResNet 在 30/60/90 epoch 降 lr)时常用。不确定时优先 Cosine + warmup。
追问 3:ReduceLROnPlateau 监控什么指标?
默认监控传入的 metric(通常验证 loss),若 mode="min" 且若干 epoch 无下降则 lr × factor。注意过拟合验证集时盲目降 lr 可能欠拟合。
延伸学习
与本题相关的知识库文章、术语、工具与行业资讯。
📰 AI 资讯
🛠️ AI 工具
- Pytorch
Meta 开源的深度学习框架,100K+ stars。以动态计算图和 Pythonic 风格著称,在学术界和工业界都有广泛应用,支持分布式训练、移动端部署和 ONNX 导出
- Tensorflow
全球最流行的机器学习框架之一,195K+ stars。Google 开源的端到端 ML 平台,支持 TensorFlow、Keras 等多种 API,覆盖深度学习、强化学习、移动端部署等全场景,是 AI 工程师的必备工具