Para que una red pueda mejorar, necesita una señal que le diga qué tan equivocada está y en qué dirección corregirse. La función de pérdida es esa señal.
Imagina dos meteorólogos que hacen sus predicciones en forma de apuesta. El día de ayer:
Y efectivamente llovió. ¿A quién castigas más? Al B, que estaba casi seguro de que no llovería. Eso es exactamente lo que hace la entropía cruzada: penaliza más a quien estaba más equivocado.
-log(p) captura eso matemáticamente.
Si el modelo le dio p=0.90 a la respuesta correcta, la penalización es pequeña: -log(0.90) = 0.10.
Si le dio p=0.10, la penalización es alta: -log(0.10) = 2.30.
Si le dio p=0.01, la penalización es enorme: -log(0.01) = 4.60.
No necesitas saber cálculo para entender esto. Solo necesitas saber que el logaritmo tiene una propiedad clave: cuando p se acerca a 1 (mucha confianza correcta), el valor es cercano a 0. Cuando p se acerca a 0 (mucha confianza equivocada), el valor es enorme.
La curva sube exponencialmente cuando p se acerca a 0. Cuanto menos le crees a la respuesta correcta, más te penaliza.
| Prob. asignada (p) | -log(p) | Interpretación |
|---|---|---|
| p = 0.99 | 0.01 | Muy seguro y correcto ✅ |
| p = 0.90 | 0.10 | Muy seguro y correcto ✅ |
| p = 0.50 | 0.69 | Mitad y mitad 🤔 |
| p = 0.10 | 2.30 | Poco seguro, pero correcto ⚠️ |
| p = 0.037 | 3.30 | Igual que azar (1/27) — inicio del entrenamiento |
| p = 0.01 | 4.60 | Muy seguro pero muy equivocado ❌ |
El modelo calcula 27 logits (uno por posible siguiente carácter): logits = [0.3, -1.2, 0.8, -0.5, 0.2, ..., 2.1, ...] ↑ índice 24 = 'y' Paso 1: Softmax — convertir logits a probabilidades Para cada logit: exp(logit) / suma(exp(todos los logits)) Supongamos que softmax da: p('a') = 0.04, p('b') = 0.01, ... p('y') = 0.72 ← la respuesta correcta p('z') = 0.02, ... Paso 2: Pérdida para este token loss = -log(p('y')) = -log(0.72) = 0.33 ← pérdida baja, el modelo lo hizo bien ✅ --- Ahora supongamos un modelo mal entrenado: p('y') = 0.04 ← le da poca probabilidad a la respuesta correcta loss = -log(0.04) = 3.22 ← pérdida alta, necesita mejorar ❌
En la práctica no calculamos la pérdida para un solo token — la calculamos para todos los tokens de todos los nombres y promediamos. A ese promedio lo llamamos la cross-entropy loss (entropía cruzada).
Al inicio del entrenamiento, los pesos de la red son aleatorios. Eso significa que el modelo no sabe nada — asigna probabilidades casi iguales a todos los 27 tokens. Probabilidad uniforme para cada token: p = 1/27 = 0.037 Pérdida para un token cuando el modelo no sabe nada: loss = -log(0.037) = 3.30 Por eso el artículo de Karpathy dice: "La pérdida empieza en ~3.3" → Es exactamente lo que esperamos si el modelo no aprendió nada. Después de 1000 pasos de entrenamiento, la pérdida baja a ~2.37. Eso significa que el modelo ya sabe algo: algunas letras son mucho más probables que otras después de cada carácter.
Una pregunta razonable. Si el modelo da p=0.9 al carácter correcto, el "error" podría ser simplemente 1 - 0.9 = 0.1. ¿Por qué usar logaritmos?
Dos razones:
-log(p) castiga mucho más que 1-p cuando el modelo está muy equivocado. Si p=0.01, entonces 1-p=0.99 (parece cerca de 1), pero -log(0.01)=4.6 (enorme penalización). Eso crea una señal de aprendizaje mucho más clara.-log(softmax(logits)) tiene una forma muy limpia que simplifica el cálculo del backpropagation. El gradiente es simplemente p - 1 para el token correcto y p para los incorrectos.loss = -log(p_correcta).