理解pytorch autograd

max*_*mir 2 pytorch autograd

我试图了解 pytorch autograd 的工作原理。如果我有函数 y = 2x 和 z = y**2,如果我做正态微分,我在 x = 1 处得到 dz/dx 为 8 (dz/dx = dz/dy * dy/dx = 2y*2 = 2 (2x)*2 = 8x)。或者,z = (2x)**2 = 4x^2 并且 dz/dx = 8x,所以在 x = 1 时,它是 8。

如果我对 pytorch autograd 做同样的事情,我会得到 4

x = torch.ones(1,requires_grad=True)
y = 2*x
z = y**2
x.backward(z)
print(x.grad)
Run Code Online (Sandbox Code Playgroud)

哪个打印

tensor([4.])
Run Code Online (Sandbox Code Playgroud)

我哪里错了?

jod*_*dag 5

你用Tensor.backward错了。要获得您要求的结果,您应该使用

x = torch.ones(1,requires_grad=True)
y = 2*x
z = y**2
z.backward()  # <-- fixed
print(x.grad)
Run Code Online (Sandbox Code Playgroud)

调用z.backward()调用反向传播算法,从z计算图中的每个叶节点开始并返回。在这种情况下x是唯一的叶节点。调用后z.backward()计算图被重置,并且.grad每个叶节点的成员都z使用相对于叶节点的梯度(在这种情况下为 dz/dx)更新。

您的原始代码中实际发生了什么?好吧,您所做的是从x. 没有参数x.backward()只会导致x.grad设置为,1因为 dx/dx = 1。附加参数 ( gradient) 实际上是应用于结果梯度的比例。在这种情况下z=4,您将获得x.grad = z * dx/dx = 4 * 1 = 4. 如果有兴趣,您可以查看this以获取有关该gradient参数作用的更多信息。