PyTorch 笔记

2025-06-24 14:20 更新

本教程将详细讲解 PyTorch 的自动求导机制和相关操作。

一、自动求导机制

PyTorch 的自动求导机制是其核心功能之一,能够自动计算张量操作的梯度。这使得开发者可以轻松地构建和训练神经网络,而无需手动实现反向传播算法。

(一)requires_grad 属性

每个张量都有一个 requires_grad 属性,用于指定是否需要计算该张量的梯度。如果某个操作的输入张量中有一个或多个的 requires_grad 属性为 True,则输出张量的 requires_grad 属性也将为 True。反之,只有当所有输入张量的 requires_grad 属性都为 False 时,输出张量的 requires_grad 属性才会为 False

示例:

import torch


x = torch.randn(5, 5)
y = torch.randn(5, 5)
z = torch.randn((5, 5), requires_grad=True)


a = x + y
print(a.requires_grad)  # 输出:False


b = a + z
print(b.requires_grad)  # 输出:True

这一特性在微调预训练模型时非常有用。可以通过设置 requires_grad 属性来冻结模型的部分参数,从而只训练特定的层。

model = torchvision.models.resnet18(pretrained=True)


for param in model.parameters():
    param.requires_grad = False


model.fc = nn.Linear(512, 100)


optimizer = optim.SGD(model.fc.parameters(), lr=1e-2, momentum=0.9)

(二)计算图的构建与释放

PyTorch 的自动求导机制通过构建计算图来记录张量操作。在前向传播过程中,每个操作都会被记录下来,形成一个有向无环图(DAG)。图中的节点表示操作,边表示张量数据的流动。完成前向传播后,可以通过反向传播沿着计算图计算梯度。

在内部实现中,计算图由 Function 对象构成。每个 torch.Tensor 对象都有一个 .grad_fn 属性,指向计算图中的一个节点,表示该张量的梯度计算函数。

需要注意的是,每次迭代都会重新构建计算图。这使得 PyTorch 能够灵活地处理动态计算图,支持任意的 Python 控制流语句。

(三)就地操作的注意事项

在 PyTorch 中,就地操作(即直接修改张量数据的操作)可能会导致问题。因为自动求导机制需要保存中间结果来计算梯度,而就地操作可能会覆盖这些中间结果。

此外,实现就地操作的 Function 需要正确处理所有输入张量的版本计数器,以确保计算图的正确性。每个张量都有一个版本计数器,每次被标记为脏时都会增加。在反向传播过程中,会检查保存的张量版本计数器,如果发现不一致则会引发错误。

(四)性能优化与调试技巧

了解自动求导机制可以帮助开发者编写更高效的代码。例如,可以通过设置 requires_grad 属性来减少不必要的梯度计算,从而提高性能。

同时,在调试过程中,可以利用自动求导机制检查梯度的计算是否正确。例如,可以通过打印张量的 .grad 属性来验证梯度是否按预期更新。

二、总结

自动求导机制是 PyTorch 的核心功能之一,为开发者提供了极大的便利。通过理解和运用自动求导机制,可以更高效地构建和训练神经网络。

在编程狮(W3Cschool)平台上,你可以找到更多关于 PyTorch 自动求导机制的详细教程和示例代码,帮助你深入理解和应用这一强大功能。

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号