English · Español
Lab 01 — Divergencia KL y entropía cruzada¶
Lee
theory/02-entropy-and-kl.mdytheory/03-cross-entropy-and-mle.md. No consultessolutions/.
Objetivo¶
Implementar divergencia KL (KL divergence) y entropía cruzada (cross-entropy) sobre distribuciones categóricas. Verificar empíricamente la identidad de descomposición \(H(p, q) = H(p) + D_{\text{KL}}(p \,\|\, q)\). Reproducir la demostración de la desigualdad de Gibbs.
Configuración¶
Continúa con el alfabeto de 5 tiempos.
Tareas¶
Tarea 1 — implementa kl(p, q) y cross_entropy(p, q)¶
En src/phase05/probability.py, añade:
def kl(p: NDArray[np.float64], q: NDArray[np.float64]) -> float:
"""D_KL(p || q) in nats. +inf if p has support outside q's."""
def cross_entropy(p: NDArray[np.float64], q: NDArray[np.float64]) -> float:
"""H(p, q) = -sum_i p_i log q_i, in nats."""
Restricciones:
- NumPy puro.
- Maneja \(p_i = 0\) mediante la convención \(0 \log(0/q_i) = 0\).
- Devuelve
+np.inf(no lanza) cuando \(p_i > 0\) y \(q_i = 0\). - Valida entradas (igual que
entropy).
Tarea 2 — verifica la identidad de descomposición¶
Para 100 pares aleatorios \((p, q)\) desde Dirichlet(1, ..., 1):
- Calcula \(H(p)\), \(D_{\text{KL}}(p \,\|\, q)\), \(H(p, q)\) de forma independiente.
- Comprueba \(\big| H(p) + D_{\text{KL}}(p \,\|\, q) - H(p, q) \big| < 10^{-10}\).
Añade como property test de pytest: tests/test_phase05_decomposition.py.
Tarea 3 — reproduce la desigualdad de Gibbs numéricamente + sobre papel¶
- Escribe a mano la demostración de Jensen de \(D_{\text{KL}}(p \,\|\, q) \ge 0\) (espeja
theory/02-entropy-and-kl.md§"Demostración de la no negatividad"). - Numéricamente: para 1000 pares aleatorios \((p, q)\), verifica \(D_{\text{KL}}(p \,\|\, q) \ge 0\) — pero también verifica \(D_{\text{KL}}(p \,\|\, q) = 0\) si y sólo si \(p = q\) comprobando los casos en los que pones \(q = p\).
Tarea 4 — asimetría¶
Calcula \(D_{\text{KL}}(p \,\|\, q)\) vs \(D_{\text{KL}}(q \,\|\, p)\) para:
| Caso | \(p\) | \(q\) |
|---|---|---|
| A | \((0.5, 0.5, 0, 0, 0)\) | \((0.2, 0.2, 0.2, 0.2, 0.2)\) |
| B | \((0.2, 0.2, 0.2, 0.2, 0.2)\) | \((0.5, 0.5, 0, 0, 0)\) |
¿Qué ocurre en el caso B? ¿Por qué? Documenta.
Tarea 5 — entropía cruzada sobre el modelo verbal (mirando hacia delante)¶
Imagina que el modelo emite \(q = (0.6, 0.1, 0.1, 0.1, 0.1)\) y la verdad de referencia es \(p = (1, 0, 0, 0, 0)\) (pasado). Calcula:
- \(H(p, q)\)
- \(-\log q_{y^*}\) donde \(y^* = 0\) (pasado).
Deberían ser iguales — e iguales a la log-verosimilitud negativa de la etiqueta verdadera bajo el modelo. Esta es la forma que conectaremos en el autograd de la Fase 07.
Mediciones a capturar¶
- Tiempo de pared por par de
kl(p, q)en \(V = 600\). - Test de identidad de descomposición: 100 casos, todos pasan dentro de tolerancia.
- Tabla de asimetría (Tarea 4) guardada como
experiments/<date>-phase-05-kl/asymmetry.csv.
Aceptación¶
-
klycross_entropyimplementadas; pasan los property tests. - Identidad de descomposición verificada dentro de
1e-10para 100 pares aleatorios. - Demostración de Gibbs reproducida en tus notas.
- Estudio de caso de la asimetría documentado.
- Comprobación de presagio de la Fase 07 (Tarea 5) confirmada numéricamente.
Escollos esperados¶
- La KL con soporte incompatible debe devolver
+inf, no lanzar. El test depytestdebe hacerassert np.isposinf(kl(p, q))para el caso incompatible. - La asimetría confunde la primera vez — escribe tus notas explícitamente para que tu yo futuro no recuerde mal qué lado es cuál. Convención aquí: \(p\) es siempre la distribución verdadera (o empírica), \(q\) es el modelo.
- No compares \(D_{\text{KL}}(p \,\|\, q)\) entre distintos \(V\) — la KL tiene unidades en nats y las magnitudes no son directamente comparables entre tamaños de vocabulario.
Siguiente: 02-log-sum-exp.md