Logo de CursoIA
CursoIA Curso de Inteligencia Artificial

Optimización de redes neuronales, Unidad 3 — Descenso por gradiente en profundidad, 3.1 — Variantes fundamentales ·

Batch gradient descent

Batch gradient descent: Optimización de redes neuronales

Introducción

El batch gradient descent (BGD) es una variante fundamental del algoritmo de descenso por gradiente que tiene un impacto significativo en la optimización de modelos de aprendizaje profundo. BGD se diferencia del estocástico y el mini-batch gradient descent al usar todos los datos de entrenamiento disponibles para calcular cada paso del descenso. Esta variante es especialmente útil cuando se dispone de una cantidad considerable de datos, ya que proporciona una buena aproximación a la curvatura global de la función de pérdida.

Explicación principal

Concepto básico

En BGD, los pesos del modelo son actualizados en cada iteración utilizando la derivada (gradiente) de la función de pérdida con respecto a todos los datos de entrenamiento. Este proceso se realiza hasta que se converge o se alcanza un criterio de parada específico.

La ecuación matemática para BGD es: \[ \theta_{t+1} = \theta_t - \eta \cdot \nabla J(\theta) \] donde:

  • $\theta$ son los pesos del modelo.
  • $\eta$ es el learning rate.
  • $J(\theta)$ es la función de pérdida.

Ejemplo práctico

Supongamos que estamos trabajando con un conjunto de datos simple para clasificación binaria. Usaremos una red neuronal simple con una capa oculta y una salida logits.

import torch
from torch import nn, optim
import numpy as np

# Definición del modelo
class SimpleNN(nn.Module):
    def __init__(self):
        super(SimpleNN, self).__init__()
        self.linear = nn.Linear(1, 1)

    def forward(self, x):
        return self.linear(x)

# Crear un conjunto de datos de ejemplo
X = torch.tensor([[0.5], [1.0], [2.5]], requires_grad=True)
y = torch.tensor([1., 1., -1.])

# Inicializar el modelo y la función de pérdida
model = SimpleNN()
criterion = nn.BCEWithLogitsLoss()

# Optimizador con BGD
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)

for epoch in range(200):
    optimizer.zero_grad()  # Reiniciar gradiente

    outputs = model(X)
    loss = criterion(outputs, y)
    
    # Calcular el gradiente
    loss.backward()
    
    # Actualizar los pesos con BGD
    optimizer.step()

print("Pesos después de entrenamiento:", list(model.parameters()))

Errores típicos / trampas

  1. Learning rate inadecuado: Un learning rate muy pequeño puede hacer que el algoritmo se mueva lentamente hacia la mínima, mientras que uno muy grande puede causar divergencia. Es crucial ajustarlo adecuadamente para obtener buenos resultados.
  1. Inicialización de pesos mal hecha: Si los pesos se inicializan con valores excesivamente grandes o pequeños, BGD puede no converger correctamente. La elección correcta de una técnica de inicialización (como Xavier/Glorot) es crucial.
  1. No normalizar los datos: Los datos no normalizados pueden afectar negativamente la convergencia del algoritmo. Normalizar los datos (por ejemplo, usando Batch Normalization o Normalización por capas) puede mejorar significativamente el rendimiento de BGD.

Checklist accionable

  1. Verifica el learning rate: Ajusta el learning rate para evitar divergencia y asegúrate de que la convergencia es lo suficientemente rápida.
  2. Inicializa los pesos correctamente: Usa técnicas como Xavier/Glorot o He initialization para iniciar los pesos del modelo.
  3. Normaliza tus datos: Normaliza los datos utilizando techniques como Batch Normalization o Normalización por capas para mejorar la estabilidad y el rendimiento del algoritmo.
  4. Revisa tu función de pérdida: Asegúrate de que se está utilizando una función de pérdida adecuada (por ejemplo, BCEWithLogitsLoss en el caso de clasificación binaria).
  5. Monitorea las curvas de aprendizaje: Visualiza las curvas de entrenamiento y validación para detectar posibles problemas como overfitting o underfitting.

Siguientes pasos

  • Explora la implementación detallada del BGD en frameworks como TensorFlow o PyTorch.
  • Aprende a ajustar el learning rate dinámicamente utilizando schedulers.
  • Experimenta con otras técnicas de optimización, como Adam o RMSprop.

Optimizar redes neuronales es un proceso continuo que requiere experimentación y conocimiento profundo. El batch gradient descent es una herramienta valiosa en este proceso, pero su efectividad depende de muchos factores que debes considerar cuidadosamente para obtener los mejores resultados.

Contacto

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