Python 为什么f(x)对';x'';x';而不是皮托克的1号?
我试图完整地理解pytorch的自动签名,但我遇到了一个问题:让f(x)=x,从基础数学我们知道f'(x)=1,但是当我在pytorch中做这个练习时,我得到了f'(x)=xPython 为什么f(x)对';x'';x';而不是皮托克的1号?,python,pytorch,derivative,Python,Pytorch,Derivative,我试图完整地理解pytorch的自动签名,但我遇到了一个问题:让f(x)=x,从基础数学我们知道f'(x)=1,但是当我在pytorch中做这个练习时,我得到了f'(x)=x z=torch.linspace(-1,1,steps=5,requires_grad=True) y=z y、 向后(z) print(“Z张量为:{}\n y相对于Z的梯度为:{}”。格式(Z,Z.grad)) 我希望得到一个大小为5的张量,满满的是1,但我得到的是: Z tensor is: tensor([-1.
z=torch.linspace(-1,1,steps=5,requires_grad=True)
y=z
y、 向后(z)
print(“Z张量为:{}\n y相对于Z的梯度为:{}”。格式(Z,Z.grad))
我希望得到一个大小为5的张量,满满的是1,但我得到的是:
Z tensor is: tensor([-1.0000, -0.5000, 0.0000, 0.5000, 1.0000], requires_grad=True)
Gradient of y with respect to z is: tensor([-1.0000, -0.5000, 0.0000, 0.5000, 1.0000])
为什么这是pytorch的行为?在与同事讨论后,他发现“backward()”方法实际上是将z处计算的梯度乘以z本身。这对于神经网络应用是有意义的。下面是理解这一点的简短代码片段:
z = torch.linspace(1, 5, steps=5, requires_grad=True)
y = torch.pow(z,2)
y.backward(z)
print("Z tensor is: {} \n Gradient of y with respect to z is: {}".format(z, z.grad/z))
输出为:
Z tensor is: tensor([1., 2., 3., 4., 5.], requires_grad=True)
Gradient of y with respect to z is: tensor([ 2., 4., 6., 8., 10.], grad_fn=<DivBackward0>)
Z张量是:张量([1,2,3,4,5.],需要_grad=True)
y相对于z的梯度是:张量([2,4,6,8,10],梯度fn=)
在这种情况下,您可以看到z.grad除以z是z的实际预期梯度,即2*z。首先,给定
z=torch.linspace(-1,1,steps=5,requires_grad=True)
和y=z
,函数是向量值函数,因此,y
w.r.tz
的导数不像1
那么简单,而是一个雅可比矩阵。实际上,在你的例子中,z=[z1,z2,z3,z4,z5]T
,大写的T
意味着z
是一个行向量。官方文件是这样说的:
第二,注意官方文件说:现在在这个例子中y不再是标量。torch.autograd无法直接计算完整的雅可比矩阵,但如果我们只需要向量雅可比矩阵积,只需将向量作为参数向后传递即可。在这种情况下,x.grad
不是实际的梯度值(矩阵),而是向量雅可比积
编辑:
如果输出y
为标量,则x.grad
为实际梯度。
请参见此处的示例:
z = torch.linspace(-1, 1, steps=5, requires_grad=True)
y = torch.sum(z)
y.backward()
z.grad
这将输出:
tensor([1., 1., 1., 1., 1.])
如你所见,这是梯度。请注意唯一的区别是,y
在这里是标量值,而在您的示例中是向量值grad只能为标量输出隐式创建
您可能想知道,如果梯度不是一个常数,比如在本例中依赖于输入z
,该怎么办
z = torch.linspace(-1, 1, steps=5, requires_grad=True)
y = torch.sum(torch.pow(z,2))
y.backward()
z.grad
输出为:
tensor([-2., -1., 0., 1., 2.])
这和
z = torch.linspace(-1, 1, steps=5, requires_grad=True)
y = torch.sum(torch.pow(z,2))
y.backward(torch.tensor(1.))
z.grad
blitz教程有点简短,所以初学者很难理解。谢谢!我以前读过文档,但我不完全确定它的意思。我认为将向量雅可比积称为“梯度”有点误导。