gpt4 book ai didi

deep-learning - Pytorch 二阶导数返回 None

转载 作者:行者123 更新时间:2023-12-02 03:38:31 24 4
gpt4 key购买 nike

我无法对以下函数求二阶导数。当我想要关于 u_s 的二阶导数时,它可以工作,但对于 x_s ,它不起作用。

有人知道我在这里做错了什么吗?

def cost(xt, x_goal, u, Q, R):
return (xt - x_goal).matmul(Q).matmul((xt - x_goal).transpose(0,1)) + u.matmul(R).matmul(u)

x_s = tr.tensor([ 0.0000, -1.0000, 0.0000], dtype=torch.float64, requires_grad=True)
u_s = tr.tensor([-0.2749], dtype=torch.float64, requires_grad=True)
c = cost(x_s, x_Goal, u_s, tr.tensor(Q), tr.tensor(R))

c
output:
tensor([[4.0076]], dtype=torch.float64, grad_fn=<ThAddBackward>)

Cu = grad(c, u_s, create_graph=True)[0]
Cu
output:
tensor([-0.0550], dtype=torch.float64, grad_fn=<ThAddBackward>)

Cuu = grad(Cu, u_s, allow_unused=True)[0]
Cuu
output:
tensor([0.2000], dtype=torch.float64)

Cux = grad(Cu, x_s, allow_unused=True)
Cux
output:
(None,)

我猜测 Cu 本身完全独立于 x_s,但是导数至少应该为零,而不是 None!

最佳答案

你没有做错任何事。

假设我有变量 xyz=f(y)。如果我计算 z.backward(),然后尝试询问相对于 x 的梯度,我会得到 None。例如,

import torch

x = torch.randn(1,requires_grad=True)
y = torch.randn(1,requires_grad=True)

z = y**2
z.backward()
print(y.grad) # Outputs some non-zero tensor
print(x.grad) # None

那么这与您尝试计算二阶导数 Cux 有什么关系?当您编写 create_graph=True 时,PyTorch 会跟踪计算 Cu 的导数计算中的所有操作,并且由于导数本身由原始操作组成,因此您可以计算梯度的梯度,就像你正在做的那样。这里的问题是梯度 Cu 永远不会遇到变量 x_s,因此实际上是 Cu = f(u_s)。这意味着,当您执行 Cu.backward() 时,Cu 的计算图永远不会看到变量 x_s,因此它的渐变类型仍然是 None,就像上面的示例一样。

关于deep-learning - Pytorch 二阶导数返回 None,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56397270/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com