核心要点

  • 能解释优化器根据 .grad 更新参数

  • 熟悉 SGDAdam 等常用优化器及超参

  • 会写 optimizer = torch.optim.Adam(model.parameters(), lr=...) 标准用法

  • 知道 param_groups 与学习率分组

标准回答

PyTorch 优化器实现各类梯度下降变体,在 loss.backward() 之后调用 optimizer.step() 更新 model.parameters()

常用优化器

优化器 特点 典型场景
SGD 简单,+momentum 加速 CV 经典训练
Adam 自适应学习率,收敛快 默认首选、NLP
AdamW 解耦权重衰减 Transformer 预训练
RMSprop 适应非平稳目标 RNN 历史常用

标准用法

python
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。

追问

追问 1Adam 和 SGD 何时选谁?

题库专题:梯度下降的原理是什么?SGD 和 Adam 有什么区别?

Adam 默认收敛快、调参友好,适合 NLP/快速实验;SGD+momentum 在 CV 大模型上有时泛化更好但需精细调 lr。微调时常用较小 AdamW lr + warmup。

题库延伸:与本追问相关的专题题 → 梯度下降的原理是什么?SGD 和 Adam 有什么区别?

追问 2weight_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 工具

  • Pytorch

    Meta 开源的深度学习框架,100K+ stars。以动态计算图和 Pythonic 风格著称,在学术界和工业界都有广泛应用,支持分布式训练、移动端部署和 ONNX 导出

  • Tensorflow

    全球最流行的机器学习框架之一,195K+ stars。Google 开源的端到端 ML 平台,支持 TensorFlow、Keras 等多种 API,覆盖深度学习、强化学习、移动端部署等全场景,是 AI 工程师的必备工具