Cálculo manual de la pérdida de entropía cruzada
Construye una secuencia de predicciones que va desde "adivinar a ciegas" hasta "muy confiado" y observa cómo disminuye el valor de la entropía cruzada en consecuencia.
Al completar este caso, comprenderás:Por qué las tareas de clasificación usan entropía cruzada en lugar de MSE: castiga con más "severidad" que el MSE las predicciones confiadas pero incorrectas.
Introducción desde la vida cotidiana
Calificación de exámenes: responder mal es peor que no responder
El desempeño de dos estudiantes en una pregunta de opción única (la respuesta es A): Xiaohong predice A con probabilidad 0.5 (insegura pero en la dirección correcta), Xiaoming predice C con probabilidad 0.95 (muy confiado pero equivocado). Xiaohong, aunque insegura, acertó la dirección; Xiaoming no solo se equivocó sino que estaba muy confiado: este error es más imperdonable.
La pérdida de entropía cruzada es como este criterio de calificación:Cuando la predicción es correcta, recompensa la confianza; cuando es incorrecta, castiga la confianza.
Comprensión intuitiva
La etiqueta real es "gato" (one-hot = [1, 0, 0]). Simula la salida del modelo desde "adivinar a ciegas" hasta "entrenarse con cada vez más precisión":
- Adivinar completamente a ciegas [0.33, 0.33, 0.34] → pérdida 1.10
- Muy confiado y correcto [0.98, 0.01, 0.01] → pérdida 0.02
- Muy confiado pero incorrecto [0.02, 0.9, 0.08] → pérdida 3.91 (¡casi 4 veces mayor que adivinar a ciegas!)
El último valor merece atención: porque -log(0.02) ≈ 3.91, mientras que -log(0.33) ≈ 1.10.
Definición matemática
\[ H(p, q) = -\sum_{i=1}^{C} p_i \cdot \log(q_i) \]\(p\) es la distribución real (one-hot), \(q\) es la distribución predicha. Para una predicción "confiada pero incorrecta", entropía cruzada = -log(0.02) ≈ 3.91, MSE = (1-0.02)^2 ≈ 0.96. El castigo de la entropía cruzada es 12 veces el del MSE.
Manos a la obra con Python
Ejemplo
def cross_entropy(p_true, q_pred, eps=1e-12):
q_pred = np.clip(q_pred, eps, 1 - eps)
return -np.sum(p_true * np.log(q_pred))
# Etiqueta real: gato (clase 0)
p_true = np.array([1, 0, 0]) # [gato, perro, pájaro]
predictions = {
"Adivinar completamente a ciegas (uniforme)": np.array([0.33, 0.33, 0.34]),
"Un poco de intuición": np.array([0.5, 0.3, 0.2]),
"Cada vez más fiable": np.array([0.7, 0.2, 0.1]),
"Bien entrenado": np.array([0.9, 0.07, 0.03]),
"Muy confiado y correcto": np.array([0.98, 0.01, 0.01]),
"¡Muy confiado pero incorrecto!": np.array([0.02, 0.9, 0.08]),
}
print("EJEMPLO Comparación de pérdida de entropía cruzada (real: gato=[1,0,0]) "\n")
print(f"{'Descripción de predicción':<20} {'Pérdida':<10} {'Análisis'}")
print("-" * 52)
for name, q in predictions.items():
loss = cross_entropy(p_true, q)
if loss > 2: analysis = "¡Error grave!"
elif loss > 0.5: analysis = "Dirección correcta pero inseguro"
else: analysis = "Muy bien"
print(f"{name:<20} {loss:<10.4f} {analysis}")
# Comparación MSE vs entropía cruzada
q_bad = predictions["¡Muy confiado pero incorrecto!"]
mse_bad = np.mean((p_true - q_bad) ** 2)
ce_bad = cross_entropy(p_true, q_bad)
print(f"\n"EJEMPLO Cuando está confiado pero incorrecto: MSE={mse_bad:.4f}, entropía cruzada={ce_bad:.4f} (severidad {ce_bad/mse_bad:.0f}x)")
EJEMPLO 交叉熵损失对比 (真实: 猫=[1,0,0]) 预测描述 损失 分析 ---------------------------------------------------- 完全瞎猜 (均匀) 1.0986 方向对但不确定 有点感觉 0.6931 方向对但不确定 逐渐靠谱 0.3567 很好 训练较好 0.1054 很好 非常自信且正确 0.0202 很好 非常自信但错误! 3.9120 严重错误! EJEMPLO 自信但错误时: MSE=0.3260, 交叉熵=3.9120 (严厉 12x)
Escenarios de aplicación en IA
| Escenario | Función de pérdida utilizada |
|---|---|
| Clasificación de imágenes | Entropía cruzada multiclase (CategoricalCrossEntropy) |
| Modelo de lenguaje | La suma de la entropía cruzada en cada posición de token: la función objetivo del entrenamiento de GPT |
| Destilación de conocimiento | Usar las etiquetas suaves del modelo profesor para calcular la entropía cruzada |