认识 PyTorch:张量、自动微分与模型的关系
阅读 PyTorch 源码:backward 与 autograd.grad
沿着 accumulate_grad 参数解释存储梯度与返回梯度的差异。
阅读 PyTorch 源码:backward 与 autograd.grad知识学习CN编辑简报更新 2026-09-23
你将学会
- 先比较 API 契约
- 找到引擎调用位置
- 限定示例能证明什么
开始前需要
- 基本 Python 与微积分知识
- 供后续练习使用的独立环境
把数学预期与实际输出分开记录,用可解释的失败帮助学习。
先看结论
- backward 会存储梯度。
- grad 返回请求的导数。
- 数学预期不是运行结果。
先比较 API 契约
backward 通常把导数累加进叶子的 grad 字段,而 autograd.grad 返回请求输入的导数。选择接口前,先决定下一步代码需要从哪里读取结果。
这一区别适合用 x 的平方来检查。令 x 为 3,导数应为 6;使用 autograd.grad 获取结果后,x.grad 的预期仍然是 None。
找到引擎调用位置
固定提交中的普通 grad 路径传入 accumulate_grad=False,backward 路径传入 True。阅读这些调用参数能够把公开契约与实现入口联系起来。
仓库主分支的接口可能与本机安装版本不同,包括新加入的重载形式。请同时记录源码提交和运行包版本,不要把两套接口混在一个复现结论中。
限定示例能证明什么
下方代码尚未运行,6 和 None 是根据微积分与接口契约写出的预期。运行后应另外记录实际输出,不要把注释里的答案当成实验记录。
抽取 Python 入口也不能替代原生自动微分测试。若要研究高阶导数、批量向量积或设备差异,需要另设明确的样例与正确性标准。
如何选择
| 比较维度 | 方案 A | 方案 B |
|---|---|---|
| Best when | You need predictable behavior and easy auditing | You need adaptive optimization and have reliable telemetry |
| Main risk | May leave performance on the table | Can become difficult to explain or debug |
实施步骤
- 1
确定需要字段存储还是返回值。
- 2
重复求导前检查累加状态。
- 3
对照实际安装版本验证。
可复制示例
python
import torch
x = torch.tensor(3.0, requires_grad=True)
(g,) = torch.autograd.grad(x*x, x)
print(g, x.grad) # 数学预期:6 和 None常见问题
为什么 grad 调用后 x.grad 是 None?
该接口返回导数,不把结果累加到这个字段。
这里测试过原生引擎吗?
没有,这是固定源码分析及未执行的标量练习。
资料来源
- PyTorch / torch/autograd/__init__.py来源核查 2026-09-23