Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么f(x)对';x'';x';而不是皮托克的1号?_Python_Pytorch_Derivative - Fatal编程技术网

Python 为什么f(x)对';x'';x';而不是皮托克的1号?

Python 为什么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.

我试图完整地理解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.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.t
z
的导数不像
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教程有点简短,所以初学者很难理解。

谢谢!我以前读过文档,但我不完全确定它的意思。我认为将向量雅可比积称为“梯度”有点误导。