Ako môžem použiť autograd pre samostatnú funkciu nezávislé backpropagate v PyTorch?

0

Otázka

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?

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

Najlepšiu odpoveď

0

PyTorch je jacobian nie je vytvoriť výpočty graf pokiaľ ste explicitely opýtať na to

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

.. s create_graph argument.

Dokumentácia je úplne jasné, o to

create_graph (bool, nepovinné) – Ak je Pravda, Jacobian bude vypočítaný v differentiable spôsobom

2021-11-12 14:55:57

Áno, díval som sa do toho, ale nechcel som naozaj pochopiť. Myslím, že to znamená, že nechcem použiť 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.
Danny Williams

To, čo sa snažíte urobiť, je v podstate rozlišovaní prostredníctvom činnosti jacobian. V tomto prípade, musíte mať ich postavený ako graf. Bez create_graph, jacobian nebude vytvoriť graf visí od loss (môžete skontrolovať loss.grad_fn je prázdny - teda chyba)
ayandas

V iných jazykoch

Táto stránka je v iných jazykoch

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