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:
- 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.
- 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.
- 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
- Verifica la codificación de etiquetas: Asegúrate de que las etiquetas sean correctas (one-hot encoding).
- Normaliza tus datos: Si es necesario, normaliza o estandariza tus datos para mejorar el rendimiento.
- Monitorea el entrenamiento: Usa validación cruzada y monitorea la cross-entropy en los datos de validación durante el entrenamiento.
- Inicia con pesos adecuados: Inicializa correctamente los pesos del modelo, considerando técnicas como Xavier o He initialization.
- Ajusta hiperparámetros: Experimenta con diferentes tamaños de lote y tasas de aprendizaje para encontrar el mejor equilibrio.
Cierre: Siguientes pasos
- Aplica la cross-entropy a tu proyecto: Usa la cross-entropy en un problema real de clasificación.
- 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.
- 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!