¿Cómo puedo usar autograd para una función específica, independiente de backpropagate en PyTorch?

0

Pregunta

Tengo dos variables, x y theta. Estoy tratando de minimizar mi pérdida con respecto a theta sólo, sino como parte de mi función de pérdida necesito la derivada de una función diferente (f) con respecto a x. Este derivado de la misma no es relevante para la minimización, sólo su salida. Sin embargo, cuando la aplicación esta en PyTorch estoy recibiendo un error en tiempo de ejecución.

Un ejemplo mínimo es el siguiente:

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

da el siguiente error

RuntimeError: el elemento 0 de los tensores no requiere de posgrado y no tiene un grad_fn

Si me ofrecen una analítica de derivados (2*theta*x), funciona bien:

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

Es allí una manera de hacer esto en PyTorch? O estoy limitado de alguna manera?

Déjeme saber si alguien necesita más detalles.

PS

Me estoy imaginando la solución es algo similar a la forma en que JAX no autograd, como que es lo que estoy más familiarizado. Lo que quiero decir aquí es que en JAX creo que usted acaba de hacer:

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

y, a continuación, df sólo sería una función que puede ser llamado en cualquier momento. Pero es PyTorch la misma? O es que hay algún conflicto dentro de .backward() que la causa de este error?

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

Mejor respuesta

0

PyTorch del jacobian no crear un cálculo gráfico a menos que explícitamente la pida

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

.. con create_graph argumento.

La documentación es bastante claro al respecto

create_graph (bool, opcional) – Si es True, el Jacobiano se computarán en un diferenciable manera

2021-11-12 14:55:57

Sí, he pensado en esto, pero yo realmente no lo entiendo. Yo creo que esto significa que no quiero utilizar el create_graph argumento, porque no quiero que sea incluido en mi .backward() de la llamada. En este caso, ¿por qué me da un error? No entiendo el mensaje de error.
Danny Williams

Lo que estamos tratando de hacer es, básicamente, la diferenciación a través de las operaciones de una jacobiana. En ese caso, debes tener construido como un gráfico. Sin create_graph, jacobiana no crear una gráfica que cuelga de loss (usted puede comprobar loss.grad_fn está vacía - de ahí el error)
ayandas

En otros idiomas

Esta página está en otros idiomas

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