简要回答
PyTorch 优化器(如 SGD、Adam)封装参数更新规则:每步 backward 后调用 optimizer.step() 根据 .grad 和学习率等超参更新 model.parameters()。
标准回答
一、核心回答
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。详见 深度学习训练技巧。
回答思路
【定义】用一句话说清「PyTorch 中的优化器是什么?如何使用」
【原理】讲清关键机制或步骤(2~3 点)
【例子】举一个真实项目、论文或产品中的例子
【对比】与易混淆概念或替代方案比较(如有)
【收尾】总结适用场景 + 一个局限或风险
常见误区
⚠️ 常见踩坑
误区一:容易答偏的地方:step() 写在 backward() 之前;忘记 zero_grad;对同一 optimizer 重复实例化导致动量状态丢失;学习率过大不配合 scheduler。
追问
追问 1:Adam 和 SGD 何时选谁?
Adam 默认收敛快、调参友好,适合 NLP/快速实验;SGD+momentum 在 CV 大模型上有时泛化更好但需精细调 lr。微调时常用较小 AdamW lr + warmup。
追问 2:weight_decay 和 L2 正则有何关系?
经典 L2 正则把 λ‖W‖² 加入 loss;AdamW 将权重衰减与梯度更新解耦,直接 shrink 权重,是 Transformer 训练的标准做法,效果通常优于在 Adam 里加 L2。
追问 3:如何只优化部分参数?
optimizer = Adam(filter(lambda p: p.requires_grad, model.parameters())) 或传入子模块 .parameters();冻结 backbone 时设 requires_grad=False。
落地时需结合业务场景说明取舍、边界条件与可观测指标,避免只背概念。
🔗 相似问题
同一考点的不同问法,换着练更稳
没找到想看的面试题?把你想看的告诉我们 →
延伸学习
按主题分类的相关资源,便于系统复习
