Logo de CursoIA
CursoIA Curso de Inteligencia Artificial

Redes neuronales desde cero, Unidad 5 — Función de pérdida, 5.2 — Elección de la función de pérdida ·

Cross-entropy

Cross-entropy: Elección de la función de pérdida

Introducción

La función de pérdida es una parte crucial en el entrenamiento de cualquier modelo de aprendizaje automático, y en particular, en las redes neuronales. La elección adecuada de la función de pérdida puede significar la diferencia entre un modelo que funciona bien y uno que no lo hace. En este artículo, nos centraremos en la cross-entropy, una herramienta fundamental para clasificaciones binarias y múltiples clases.

Explicación principal con ejemplos

La cross-entropy es una medida de disimilaridad entre dos distribuciones probables. Es comúnmente utilizada como función de pérdida en problemas de clasificación, especialmente cuando los datos están codificados utilizando one-hot encoding (es decir, cada clase tiene su propio vector binario).

Definición matemática

La cross-entropy se define para una muestra individual \( x \) con la etiqueta real \( y \) y las predicciones del modelo \( p \):

\[ H(y, p) = -\sum_{i} y_i \log(p_i) \]

Donde:

  • \( y_i \) es el valor verdadero de la etiqueta (0 o 1 para clasificación binaria).
  • \( p_i \) es la probabilidad predicha por el modelo para la clase correspondiente.

Ejemplo con código

Supongamos que estamos entrenando una red neuronal para clasificar imágenes en dos categorías: gatos y perros. Usaremos one-hot encoding, donde 1 representa "gato" y 0 representa "perro". El vector de predicciones \( p \) sería un array como [0.8, 0.2] (o [0.9, 0.1], [0.3, 0.7], etc.) para cada muestra.

import numpy as np

def cross_entropy(y_true, y_pred):
    """
    Calcula la cross-entropy entre las verdaderas etiquetas y las predicciones.
    :param y_true: Etiquetas reales (array de 0s y 1s)
    :param y_pred: Predicciones del modelo (probabilidades)
    :return: La cross-entropy
    """
    epsilon = 1e-15  # Para evitar divisiones por cero o logaritmos de cero
    y_pred = np.clip(y_pred, epsilon, 1.0 - epsilon)
    return -np.mean(y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred))

# Ejemplo con una muestra:
y_true = [1, 0]  # Gato
y_pred = [0.8, 0.2]  # Predicción del modelo

print("Cross-entropy:", cross_entropy(y_true, y_pred))

Cross-entropy para clasificaciones múltiples (softmax)

Para problemas con más de dos clases, generalizamos la cross-entropy utilizando una función softmax en el modelo:

\[ H(y, p) = -\sum_{i} y_i \log(p_i) \]

Donde \( p \) es un vector de probabilidad normalizado.

def softmax(z):
    """
    Aplica la función de softmax a los valores z.
    :param z: Salidas del último capa antes de la softmax (array)
    :return: Probas después de aplicar la softmax
    """
    exp_z = np.exp(z - np.max(z))  # Evitar overflow
    return exp_z / np.sum(exp_z, axis=0)

def cross_entropy_multiclass(y_true, y_pred):
    """
    Calcula la cross-entropy para clasificaciones múltiples.
    :param y_true: Etiquetas reales (array one-hot)
    :param y_pred: Predicciones del modelo (probabilidades)
    :return: La cross-entropy
    """
    epsilon = 1e-15
    return -np.mean(np.sum(y_true * np.log(y_pred + epsilon), axis=1))

# Ejemplo con una muestra:
y_true = [0, 1, 0]  # Perro (segunda clase)
y_pred = softmax([2.0, 1.3, 0.5])  # Salidas después de la última capa

print("Cross-entropy:", cross_entropy_multiclass(y_true, y_pred))

Errores típicos / trampas

Aunque la cross-entropy es una función poderosa, su uso puede llevar a varios problemas si no se maneja adecuadamente:

  1. Overfitting: Si el modelo es demasiado complejo, podría sobreajustar y tener un rendimiento excesivo en los datos de entrenamiento pero pobre en datos de prueba.
  2. Desviaciones de valores predichos: La cross-entropy puede dar resultados extremadamente altos o bajos si las probabilidades predichas son muy diferentes a las verdaderas, lo que puede llevar al modelo a converger demasiado rápidamente.
  3. Inicialización de pesos: Una mala inicialización de los pesos del modelo puede llevar a malas predicciones y a un rendimiento pobre en la cross-entropy.

Checklist accionable

  1. Verifica la codificación de etiquetas: Asegúrate de que las etiquetas sean correctas (one-hot encoding).
  2. Normaliza tus datos: Si es necesario, normaliza o estandariza tus datos para mejorar el rendimiento.
  3. Monitorea el entrenamiento: Usa validación cruzada y monitorea la cross-entropy en los datos de validación durante el entrenamiento.
  4. Inicia con pesos adecuados: Inicializa correctamente los pesos del modelo, considerando técnicas como Xavier o He initialization.
  5. Ajusta hiperparámetros: Experimenta con diferentes tamaños de lote y tasas de aprendizaje para encontrar el mejor equilibrio.

Cierre: Siguientes pasos

  1. Aplica la cross-entropy a tu proyecto: Usa la cross-entropy en un problema real de clasificación.
  2. Implementa una validación cruzada: Asegúrate de que tus modelos funcionen bien no solo en los datos de entrenamiento, sino también en datos desconocidos.
  3. Monitorea el rendimiento del modelo: Mide no solo la cross-entropy, sino otros indicadores relevantes para tu problema.

¡Esperamos que este artículo te haya ayudado a entender mejor cómo usar y aplicar la cross-entropy en tus modelos de aprendizaje automático!

Contacto

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