核心要点

  • 能描述 loss.backward() 触发 Autograd 反向求导

  • 理解计算图从叶子节点向根累积 .grad

  • 知道 zero_grad() 与 optimizer.step() 的配合顺序

  • 能解释 requires_grad 与 detach 的作用

简要回答

PyTorch 反向传播:前向计算 loss → loss.backward() 沿计算图用链式法则累加梯度到各参数 .grad → optimizer.step() 更新权重;每步前需 optimizer.zero_grad() 清零旧梯度。

标准回答

一、先给出结论和背景

  • 核心回答PyTorch反向传播Autograd 自动完成,典型训练步如下:
  • 前向传播:输入 xmodel(x) 得预测,与标签算 loss = criterion(output, target)。前向中每个可微操作在计算图上记录依赖。

二、拆开关键步骤和判断点

  • 清零梯度optimizer.zero_grad()(或 model.zero_grad())——PyTorch 默认梯度累加,不清零会导致多步梯度叠加。
  • 反向传播loss.backward() 从 loss 节点出发,按链式法则向叶子参数传播,将 ∂loss/∂param 累加到 param.grad

三、补上落地边界和取舍

  • 参数更新optimizer.step() 按优化器规则(SGDAdam 等)用 .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 点)

  • 【例子】举一个真实项目、论文或产品中的例子

  • 【对比】与易混淆概念或替代方案比较(如有)

  • 【收尾】总结适用场景 + 一个局限或风险

延伸学习

知识库:反向传播原理深度学习基础。术语:反向传播梯度。工具:PyTorch

常见误区

⚠️ 常见踩坑

误区一:容易答偏的地方:忘记 zero_grad 导致梯度累加;在 backward 后仍用计算图做第二次 backward 未设 retain_graph;混淆 .data 与 .detach() 导致梯度泄漏到不该训练的参数。

追问

追问 1为什么需要 zero_grad?不设会怎样?

PyTorch 的 .grad 是累加缓冲区。若不清零,第二步的梯度会叠在第一步之上,等价于增大 batch size 或错误的学习率,训练发散或行为异常。梯度累积场景则有意隔 N 步才 step 一次。

追问 2loss.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))指定各分量对梯度的贡献,等价于加权求和后再反传。

🔗 相似问题

同一考点的不同问法,换着练更稳

没找到想看的面试题?把你想看的告诉我们 →

延伸学习

按主题分类的相关资源,便于系统复习