Jak mohu použít autograd pro samostatnou funkci, nezávislou na backpropagate v PyTorch?

0

Otázka

Mám dvě proměnné, x a theta. Snažím se minimalizovat svou ztrátu s ohledem na theta pouze, ale jako součást mého ztráta funkce potřebuji derivace jiné funkce (f), s ohledem na x. Tento derivát sám není relevantní pro minimalizaci, pouze jeho výstup. Nicméně, při provádění tohoto v PyTorch dostávám Runtime error.

Minimální příklad je následující:

# 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)

tenzor([2., 4.])

tenzor([2., 4.])

# define some arbitrary loss as a fn of theta
loss = torch.sum(df(theta, x)**2)
loss.backward()

poskytuje následující chybě

RuntimeError: prvek 0 tenzory nevyžaduje grad a nemá grad_fn

Kdybych poskytnout analytické derivace (2*theta*x), to funguje v pořádku:

loss = torch.sum((2*theta*x)**2)
loss.backward()

Existuje způsob, jak to udělat v PyTorch? Nebo jsem určitým způsobem omezena?

Dejte mi vědět, pokud někdo potřebuje nějaké další podrobnosti.

PS

Já jsem si představoval, řešení je něco podobného na způsob, že JAX se autograd, jako že je to, co znám. Co chci říct je, že v JAXI věřím, že byste právě dělat:

from jax import grad
df = grad(lambda x: f(theta, x))

a pak df by být jen funkce, která může být volána v libovolném bodě. Ale je PyTorch stejné? Nebo je tam nějaký konflikt uvnitř .backward() to způsobuje tuto chybu?

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

Nejlepší odpověď

0

PyTorch je jacobian nevytváří výpočet grafu, pokud jste výslovně požádat o to

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

.. s create_graph argument.

V dokumentaci je zcela jasné, o tom

create_graph (bool, volitelný) – Pokud je to Pravda, Jakobiho bude vypočítán v diferencovatelné způsobem

2021-11-12 14:55:57

Ano, už jsem se na to díval, ale nechtěl jsem opravdu pochopit. Myslím, že to znamená, že nechci používat create_graph argument, protože nechci, aby to bylo zahrnuto v .backward() volání. V tomto případě, proč to dej mi chybu? Nechápu chybová zpráva.
Danny Williams

To, co se snažíte udělat, je v podstatě rozlišování prostřednictvím operací jakobiho. V tomto případě, musíte je postaven jako graf. Bez create_graph, jakobiho nebude vytvořit graf visí z loss (můžete zkontrolovat loss.grad_fn je prázdný - tedy chyba)
ayandas

V jiných jazycích

Tato stránka je v jiných jazycích

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