了解 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
我想了解 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