在 PyTorch 中,autograd
是一个自动微分(Automatic Differentiation)引擎,它可以自动计算张量的梯度,在深度学习模型训练时非常重要。
1. 基本概念
(1)requires_grad
在 PyTorch 中,每个张量 (torch.Tensor
) 都有一个 requires_grad
属性,默认是 False
。如果 requires_grad=True
,则 PyTorch 会追踪对该张量的所有操作,并在反向传播时自动计算梯度。
import torch
x = torch.tensor(2.0, requires_grad=True)
y = x ** 2 # y = x^2
y.backward() # 计算梯度 dy/dx
print(x.grad) # 输出 4.0
解释:
y = x^2
,因此dy/dx = 2x = 2*2 = 4
,所以x.grad == 4.0
。
(2)计算图(Computation Graph)
PyTorch 通过 动态计算图(Dynamic Computation Graph) 追踪张量的操作。当 requires_grad=True
时,PyTorch 会记录所有计算历史,并建立计算图。
a = torch.tensor(3.0, requires_grad=True)
b = torch.tensor(4.0, requires_grad=True)
c = a * b # c 依赖于 a 和 b
c.backward() # 计算梯度
print(a.grad) # dc/da = b = 4
print(b.grad) # dc/db = a = 3
2. 梯度计算
(1)backward()
在标量(单个数值)张量上调用 backward()
,PyTorch 会自动计算它对所有 requires_grad=True
张量的梯度。
x = torch.tensor(5.0, requires_grad=True)
y = x ** 3 # y = x^3
y.backward() # 计算 dy/dx
print(x.grad) # dy/dx = 3x^2 = 3*(5^2) = 75
(2)非标量梯度
如果 y
不是一个标量(例如一个张量),backward()
需要一个 gradient
参数,用于指定每个元素的梯度权重。
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
y = x ** 2 # y = [1, 4, 9]
gradient = torch.tensor([1.0, 1.0, 1.0]) # 设定权重
y.backward(gradient) # 计算梯度
print(x.grad) # dy/dx = 2x -> [2, 4, 6]
3. 控制计算图
(1)detach()
detach()
方法可以从计算图中分离一个张量,不再追踪其梯度。
x = torch.tensor(2.0, requires_grad=True)
y = x * 3
z = y.detach() # z 不会被追踪
print(z.requires_grad) # False
(2)with torch.no_grad()
在某些情况下(如推理),我们不希望计算梯度,可以使用 torch.no_grad()
。
x = torch.tensor(3.0, requires_grad=True)
with torch.no_grad():
y = x ** 2 # y 不会被追踪
print(y.requires_grad) # False
4. 清除梯度
在每次反向传播之前,应该清除之前的梯度,否则会累积。
optimizer.zero_grad() # 清除梯度
或者直接:
x.grad.zero_() # 清除 x 的梯度
5. 高阶梯度
如果 create_graph=True
,可以计算更高阶的梯度。
x = torch.tensor(2.0, requires_grad=True)
y = x ** 3 # y = x^3
grad_y = torch.autograd.grad(y, x, create_graph=True)[0] # dy/dx = 3x^2
grad_y.backward() # 计算 d^2y/dx^2
print(x.grad) # 6x = 6*2 = 12
总结
requires_grad=True
使 PyTorch 追踪计算并支持自动求导。backward()
计算梯度,非标量张量需要手动传入gradient
。detach()
和torch.no_grad()
可用于禁用梯度计算,适用于推理阶段。zero_grad()
在每次训练迭代前清除梯度,防止累积。autograd.grad()
允许更细粒度控制梯度计算。
PyTorch 的 autograd
机制是自动求导的核心,使得深度学习模型训练变得高效且易于实现! 🚀