Variables y autogradación en Pytorch

PyTorch es una biblioteca de Python desarrollada por Facebook para ejecutar y entrenar la máquina y los algoritmos de aprendizaje profundo. En una red neuronal tenemos que realizar backpropagation lo que implica optimizar el parámetro para minimizar el error en su predicción.

Para esto, PyTorch ofrece torch.autograd que hace una diferenciación automática al recopilar todos los gradientes. Autograd hace esto manteniendo un registro de datos (tensores) y todas las operaciones ejecutadas en un gráfico acíclico dirigido que consta de objetos de función. En este DAG, las hojas son los tensores de entrada, las raíces son los tensores de salida. Al rastrear este gráfico desde las raíces hasta las hojas, podemos calcular automáticamente los gradientes usando la regla de la string.

Una variable es una herramienta de diferenciación automática dada una formulación directa. Envuelve una variable. Variable admite casi todas las API definidas por un tensor. Mientras definimos una variable, pasamos el parámetro require_grad que indica si la variable es entrenable o no. De forma predeterminada, se establece en falso. A continuación se muestra un ejemplo para que se entienda más claramente.

Ejemplo 1: 

Python3

# importing libraries
import torch
from torch.autograd import Variable
  
# packing the tensors with Variable
a = Variable(torch.tensor([5., 4.]), requires_grad=True)
b = Variable(torch.tensor([6., 8.]))
  
# polynomial function with a,b as variable
y = ((a**2)+(5*b))
z = y.mean()
print('Z value is:', z)

Producción:

El valor Z es: tensor (55.5000, grad_fn=<MeanBackward0>)

Por lo tanto, en el paso anterior anterior, calculamos un tensor resultante que mantiene la función de gradiente en DAG. Después de eso, cuando se llama hacia atrás, sigue hacia atrás con los enlaces creados en el gráfico para propagar hacia atrás el gradiente y los acumula en el atributo de graduación de la variable respectiva.

Ejemplo 2:

Python3

# importing libraries
import torch
from torch.autograd import Variable
  
# packing the tensors with Variable
a = Variable(torch.tensor([5., 4.]), requires_grad=True)
b = Variable(torch.tensor([6., 8.]))
  
# polynomial function with a,b as variable
y = ((a**2)+(5*b))
z = y.mean()
  
# dy/da=2*a=10,8
# dy/db=5
  
# computing gradient
z.backward()
  
# printing out
print('Gradient of a', a.grad)
print('Gradient of b', b.grad)

Producción:

Gradiente de un tensor ([5., 4.])

Gradiente de b Ninguno

Arriba puede notar que el gradiente de b no se actualiza ya que en esta variable require_grad no se establece en verdadero. Aquí es donde Autograd entra en escena.

retropropagación

Primero, creamos algunas características aleatorias, por ejemplo, vectores de peso y sesgo. Realice una regresión lineal multiplicando las arrays x, W. Luego calcule el error cuadrático y llame a la función de retroceso para propagar hacia atrás, actualizando el valor de gradiente de cada variable. Por último, optimizamos la array de pesos y la imprimimos.

Ejemplo:

Python3

# importing libraries
import torch
from torch.autograd import Variable
  
# creating random tensors for weights and wrap them in variables
x = Variable(torch.randn(1, 10), requires_grad=False)
W = Variable(torch.randn(10, 1), requires_grad=True)  # weight matrix
b = Variable(torch.randn(1), requires_grad=True)  # bias vector
y = Variable(torch.tensor([[0.822]]))
  
# performing matrix multiplication to compute output
y_pred = torch.matmul(x, W)+b
  
# calculating loss
loss = (y_pred-y).pow(2)
print(loss)
  
# computing gradient
loss.backward()
  
print(W.grad)
print(b.grad)
  
lr = 0.001
  
# updating the weight matrix after backpropagation
with torch.no_grad():
    W = W-(lr*W.grad.data)
print(W)

Producción:

tensor([[1.3523]], grad_fn=<PowBackward0>)
tensor([[-0.4488],
       [ 1.8151],
       [ 3.5312],
       [ 1.4467],
       [ 2.8628],
       [-0.9358],
       [-2.7980],
       [ 0.2670],
       [-0.0399],
       [ 0.1995]])
tensor([2.3258])
tensor([[ 1.1908],
       [ 0.0301],
       [-0.2003],
       [ 0.6922],
       [ 2.1972],
       [ 0.0633],
       [ 0.7101],
       [-0.5169],
       [ 0.7412],
       [ 0.7068]])

Publicación traducida automáticamente

Artículo escrito por barnadipdey2510 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 *