返回

后向传播的 Python-C++ 调用之路

人工智能

后向传播:从 Python 到 C++ 引擎的调用流程

前一篇 文章中,我们介绍了 PyTorch 的自动微分的基本概念和 反向求导 算法。现在,我们将深入探索后向传播的调用流程,了解 Python 代码是如何与 C++ autograd 引擎无缝衔接的。

Python 代码调用

后向传播的 Python 代码调用过程相对简单。当我们调用 loss.backward() 方法时,PyTorch 将启动反向传播流程:

import torch

# 创建一个张量
x = torch.tensor([1, 2, 3], requires_grad=True)

# 计算损失函数
loss = x.sum()

# 调用后向传播
loss.backward()

loss.backward() 调用中,PyTorch 会根据图计算模式(该模式在正向传播期间自动构建)来计算每个张量的梯度。

进入 C++ autograd 引擎

loss.backward() 调用会将控制权转移到 C++ autograd 引擎,引擎会执行以下步骤:

  1. 反向传播计算: 引擎会按照计算图的反向顺序遍历图中的每个节点,计算每个节点的梯度。梯度使用链式法则计算,根据前一个节点的梯度和当前节点的输出值。

  2. 累积梯度: 每个节点的梯度都会累积到对应的权重张量中。如果权重张量有多个梯度,则会累加这些梯度。

  3. 检查叶子节点: 对于图中的叶子节点(即没有输出依赖项的节点),引擎会将梯度值设置为 1。

  4. 传递梯度: 引擎会将梯度值传递给图中的上游节点,从而继续计算更高层的梯度。

返回 Python

当反向传播流程完成时,引擎会将计算出的梯度返回给 Python 代码。梯度存储在张量中,可以通过 x.grad 访问。

示例

以下示例演示了后向传播的调用流程:

import torch

x = torch.tensor([1, 2, 3], requires_grad=True)
loss = x.sum()
loss.backward()

print(x.grad)  # 输出:tensor([1., 1., 1.])

在这个示例中,反向传播过程会计算 x 中每个元素的梯度,并将其存储在 x.grad 中。

结论

PyTorch 的后向传播调用流程是一个高效且优雅的过程。它允许用户通过简单的 Python 代码调用轻松地进行反向传播,而底层引擎会无缝地处理梯度的计算和传递。通过理解这一流程,我们可以更好地理解 PyTorch 的自动微分功能并将其用于自己的机器学习项目。