PyTorch:autograd

在 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 机制是自动求导的核心,使得深度学习模型训练变得高效且易于实现! 🚀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值