Jak korzystać z autograd do osobnej funkcji, niezależną od odwróconej dystrybucji w PyTorch?

0

Pytanie

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?

autograd gradient python pytorch
2021-11-12 11:56:03
1

Najlepsza odpowiedź

0

ПыТорхаjacobian nie tworzy obliczeniowy harmonogram, jeśli wyraźnie nie poprosisz o tym

J = jacobian(lambda x: f(theta, x), x, create_graph=True)

.. z create_graph argument.

W dokumentacji o tym dość wyraźnie

create_граф (bool, opcjonalnie) – Jeśli wartość True, якобиан będzie obliczona дифференцируемым sposób

2021-11-12 14:55:57

Tak, studiowałem to, ale ja naprawdę nie rozumiał. Myślę, że to oznacza, że nie chcę używać 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.
Danny Williams

To, co próbujesz zrobić, w zasadzie zróżnicowana jest za pomocą operacji якобианца. W tym przypadku trzeba, aby zostały one zbudowane w postaci wykresu. Bez create_graph, якобиан nie stworzy harmonogram, który zawisł na loss (można sprawdzić loss.grad_fn pusto - stąd błąd)
ayandas

W innych językach

Ta strona jest w innych językach

Русский
..................................................................................................................
Italiano
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................