核心要点

  • .grad 存储反向传播得到的梯度

  • 仅 requires_grad=True 的叶子张量有 .grad

  • 理解累加机制与 zero_grad 的关系

  • 知道 .grad 与 .data 的区别

简要回答

PyTorch 中 .grad 属性保存该张量对损失的偏导数,反向传播后优化器读取 .grad 更新参数;非叶子节点梯度默认不保留,训练前需 zero_grad 清零。

标准回答

一、先把结论讲清楚

PyTorch 中,.grad 是张量的梯度缓冲区,存储 ∂loss/∂tensor。

二、要点

  • requires_grad=True 且为叶子节点(用户创建或 nn.Parameter)的张量默认保留 .grad
  • 调用 loss.backward() 后,梯度累加.grad(同 shape、同 dtype)
  • optimizer.step() 读取 .grad 更新 .data
  • 非叶子节点梯度在 backward 后默认释放以省内存;需 retain_grad() 才保留
    示例代码可以这样理解:
    w = torch.randn(3, 3, requires_grad=True)
    loss = w.sum()
    loss.backward()
    print(w.grad) # 全 1 矩阵

三、与

.data**:.data 是值本身(旧 API 易误用);应使用 .detach() 获无梯度副本。手动改 .data 可能破坏 Autograd 一致性。
调试:torch.nn.utils.clip_grad_norm_ 裁剪 .grad 防爆炸;param.grad is None 说明未 backward 或不是叶子。详见 反向传播原理

面试里不要只停在公式或名词,可以补 PyTorch 张量的 .grad 属性有什么作用 对训练稳定性、泛化、收敛速度或显存/算力的影响。再说明一个常见调参或排错场景,面试官会更容易判断你真的用过这些方法。

回答思路

  • 【定义】用一句话说清「PyTorch 张量的 .grad 属性有什么作用」

  • 【原理】讲清关键机制或步骤(2~3 点)

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

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

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

延伸学习

工具:PyTorch。术语:梯度反向传播。知识库:反向传播原理

常见误区

⚠️ 常见踩坑

误区一:容易答偏的地方:以为每次 backward 会覆盖 .grad;对非 requires_grad 张量期待 .grad;用 .data 改权重导致版本计数错误。

追问

追问 1为什么非叶子节点默认不存 .grad?

中间激活数量巨大,全保留显存爆炸。通常只需参数梯度;若需对中间层梯度(如可解释性),用 register_hook 或 retain_grad()。

追问 2backward 后 .grad 会自动清零吗?

不会,这是累加设计,方便梯度累积。必须 optimizer.zero_grad() 或 tensor.grad.zero_() 手动清零。

追问 3能对 .grad 手动赋值吗?

可以,如自定义优化或元学习时手动设 grad;一般交给 autograd。注意 dtype/device 与参数一致。

🔗 相似问题

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

延伸学习

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