Math-06.矩阵微积分-10.PyTorch自动微分

本页说明 PyTorch autograd 如何实现 04 反向传播,以及如何自定义梯度

段末注释autograd(automatic differentiation,自动微分)通过追踪 requires_grad=True 张量上的运算构建 DAG,调用 backward() 自动执行反向模式求导。

系列入口00.系列规划 | 前置:04 反向传播06 层梯度手册


1. 核心机制(D2–D3)

图 1 Tensor + Function 链

概念 说明
Tensor 数据 + requires_grad 标志
Function 每个运算对应 forward/backward
grad_fn 指向创建该 tensor 的 Function
.grad 叶子节点累积梯度
backward() 从标量 loss 反向

叶子节点:用户创建且 requires_grad=True 的参数(nn.Parameter 默认)。


2. 常用 API(D7)

图 2 backward 与 retain_graph

1
2
3
4
5
6
7
8
loss.backward()                    # 默认 grad 累加到 .grad
optimizer.zero_grad(set_to_none=True) # 每步清零

torch.autograd.grad(loss, w) # 返回梯度,不写入 .grad
loss.backward(retain_graph=True) # 同一图多次 backward

with torch.no_grad(): # 推理,不建图
y = model(x)

detach():返回同数据无梯度 tensor,阻断反向。


3. 自定义 Function(D3–D7)

图 3 继承 autograd.Function

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import torch

class MySquare(torch.autograd.Function):
@staticmethod
def forward(ctx, x):
ctx.save_for_backward(x)
return x ** 2

@staticmethod
def backward(ctx, grad_output):
x, = ctx.saved_tensors
return grad_output * 2 * x # d(x^2)/dx = 2x

square = MySquare.apply
x = torch.tensor(3.0, requires_grad=True)
y = square(x)
y.backward()
print(x.grad) # 6.0

ctx.save_for_backward 存 forward 中间量;backward 返回与 forward 输入同数量的梯度。


4. gradcheck(D8)

图 4 数值 vs 解析梯度

1
2
3
4
from torch.autograd import gradcheck

x = torch.randn(3, requires_grad=True, dtype=torch.float64)
test = gradcheck(lambda a: (a ** 3).sum(), x, eps=1e-6, atol=1e-4)

注意:用 float64;自定义层开发必测。


5. 与训练循环(D6)

衔接 Math-04

1
2
3
4
5
6
for batch in loader:
optimizer.zero_grad(set_to_none=True)
loss = model(batch)
loss.backward()
torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0)
optimizer.step()

6. 局限(D8)

问题 说明
非可微 op 次梯度;ReLU 在 0 处
高阶导 create_graph=True
内存 存全图 → checkpoint 重算
@once_differentiable 二阶仅一次

7. 小结

autograd = 动态计算图 + 每 op 注册 backward。Attention 自定义见 20 专篇

系列导航06 层梯度 | Math-04 优化

-------------本文结束感谢您的阅读-------------