PyTorch 自动微分
PyTorch 自动微分功能是其核心特性之一,这使得深度学习模型的训练变得非常便捷和高效。自动微分是通过torch.autograd
模块实现的,这个模块可以通过记录操作记录(即计算图)自动计算导数(梯度)。
以下是一些关于PyTorch自动微分的关键概念:
计算图(Computational Graph):
- 在PyTorch中,每次对张量的操作都会构建一个计算图,这是一个有向无环图,其中节点代表张量,边代表从输入流向输出的函数。
- 计算图用于记录对张量的所有操作,从而支持反向传播来计算梯度。
张量和requires_grad:
- PyTorch中的
Tensor
对象有一个requires_grad
属性,如果这个属性被设置为True
,则PyTorch会自动计算其梯度。 - 当你需要对某个张量进行优化时,比如在训练神经网络时对权重进行优化,你应将这些张量的
requires_grad
设置为True
。
- PyTorch中的
反向传播(Backward):
- 反向传播是自动微分的核心。在损失计算之后,调用
backward()
方法会自动计算所有需要的梯度。 - 计算完梯度后,这些梯度被存储在张量的
grad
属性中。
- 反向传播是自动微分的核心。在损失计算之后,调用
梯度计算:
- 一旦调用了反向传播,PyTorch会通过链式法则(即反向传播算法)自动计算标量相对于所有张量的梯度。
- 为了防止梯度的积累(因为PyTorch中的梯度是累加的),在每次优化步骤结束后通常需要调用
optimizer.zero_grad()
清除梯度,否则下次计算的梯度可能会与之前的混合。
冻结参数:
- 如果你不希望某些张量在反向传播时被计算梯度,可以将这些张量的
requires_grad
设置为False
。 - 通常在迁移学习中,如果想冻结某些层以避免其权重更新时会用到这种技术。
- 如果你不希望某些张量在反向传播时被计算梯度,可以将这些张量的
下面是一个简单的例子,演示如何使用PyTorch的自动微分功能:
import torch
# 创建张量,并开启梯度计算
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
# 执行一些操作
y = x + 2
z = y * y * 2
# 假设z是一个标量并计算其对x的梯度
out = z.mean() # 求z的均值以使得其成为标量
out.backward()
# 查看x的梯度
print(x.grad)
在这个示例中,x.grad
将输出tensor([ 4.6667, 6.6667, 8.6667])
,这些值是out
相对于x
的导数。
PyTorch的自动微分机制使得复杂神经网络模型在训练过程中能够轻松更新参数,极大方便了模型的开发和实验。