Mam dwie zmienne, x
i theta
. Staram się zminimalizować swoje straty w odniesieniu do theta
tylko, ale jako część mojej funkcji strat potrzebuję pochodną innej funkcji (f
) w odniesieniu do x
. Ta pochodna sama w sobie nie ma nic do minimalizacji, tylko do jej wyjścia. Jednak przy realizacji tego w PyTorch pojawia się błąd w czasie wykonywania.
Minimalny przykład wygląda następująco:
# 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)
niezmiennymi tensora([2., 4.])
niezmiennymi tensora([2., 4.])
# define some arbitrary loss as a fn of theta
loss = torch.sum(df(theta, x)**2)
loss.backward()
wydaje następujący błąd
Błąd wykonania: element 0 тензоров nie wymaga odcienie i nie ma grad_fn
Jeśli dam analityczne pochodną (2*theta*x
), to działa świetnie:
loss = torch.sum((2*theta*x)**2)
loss.backward()
Czy istnieje sposób, aby zrobić to w PyTorch? Czy jestem w czymś ograniczony?
Daj mi znać, jeśli komuś potrzebne są dodatkowe szczegóły.
ps
Wyobrażam sobie, że rozwiązanie niż to wygląda na to, jak ДЖАКС sprawia, że автоград, ponieważ to jest to, co już zna. Co mam na myśli tutaj to, że w Джаксе, wierzę, że jesteś po prostu zrobił:
from jax import grad
df = grad(lambda x: f(theta, x))
i następnie df
byłby to po prostu funkcja, którą można wywołać w każdej chwili. Ale czy ПаЙторч tym samym? Czy jest jakiś konflikt wewnątrz .backward()
co powoduje ten błąd?
create_graph
argument, bo nie chcę, aby został on jest w moim.backward()
wyzwanie. W takim razie, dlaczego to wyświetla mi się błąd? Nie rozumiem komunikat o błędzie.