Mám dve premenné, x
a theta
. Snažím, aby sa minimalizovalo moje straty s ohľadom na theta
len, ale ako súčasť môjho strata funkcie potrebujem odvodený z inej funkcie (f
) s ohľadom na x
. Tento derivát sám nie je relevantný pre minimalizáciu, len jeho výstup. Avšak, pri plnení tohto v PyTorch som dostať chyba v režime Runtime.
Minimálne príklad je nasledovný:
# 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)
tensor([2., 4.])
tensor([2., 4.])
# define some arbitrary loss as a fn of theta
loss = torch.sum(df(theta, x)**2)
loss.backward()
poskytuje sa nasledujúce chybové
RuntimeError: element 0 ansi nevyžaduje grad a nemá grad_fn
Ak by som uviesť analytickým derivátové (2*theta*x
), to funguje:
loss = torch.sum((2*theta*x)**2)
loss.backward()
Existuje spôsob, ako robiť to v PyTorch? Alebo som žiadnym spôsobom obmedzené?
Dajte mi vedieť, ak niekto potrebuje žiadne ďalšie podrobnosti.
PS
Ja som si predstavoval, riešenie je niečo podobné tak, že JAX sa autograd, ako to je to, čo som viac oboznámení s. Čo mám na mysli je, že tu v JAX verím, že by ste to jednoducho urobiť:
from jax import grad
df = grad(lambda x: f(theta, x))
a potom df
len by byť funkcie, ktoré môžu byť volané na ľubovoľnom mieste. Ale je PyTorch rovnaké? Alebo je tam nejaký konflikt v .backward()
že spôsobuje to chyba?
create_graph
argument, pretože nechcem byť zahrnuté v mojom.backward()
hovor. V tomto prípade, prečo sa mi chybu? Nerozumiem chybové hlásenie.