PyTorch的autograd库的原理主要基于反向模式的自动微分(Reverse Mode Automatic Differentiation),即反向传播。
在PyTorch中对tensor进行操作时,autograd库会在内部为这些操作创建一个计算图(computation graph)。这个计算图记录了从输入到输出的所有计算步骤。需要计算梯度时,autograd库会沿着这个计算图反向传播,从输出开始,逐步计算每个中间变量的梯度,直到达到我们关心的变量(如模型的参数)。
在PyTorch中,每个tensor都有一个requires_grad
属性,当这个属性设置为True
时,autograd就会开始追踪该tensor上的所有操作。一旦完成了前向计算并得到了一个标量损失值,就可以调用loss.backward()
来自动计算梯度。这个过程就是反向传播,它会根据计算图反向地计算每个tensor的梯度,并将结果存储在tensor的.grad
属性中。
tensor的requires_grad
属性并不是默认的。当创建一个新的tensor时,requires_grad
属性默认是False
。这意味着,除非明确指定,否则PyTorch不会追踪这个tensor上的操作以用于后续的梯度计算。
创建一个不追踪梯度的tensor:
import torch
# 默认情况下,requires_grad=False
x = torch.tensor([1.0, 2.0, 3.0])
print(x.requires_grad) # 输出:False
如果想让PyTorch追踪这个tensor上的操作以计算梯度,需要在创建tensor时将requires_grad
设置为True
:
# 设置requires_grad=True来追踪梯度
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
print(x.requires_grad) # 输出:True
如果已经有一个设置了requires_grad=True
的tensor,但想在某个操作中停止追踪,可以使用torch.no_grad()
上下文管理器:
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
# 在此上下文内,不会追踪梯度
with torch.no_grad():
y = x * 2 # 这里对y的操作不会被追踪,因此y.requires_grad将是False
print(y.requires_grad) # 输出:False
使用torch.no_grad()
可以在评估模型、加载预训练权重或执行其他不需要梯度追踪的操作时提高效率。同时,它也可以防止在不需要时意外地创建计算图,从而节省内存和计算资源。