Array jacobiana en PyTorch

Introducción:

El jacobiano es un operador muy poderoso que se usa para calcular las derivadas parciales de una función dada con respecto a sus variables latentes constituyentes. Para fines de actualización, el jacobiano de una función dada  f : \R^{n} \rightarrow \R^{m}           con respecto a un vector  \mathbf{x} = \{x_1, ..., x_n\} \in \R^{n}           se define como

 \mathbf{J}_f(\mathbf{x}) = \begin{bmatrix}   \frac{\partial f}{\partial x_1} &    \frac{\partial f}{\partial x_2} & \ldots &    \frac{\partial f}{\partial x_n}\end{bmatrix}=    \begin{bmatrix}  \frac{\partial f_1}{\partial x_1} & \ldots &    \frac{\partial f_1}{\partial x_n} \\[1ex] \vdots & \ddots & \vdots \\ \frac{\partial f_m}{\partial x_1} &    \ldots &    \frac{\partial f_m}{\partial x_n} \end{bmatrix}

Ejemplo:

Supongamos que tenemos un vector  \mathbf{x} = \begin{bmatrix}  x_{1} \\[1ex]x_{2} \\[1ex]x_{3} \end{bmatrix}        y una función  f(\mathbf{x}) = f(x_1,x_2,x_3)= \begin{bmatrix}f_{1} \\[1ex]f_{2}\\[1ex]f_{3}\end{bmatrix} = \begin{bmatrix}x_1+x_2 \\[1ex]x_1 \times x_3 \\[1ex]x_2^{3}\end{bmatrix}      . Para calcular el jacobiano de  f       con respecto a  \mathbf{x}      , podemos usar la fórmula mencionada anteriormente para obtener

\mathbf{J}_f(\mathbf{x}) = \begin{bmatrix}   \frac{\partial f}{\partial x_1} &    \frac{\partial f}{\partial x_2} &    \frac{\partial f}{\partial x_3}\end{bmatrix}=    \begin{bmatrix}  \frac{\partial f_1}{\partial x_1} & \frac{\partial f_1}{\partial x_2} &    \frac{\partial f_1}{\partial x_3} \\[1ex]   \frac{\partial f_2}{\partial x_1} & \frac{\partial f_2}{\partial x_2} &    \frac{\partial f_2}{\partial x_3} \\[1ex]  \frac{\partial f_3}{\partial x_1} & \frac{\partial f_3}{\partial x_2} &    \frac{\partial f_3}{\partial x_3} \end{bmatrix}=\begin{bmatrix}  \frac{\partial (x_1 + x_2)}{\partial x_1} & \frac{\partial (x_1 + x_2)}{\partial x_2} &    \frac{\partial (x_1 + x_2)}{\partial x_3} \\[1ex]   \frac{\partial (x_1 \times x_3)}{\partial x_1} & \frac{\partial (x_1 \times x_3)}{\partial x_2} &    \frac{\partial (x_1 \times x_3)}{\partial x_3} \\[1ex]  \frac{\partial x_2^3}{\partial x_1} & \frac{\partial x_2^3}{\partial x_2} &    \frac{\partial x_2^3}{\partial x_3} \end{bmatrix} = \begin{bmatrix}1 & 1 & 0 \\[1ex] x_3 & 0 & x_1 \\[1ex] 0 & 3\times x_2^2&0\end{bmatrix}

Para lograr la misma funcionalidad que la anterior, podemos usar la función jacobian() de la utilidad torch.autograd.function de Pytorch para calcular la array jacobiana de una función dada para algunas entradas.

Sintaxis: torch.autograd.function.jacobian(func, inputs, create_graph=False, strict=False, vectorize=False)

Parámetros:

  • func: una función de Python que toma entrada y genera un tensor de Pytorch (o una tupla de tensores).
  • entradas: Las entradas se pasan como parámetros al método ‘func’. La entrada puede ser un solo tensor Pytorch (o una tupla de tensores)
  • create_graph: si es True, el motor de autogradación crea un gráfico compatible con versiones anteriores para realizar más operaciones en los degradados. El valor predeterminado es falso.
  • estricto: si es verdadero, se generará un error cuando el motor detecte que existe una entrada tal que todas las salidas son independientes de ella. Si es False, devuelve cero gradientes para dichas entradas. El valor predeterminado es falso.
  • vectorizar: Todavía en su fase experimental si es Verdadero, la función usa la función de prototipo vmap para calcular los gradientes con solo una llamada del motor de autogradación en lugar de una llamada por cada fila de la array. El valor predeterminado es falso.

Instalación:

Para este artículo, solo necesita la utilidad torch, que se puede descargar a través del administrador de paquetes pip usando:

pip install torch

Ejemplo de uso de la función:

Usaremos la misma función y vector para facilitar el flujo, como se discutió en el ejemplo anterior. Dado que los tensores son los componentes básicos del paquete Pytorch, los usaremos para representar tanto los vectores de entrada como la función dada. Este artículo asume una familiaridad básica con los tensores de Pytorch que se pueden revisar rápidamente revisando los artículos de Pytorch

Verificación teórica:

Supongamos que tenemos un vector  \mathbf{x} = \begin{bmatrix}  x_{1} \\[1ex]x_{2} \\[1ex]x_{3} \end{bmatrix}  = \begin{bmatrix}  3 \\[1ex]4 \\[1ex]5 \end{bmatrix}         como entrada dada. Introduciendo los valores de  \mathbf{x}       en la ecuación derivada anterior obtendremos J_f({\mathbf{x}}) =\begin{bmatrix}1 & 1 & 0 \\[1ex] x_3 & 0 & x_1 \\[1ex] 0 & 3\times x_2^2&0\end{bmatrix}=\begin{bmatrix}1 & 1 & 0 \\[1ex] 5 & 0 & 3 \\[1ex] 0 & 3\times 4^2&0\end{bmatrix}= \begin{bmatrix}1 & 1 & 0 \\[1ex] 5 & 0 & 3 \\[1ex] 0 & 48 & 0\end{bmatrix}

Código: implementación de Python para mostrar el funcionamiento de Jacobian Matrix usando Pytorch

Python

from torch.autograd.functional import jacobian
from torch import tensor
 
#Defining the main function
def f(x1,x2,x3):
    return (x1 + x2, x3*x1, x2**3)
 
#Defining input tensors
x1 = tensor(3.0)
x2 = tensor(4.0)
x3 = tensor(5.0)
 
#Printing the Jacobian
print(jacobian(f,(x1,x2,x3)))

Producción:

((tensor(1.), tensor(1.), tensor(0.)), 
(tensor(5.), tensor(0.), tensor(3.)), 
(tensor(0.), tensor(48.), tensor(0.)))

¡El resultado es exactamente similar a nuestra verificación teórica! Usando un enfoque similar, podemos calcular la array jacobiana de cualquier función dada usando la API de Pytorch.

Referencias:

  1. https://pytorch.org/docs/stable/autograd.html#torch.autograd.funcional.jacobian
  2. https://pytorch.org/docs/stable/tensors.html

Publicación traducida automáticamente

Artículo escrito por adityasaini70 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *