文章目录
问题1:PyTorch中的Autograd机制是如何实现的?
Autograd是PyTorch的自动求导引擎 :根据前向计算自动构建计算图 ,在backward()时按该图反向传递梯度,无需手动写倒数。
bash
计算图:用图结构表示计算过程的数据结构。节点:Tensor/操作;边:数据流向;
动态图:计算图在运行时即使生成,边forward,边画计算图;
详细理解
(1)核心机制
PyTorch Autograd是基于动态图+计算图的自动求导系统;
- 前向传播时:每forward一下,就在该图上构建一个新节点(Tensor + grad_fn);
- 反向传播时:从loss出发,沿着该计算图按链式法则逐个节点回传梯度。
(2)前向生成的计算图本质
- 节点:Tensor(包含data、grad、grad_fn);
- 边:由函数执行后形成的Tensor之间的"数据依赖关系";
- requires_grad=True的Tensor会被纳入图;
- 叶子节点(输入Tensor):不由其他Tensor生成,没有.grad_fn;
(3)反向传播机制
bash
hidden states
↓
lm_head(线性层)
↓
logits
↓
softmax + cross entropy
↓
loss
- 从loss.backward()开始
- 逐个调用grad_fn.backward()
- 链式法则
- 多分支路径:梯度累加
- 传播到叶子节点停止;
问题2:torch.autograd.Function怎么用?(工作原理)
它是用来定义"自定义可微算子",本质就是通过它来自己手写一个算子的前向和反向。
python
# 自定义算子继承autograd子类
class YourFunction(torch.autograd.Function):
# 重写autograd子类方法
forward(ctx, *inputs)
# 执行前向计算
# 用ctx.save_for_backward()保存反向需要用到的中间变量
backward(ctx, grad_output)
# 接收上游梯度
# 返回对每个输入的梯度(与foward输入一一对应)
调用方式:YourFunction.apply(输入) -> 自动绑定计算图 + 生成grad_fn
问题3:与nn.Module的区别?
nn.Module不参与反向传播规则定义,它是调用Function的集合体!
从上到下依次是子集关系:
| 组件 | 作用 |
|---|---|
| Module | 组织结构 + 参数 |
| Function | 单个算子的 forward/backward |
| Autograd | 自动构建计算图 |