认识 PyTorch:张量、自动微分与模型的关系
PyTorch 自动微分架构:前向记录与反向执行
从 Python 入口理解梯度流向,避免把局部源码阅读当成完整引擎审计。
PyTorch 自动微分架构:前向记录与反向执行知识学习CN编辑简报更新 2026-09-23
你将学会
- 前向计算留下什么
- Python 入口的职责
- 图与状态需要分别管理
开始前需要
- 基本 Python 与微积分知识
- 供后续练习使用的独立环境
把数学预期与实际输出分开记录,用可解释的失败帮助学习。
先看结论
- 入口源码不代表整个原生引擎。
- 保留计算图与创建导数图不同。
- 新图不会自动清空旧梯度。
前向计算留下什么
可求导运算建立导数计算所需的关系。对标量损失执行反向传播时,系统沿这些关系计算梯度;每个运算的形状和依赖都会影响结果。
应区分参与计算的张量与需要保存梯度的叶子。看到一个中间值参与运算,不代表它默认就会把导数保存在自己的 grad 字段中。
Python 入口的职责
检查的 backward 入口先整理输入和梯度参数,再调用执行引擎,并将 accumulate_grad 设置为 True。这里关注的是入口契约,没有展开原生引擎内部调度。
retain_graph 的默认值跟随 create_graph。前者涉及已有图的保留,后者涉及为导数继续建立可微计算,两个参数不能当成同义开关。
图与状态需要分别管理
参数梯度的清理与计算图的生命周期是不同问题。重新前向计算可以产生新图,但不会自动替你清空已经累加在叶子上的梯度。
官方入口文档提醒,backward 配合 create_graph 可能形成引用环。只有确实需要高阶导数时才引入这些选项,并检查所用版本的文档与内存行为。
如何选择
| 比较维度 | 方案 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
检查 Python 入口传给引擎的参数。
- 3
分别管理图生命周期与梯度状态。
可复制示例
text
forward operations -> loss
backward(..., accumulate_grad=True) -> leaf .grad
fresh forward != automatic gradient reset常见问题
retain_graph 等于 create_graph 吗?
不等于,它们分别控制图保留和导数计算的可微图。
这里审计了所有后端吗?
没有,只检查固定版本的 Python 自动微分入口。
资料来源
- PyTorch / torch/autograd/__init__.py来源核查 2026-09-23