动态计算图(PyTorch)

动态计算图

动态计算图是一种编程模型,特别适用于深度学习框架PyTorch中。在动态计算图中,每一步操作(比如矩阵乘法、加法、神经网络层的前向传播)都会即时构建并执行一个“子图”,这个子图会随着代码的运行而动态地变化。这意味着当你在程序中修改了数据或者改变了计算流程时,计算图也会相应的更新。相比之下,静态计算图在执行前需要预先定义完整的计算流程,然后后运行时依次执行所有操作,不支持事实改变计算结构。通过这段代码,可以看到PyTorch中的动态图是如何随代码执行顺序动态构建,并能够自动追踪计算历史来完成梯度计算的过程。这种灵活性使得研究者和开发者可以更加直观和便捷地调试和实验不同的模型架构和优化策略。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import torch

# 创建一个张量,并设置requires_grad True表示关心它的梯度
x = torch.tensor(2.0, requires_grad=True)
print(f'原始张量x: {x}')

# 动态计算过程开始,首先进行一个乘法运算
y = x * 2
print(f'张量y是x的2倍: y = {y}')

# 接着进行另一个乘法运算
z = y * 3
print(f'张量z是y的3倍:z = {z}')

# 此时,尽管我们没有明确定义一个固定的计算图,但PyTorch内部已经记录了x到z的完整计算路径
# 计算损失(这里假设z是我们要优化的目标函数的一部分)
loss = z.sum()

# 反向传播以计算梯度
loss.backward() # 这会自动沿着动态生成的计算图反向传播求梯度

# 输出x的梯度,它使整个链式法则计算的结果
print(f'张量x的梯度:x.grad = {x.grad}')

# x.grad应该是6, 因为dz/dx = dz/dy * dy/dx = 3 * 2

结果输出为:

1
2
3
4
原始张量x: 2.0
张量y是x的2倍: y = 4.0
张量z是y的3倍:z = 12.0
张量x的梯度:x.grad = 6.0