简要回答
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 点)
【例子】举一个真实项目、论文或产品中的例子
【对比】与易混淆概念或替代方案比较(如有)
【收尾】总结适用场景 + 一个局限或风险
常见误区
⚠️ 常见踩坑
误区一:容易答偏的地方:以为每次 backward 会覆盖 .grad;对非 requires_grad 张量期待 .grad;用 .data 改权重导致版本计数错误。
🔗 相似问题
同一考点的不同问法,换着练更稳
延伸学习
按主题分类的相关资源,便于系统复习
