Introducción

En este tema, aprenderemos sobre autograd, una de las características más poderosas de PyTorch. autograd es el motor de diferenciación automática de PyTorch que permite calcular gradientes automáticamente. Esto es esencial para el entrenamiento de redes neuronales, ya que los gradientes son necesarios para actualizar los pesos de la red durante el proceso de optimización.

Conceptos Clave

  1. Tensores con Gradientes: Tensores que tienen la capacidad de rastrear todas las operaciones que se realizan sobre ellos para calcular gradientes.
  2. Función de Pérdida: Una función que mide qué tan bien o mal está funcionando el modelo.
  3. Backpropagation: El proceso de calcular los gradientes de la función de pérdida con respecto a los parámetros del modelo.

Tensores con Gradientes

Para que un tensor rastree las operaciones y calcule gradientes, debemos establecer su atributo requires_grad a True.

import torch

# Crear un tensor con requires_grad=True
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
print(x)

Salida:

tensor([1., 2., 3.], requires_grad=True)

Operaciones y Gradientes

Cuando realizamos operaciones en tensores con requires_grad=True, PyTorch construye un gráfico computacional dinámico. Este gráfico permite calcular los gradientes automáticamente mediante backpropagation.

# Realizar operaciones
y = x + 2
z = y * y * 3
out = z.mean()

print(y, z, out)

Salida:

tensor([3., 4., 5.], grad_fn=<AddBackward0>)
tensor([27., 48., 75.], grad_fn=<MulBackward0>)
tensor(50., grad_fn=<MeanBackward0>)

Backpropagation

Para calcular los gradientes, utilizamos el método backward() en el tensor de salida.

# Realizar backpropagation
out.backward()

# x.grad contiene los gradientes de out con respecto a x
print(x.grad)

Salida:

tensor([4.5000, 6.0000, 7.5000])

Ejemplo Completo

A continuación, se muestra un ejemplo completo que ilustra cómo usar autograd para calcular gradientes.

import torch

# Crear un tensor con requires_grad=True
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)

# Realizar operaciones
y = x + 2
z = y * y * 3
out = z.mean()

# Realizar backpropagation
out.backward()

# Mostrar los gradientes
print("x:", x)
print("Gradientes de x:", x.grad)

Salida:

x: tensor([1., 2., 3.], requires_grad=True)
Gradientes de x: tensor([4.5000, 6.0000, 7.5000])

Ejercicio Práctico

Ejercicio 1

Crea un tensor a con valores [2.0, 3.0, 4.0] y requires_grad=True. Realiza las siguientes operaciones y calcula los gradientes:

  1. b = a * 2
  2. c = b ** 2
  3. d = c.sum()

Realiza backpropagation y muestra los gradientes de a.

Solución

import torch

# Crear el tensor
a = torch.tensor([2.0, 3.0, 4.0], requires_grad=True)

# Realizar operaciones
b = a * 2
c = b ** 2
d = c.sum()

# Realizar backpropagation
d.backward()

# Mostrar los gradientes
print("a:", a)
print("Gradientes de a:", a.grad)

Salida esperada:

a: tensor([2., 3., 4.], requires_grad=True)
Gradientes de a: tensor([ 8., 12., 16.])

Conclusión

En esta sección, hemos aprendido sobre autograd y cómo PyTorch facilita el cálculo de gradientes automáticamente. Esto es fundamental para el entrenamiento de redes neuronales, ya que permite optimizar los parámetros del modelo de manera eficiente. En el próximo módulo, comenzaremos a construir redes neuronales utilizando estos conceptos básicos.

© Copyright 2024. Todos los derechos reservados