了解 pytorch autograd

Understanding pytorch autograd

我想了解 pytorch autograd 的工作原理。如果我有函数 y = 2x 和 z = y**2,如果我做正常微分,我得到 dz/dx at x = 1 as 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)

打印

tensor([4.])

我哪里错了?

您使用的 Tensor.backward 有误。要获得您要求的结果,您应该使用

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

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。如果有兴趣,您可以查看 以了解有关 gradient 参数作用的更多信息。

如果你对pytorch中的autograd还有一些困惑,请参考: 这将是基本的异或门表示

import numpy as np
import torch.nn.functional as F
inputs = torch.tensor(
                [
                    [0, 0],
                    [0, 1],
                    [1, 0],
                    [1, 1]
                ]
            )
outputs = torch.tensor(
                [
                    0,
                    1,
                    1,
                    0
                ],
        )
weights = torch.randn(1, 2)
weights.requires_grad = True #set it as true for gradient computation

bias = torch.randn(1, requires_grad=True) #set it as true for gradient computation

preds = F.linear(inputs, weights, bias) #create a basic linear model
loss = (outputs - preds).mean()
loss.backward()
print(weights.grad) # this will print your weights