Am două variabile, x
și theta
. Eu sunt încercarea de a reduce la minimum pierderea mea cu privire la theta
numai, dar ca parte din pierderea funcției trebuie derivat de o funcție diferită (f
) cu privire la x
. Acest derivat în sine nu este relevant pentru reducerea la minimum, numai producția. Cu toate acestea, atunci când pun în aplicare acest lucru în PyTorch eu sunt obtinerea o eroare de Execuție.
Un minim exemplu este după cum urmează:
# 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()
dă următoarea eroare
RuntimeError: element 0 de tensori nu are nevoie de grad și nu au un grad_fn
Dacă am oferi o analitice derivate (2*theta*x
), acesta funcționează bine:
loss = torch.sum((2*theta*x)**2)
loss.backward()
Există o modalitate de a face acest lucru în PyTorch? Sau sunt eu limitat în vreun fel?
Lasă-mă să știu dacă cineva are nevoie de mai multe detalii.
PS
Mi-am imaginat soluția este ceva similar cu modul în care JAX nu autograd, ca asta este ceea ce eu sunt mai familiarizat cu. Ce vreau să spun aici este că, în JAX cred că ar face doar:
from jax import grad
df = grad(lambda x: f(theta, x))
și apoi df
ar fi doar o funcție care poate fi numit în orice moment. Dar este PyTorch la fel? Sau există un conflict în interiorul .backward()
care provoacă această eroare?
create_graph
argument, pentru că nu vreau să fie incluse în.backward()
apel. În acest caz, de ce nu-l dă-mi o eroare? Nu înțeleg mesajul de eroare.