Mám dvě proměnné, x
a theta
. Snažím se minimalizovat svou ztrátu s ohledem na theta
pouze, ale jako součást mého ztráta funkce potřebuji derivace jiné funkce (f
), s ohledem na x
. Tento derivát sám není relevantní pro minimalizaci, pouze jeho výstup. Nicméně, při provádění tohoto v PyTorch dostávám Runtime error.
Minimální příklad je následující:
# minimal example of two different autograds
import torch
from torch.autograd.functional import jacobian
def f(theta, x):
return torch.sum(theta * x ** 2)
def df(theta, x):
J = jacobian(lambda x: f(theta, x), x)
return J
# example evaluations of the autograd gradient
x = torch.tensor([1., 2.])
theta = torch.tensor([1., 1.], requires_grad = True)
# derivative should be 2*theta*x (same as an analytical)
with torch.no_grad():
print(df(theta, x))
print(2*theta*x)
tenzor([2., 4.])
tenzor([2., 4.])
# define some arbitrary loss as a fn of theta
loss = torch.sum(df(theta, x)**2)
loss.backward()
poskytuje následující chybě
RuntimeError: prvek 0 tenzory nevyžaduje grad a nemá grad_fn
Kdybych poskytnout analytické derivace (2*theta*x
), to funguje v pořádku:
loss = torch.sum((2*theta*x)**2)
loss.backward()
Existuje způsob, jak to udělat v PyTorch? Nebo jsem určitým způsobem omezena?
Dejte mi vědět, pokud někdo potřebuje nějaké další podrobnosti.
PS
Já jsem si představoval, řešení je něco podobného na způsob, že JAX se autograd, jako že je to, co znám. Co chci říct je, že v JAXI věřím, že byste právě dělat:
from jax import grad
df = grad(lambda x: f(theta, x))
a pak df
by být jen funkce, která může být volána v libovolném bodě. Ale je PyTorch stejné? Nebo je tam nějaký konflikt uvnitř .backward()
to způsobuje tuto chybu?
create_graph
argument, protože nechci, aby to bylo zahrnuto v.backward()
volání. V tomto případě, proč to dej mi chybu? Nechápu chybová zpráva.