Skip to content

English · Español

Lab 01 — Divergencia KL y entropía cruzada

Lee theory/02-entropy-and-kl.md y theory/03-cross-entropy-and-mle.md. No consultes solutions/.

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):

  1. Calcula \(H(p)\), \(D_{\text{KL}}(p \,\|\, q)\), \(H(p, q)\) de forma independiente.
  2. 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

  1. 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").
  2. 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

  • kl y cross_entropy implementadas; pasan los property tests.
  • Identidad de descomposición verificada dentro de 1e-10 para 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 de pytest debe hacer assert 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