核心要点
能描述 loss.backward() 触发 Autograd 反向求导
理解计算图从叶子节点向根累积 .grad
知道 zero_grad() 与 optimizer.step() 的配合顺序
能解释 requires_grad 与 detach 的作用
标准回答
一、先给出结论和背景
- 核心回答:PyTorch 的 反向传播 由 Autograd 自动完成,典型训练步如下:
- 前向传播:输入 x 经 model(x) 得预测,与标签算 loss = criterion(output, target)。前向中每个可微操作在计算图上记录依赖。
二、拆开关键步骤和判断点
- 清零梯度:optimizer.zero_grad()(或 model.zero_grad())——PyTorch 默认梯度累加,不清零会导致多步梯度叠加。
- 反向传播:loss.backward() 从 loss 节点出发,按链式法则向叶子参数传播,将 ∂loss/∂param 累加到 param.grad。
三、补上落地边界和取舍
- 参数更新:optimizer.step() 按优化器规则(SGD、Adam 等)用 .grad 更新 param.data。
示例代码可以这样理解:
for x, y in loader:
optimizer.zero_grad()
loss = criterion(model(x), y)
loss.backward()
optimizer.step() - 关键机制:requires_grad=True 的张量参与建图;with torch.no_grad() 推理时跳过建图省显存;retain_graph=True 可对同一图多次 backward。详见 反向传播原理。
面试里不要只停在公式或名词,可以补 PyTorch 中反向传播的过程是怎样的 对训练稳定性、泛化、收敛速度或显存/算力的影响。再说明一个常见调参或排错场景,面试官会更容易判断你真的用过这些方法。
回答思路
【定义】用一句话说清「PyTorch 中反向传播的过程是怎样的」
【原理】讲清关键机制或步骤(2~3 点)
【例子】举一个真实项目、论文或产品中的例子
【对比】与易混淆概念或替代方案比较(如有)
【收尾】总结适用场景 + 一个局限或风险
常见误区
⚠️ 常见踩坑
误区一:容易答偏的地方:忘记 zero_grad 导致梯度累加;在 backward 后仍用计算图做第二次 backward 未设 retain_graph;混淆 .data 与 .detach() 导致梯度泄漏到不该训练的参数。
追问
追问 1:为什么需要 zero_grad?不设会怎样?
PyTorch 的 .grad 是累加缓冲区。若不清零,第二步的梯度会叠在第一步之上,等价于增大 batch size 或错误的学习率,训练发散或行为异常。梯度累积场景则有意隔 N 步才 step 一次。
追问 2:loss.backward() 后 .grad 存的是什么?
每个 requires_grad 参数的 .grad 是与参数同 shape 的张量,存储 ∂loss/∂param。optimizer.step() 读取 .grad 执行更新;手动调试可用 param.grad.norm() 检查梯度爆炸/消失。
追问 3:非标量 loss 如何 backward?
backward() 默认要求 loss 是标量。若输出是向量,需传入 grad_tensors 权重(如 torch.ones_like(output))指定各分量对梯度的贡献,等价于加权求和后再反传。
🔗 相似问题
同一考点的不同问法,换着练更稳
没找到想看的面试题?把你想看的告诉我们 →
延伸学习
按主题分类的相关资源,便于系统复习
