标准回答
PyTorch 优化器实现各类梯度下降变体,在 loss.backward() 之后调用 optimizer.step() 更新 model.parameters()。
常用优化器:
| 优化器 | 特点 | 典型场景 |
|---|---|---|
| SGD | 简单,+momentum 加速 | CV 经典训练 |
| Adam | 自适应学习率,收敛快 | 默认首选、NLP |
| AdamW | 解耦权重衰减 | Transformer 预训练 |
| RMSprop | 适应非平稳目标 | RNN 历史常用 |
标准用法:
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3, weight_decay=1e-4)
# 训练循环内
optimizer.zero_grad()
loss.backward()
optimizer.step()进阶:param_groups 为不同层设不同 lr(如 backbone 小 lr、head 大 lr);torch.optim.lr_scheduler 配合做学习率调度;optimizer.state 存 Adam 的一阶/二阶动量。
选型:小数据集+CNN 可 SGD+momentum;大模型微调多用 AdamW + warmup。详见 深度学习训练技巧。
常见误区
⚠️ 常见踩坑
step() 写在 backward() 之前;忘记 zero_grad;对同一 optimizer 重复实例化导致动量状态丢失;学习率过大不配合 scheduler。
追问
追问 1:Adam 和 SGD 何时选谁?
题库专题:梯度下降的原理是什么?SGD 和 Adam 有什么区别?Adam 默认收敛快、调参友好,适合 NLP/快速实验;SGD+momentum 在 CV 大模型上有时泛化更好但需精细调 lr。微调时常用较小 AdamW lr + warmup。
题库延伸:与本追问相关的专题题 → 梯度下降的原理是什么?SGD 和 Adam 有什么区别?
追问 2:weight_decay 和 L2 正则有何关系?
经典 L2 正则把 λ‖W‖² 加入 loss;AdamW 将权重衰减与梯度更新解耦,直接 shrink 权重,是 Transformer 训练的标准做法,效果通常优于在 Adam 里加 L2。
追问 3:如何只优化部分参数?
两种做法:构造 optimizer 时只传入要优化的参数子集,如 torch.optim.Adam(model.head.parameters(), lr=...);或对要冻结的层设 param.requires_grad = False,让其不产生梯度。微调时常冻结 backbone、只训新加的分类头,二者也可结合 param_groups 给不同层不同 lr。
延伸学习
与本题相关的知识库文章、术语、工具与行业资讯。
📰 AI 资讯
🛠️ AI 工具
- Pytorch
Meta 开源的深度学习框架,100K+ stars。以动态计算图和 Pythonic 风格著称,在学术界和工业界都有广泛应用,支持分布式训练、移动端部署和 ONNX 导出
- Tensorflow
全球最流行的机器学习框架之一,195K+ stars。Google 开源的端到端 ML 平台,支持 TensorFlow、Keras 等多种 API,覆盖深度学习、强化学习、移动端部署等全场景,是 AI 工程师的必备工具