Logo de CursoIA
CursoIA Curso de Inteligencia Artificial

Redes neuronales desde cero, Unidad 6 — Descenso por gradiente, 6.2 — Variantes del descenso por gradiente ·

Batch

Batch: Variante del descenso por gradiente

Introducción

El descenso por gradiente es una técnica fundamental para ajustar los parámetros de una red neuronal. Sin embargo, existen varias variaciones de este algoritmo que pueden mejorar su eficacia y estabilidad. En esta unidad, nos centramos en la variante batch del descenso por gradiente. Este método implica el cálculo del gradiente a partir de un lote completo de datos en lugar de un solo ejemplo. A continuación, exploramos cómo funciona este enfoque y sus ventajas e inconvenientes.

Explicación principal con ejemplos

Cómo funciona el descenso por gradiente por lotes (batch)

En el descenso por gradiente por lotes, se calcula el gradiente de la función de pérdida con respecto a los parámetros del modelo utilizando todos los datos en un lote. Este proceso se repite para cada lote disponible.

El algoritmo puede resumirse en los siguientes pasos:

  1. Inicialización: Inicializa los pesos y sesgos de la red neuronal.
  2. Selección de un lote: Selecciona un lote aleatorio de datos de entrenamiento.
  3. Cálculo del gradiente: Calcula el gradiente de la función de pérdida con respecto a los parámetros (pesos y sesgos) utilizando todos los ejemplos en el lote.
  4. Actualización de parámetros: Actualiza los pesos y sesgos en la dirección opuesta al gradiente, multiplicado por una tasa de aprendizaje.
  5. Repetición: Repite los pasos 2-4 hasta convergencia.

Ejemplo simplificado

Supongamos que tenemos una red neuronal con una única capa oculta y estamos utilizando la función de pérdida MSE (Mean Squared Error). Consideremos un lote de dos ejemplos:

\[ X = \begin{bmatrix} x_{1} \\ x_{2} \end{bmatrix}, \quad y = \begin{bmatrix} y_{1} \\ y_{2} \end{bmatrix}, \quad W = \begin{bmatrix} w_{11} & w_{12} \\ w_{21} & w_{22} \end{bmatrix}, \quad b = \begin{bmatrix} b_1 \\ b_2 \end{bmatrix} \]

La predicción \( y' \) se calcula como:

\[ y' = W X + b \]

La función de pérdida para el lote es:

\[ L = \frac{1}{2} (y - y')^T (y - y') \]

El gradiente con respecto a los pesos \( W \) se calcula así:

\[ \nabla_W L = X^T (XW + b - y) \]

Y el gradiente con respecto al sesgo \( b \):

\[ \nabla_b L = (XW + b - y) \]

Estos gradientes se utilizan para actualizar los pesos y sesgos según:

\[ W \leftarrow W - \eta \nabla_W L, \quad b \leftarrow b - \eta \nabla_b L \]

donde \( \eta \) es la tasa de aprendizaje.

Ejemplo en código (Python)

import numpy as np

def forward(X, W, b):
    return X @ W + b

def loss(y_true, y_pred):
    return 0.5 * ((y_true - y_pred)**2).mean()

def gradient(X, y_true, y_pred):
    m = len(y_true)
    dW = (X.T @ (y_pred - y_true)) / m
    db = (y_pred - y_true).mean()
    return dW, db

# Datos de ejemplo
X = np.array([[1], [2]])
y_true = np.array([3, 4])
W = np.array([[0.5], [-0.5]])
b = 0.5
eta = 0.1

# Predicción inicial
y_pred = forward(X, W, b)

# Cálculo del gradiente
dW, db = gradient(X, y_true, y_pred)

# Actualización de pesos y sesgo
W -= eta * dW
b -= eta * db

print(f'Nuevo peso: {W}')
print(f'Nueva constante: {b}')

Errores típicos / trampas

  1. Tasa de aprendizaje incorrecta: Una tasa de aprendizaje muy alta puede causar saltos inestables y no converger, mientras que una tasa demasiado baja puede resultar en un entrenamiento lento.
  2. Inicialización de pesos impropia: Inicializar los pesos con valores demasiado grandes o pequeños puede afectar el rendimiento del descenso por gradiente. Usar inicializadores como Xavier o He puede ser más efectivo.
  3. Overfitting a través de mini-lotes: Si se utilizan lotes muy pequeños, la red puede sobreajustarse a los datos en ese lote, lo que puede llevar a una mala generalización.

Checklist accionable

  1. Verifica que tu tasa de aprendizaje esté ajustada adecuadamente.
  2. Usa técnicas de inicialización de pesos como Xavier o He.
  3. Experimenta con diferentes tamaños de lotes para encontrar el equilibrio entre convergencia y generalización.
  4. Considera la regularización L1, L2 o dropout si observas overfitting.
  5. Monitorea la curva de pérdida durante el entrenamiento para detectar signos de sobreajuste.

Cierre

El descenso por gradiente por lotes es una variante poderosa del algoritmo de descenso por gradiente que puede mejorar significativamente la eficacia y estabilidad del entrenamiento de redes neuronales. Sin embargo, como con cualquier técnica avanzada en machine learning, es importante estar atento a errores comunes y seguir un proceso cuidadoso para obtener los mejores resultados.

Siguientes pasos

  • Practica usando lotes de diferentes tamaños y observa cómo afectan al rendimiento de la red.
  • Expérimenta con otros métodos de optimización, como Adam o RMSprop, que también utilizan el concepto de lotes.
  • Aprende sobre regularización para prevenir overfitting en tu modelo.

Contacto

Indica tu objetivo (ChatGPT, RAG, agentes, automatización) y tu stack (web/backend).