Cum folosesc autograd pentru o funcție separată, independentă de backpropagate în PyTorch?

0

Problema

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?

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

Cel mai bun răspuns

0

PyTorch e jacobian nu crea un calcul grafic excepția cazului în mod explicit cere pentru el

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

.. cu create_graph argument.

Documentația este destul de clar despre asta

create_graph (bool, opțional) – Dacă este Adevărat, Jacobian va fi calculată într-un mod derivabila

2021-11-12 14:55:57

Da m-am uitat la asta, dar n-am prea înțeles. Cred că asta înseamnă că nu doriți să utilizați 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.
Danny Williams

Ceea ce încearcă să facă este, în principiu de diferențiere prin operațiuni de jacobian. În acest caz, aveți nevoie pentru a le-au construit ca un grafic. Fără create_graph, jacobian nu va crea un grafic agățat de loss (puteți verifica loss.grad_fn este gol - prin urmare eroarea)
ayandas

În alte limbi

Această pagină este în alte limbi

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