Prob-09 — Information theory: entropy, cross-entropy, KL

La loss más usada en clasificación es la cross-entropy — y este módulo te dice qué es y de dónde sale. Entropy mide incertidumbre; cross-entropy mide qué tan mal tu distribución predicha aproxima la real; la KL divergence mide la "distancia" entre distribuciones (y aparece en VAEs, difusión, regularización bayesiana). Cierra el pilar conectando probabilidad con las funciones de coste del deep learning.

Why this matters for ML

La loss más usada en clasificación es la cross-entropy — y este módulo te dice qué es y de dónde sale. Entropy mide incertidumbre; cross-entropy mide qué tan mal tu distribución predicha aproxima la real; la KL divergence mide la "distancia" entre distribuciones (y aparece en VAEs, difusión, regularización bayesiana). Cierra el pilar conectando probabilidad con las funciones de coste del deep learning.

Concepts covered

  • Information content (self-information)
  • Entropy H(p)H(p)
  • Cross-entropy H(p,q)H(p,q)
  • KL divergence DKL(pq)D_{KL}(p|q)
  • Relación cross-entropy = entropy + KL
  • Por qué cross-entropy es la loss de clasificación

Intuition first

🎬 StatQuest "Entropy" y "Cross Entropy"; Aurélien Géron "A Short Introduction to Entropy, Cross-Entropy and KL-Divergence" (YouTube). MML 6.5 / Goodfellow 3.13. Idea: información = "sorpresa"; eventos raros sorprenden más.

Theory & key results

Information content (sorpresa): un evento de probabilidad pp carga logp-\log p de información. Raro (pp chico) → mucha sorpresa; seguro (p=1p=1) → cero. Con log2\log_2 se mide en bits; con ln\ln en nats (lo común en ML).

Entropy: la sorpresa esperada de una distribución pp: H(p)=xp(x)logp(x)=Ep[logp(x)].H(p)=-\sum_x p(x)\log p(x)=\mathbb{E}_{p}[-\log p(x)]. Mide la incertidumbre de pp. Máxima cuando todo es equiprobable (uniforme); cero cuando un resultado es seguro. Una moneda justa: H=1H=1 bit; una moneda cargada: menos.

Cross-entropy: la sorpresa esperada de usar la distribución qq (tu modelo) cuando la realidad es pp: H(p,q)=xp(x)logq(x).H(p,q)=-\sum_x p(x)\log q(x). Es mínima (e igual a H(p)H(p)) cuando q=pq=p. En clasificación, pp es la etiqueta real (one-hot) y qq la predicción (softmax); minimizar H(p,q)H(p,q) empuja qq hacia la verdad. Para etiquetas one-hot se reduce a logq(clase correcta)-\log q(\text{clase correcta}) — exactamente la cross-entropy loss.

KL divergence: cuánta información extra gastas por usar qq en vez de pp: DKL(pq)=xp(x)logp(x)q(x) 0,D_{KL}(p|q)=\sum_x p(x)\log\frac{p(x)}{q(x)}\ \ge 0, con igualdad solo si p=qp=q (desigualdad de Gibbs). No es simétrica (DKL(pq)DKL(qp)D_{KL}(p|q)\neq D_{KL}(q|p)), así que no es una distancia formal, pero funciona como "qué tan distintas son".

La relación que lo une todo: H(p,q)=H(p)+DKL(pq)\boxed{,H(p,q)=H(p)+D_{KL}(p|q),} Como H(p)H(p) (la entropía de las etiquetas reales) es constante respecto a tu modelo, minimizar la cross-entropy loss = minimizar la KL divergence entre tu predicción y la verdad = hacer qq lo más parecido posible a pp. Y minimizar cross-entropy es también MLE (Prob-07). Todo encaja.

Worked example

Moneda justa p=(0.5,0.5)p=(0.5,0.5): H=(0.5log20.5+0.5log20.5)=1H=-(0.5\log_2 0.5 + 0.5\log_2 0.5)=1 bit. Moneda cargada p=(0.9,0.1)p=(0.9,0.1): H=(0.9log20.9+0.1log20.1)0.469H=-(0.9\log_2 0.9+0.1\log_2 0.1)\approx0.469 bits (menos incertidumbre).

Cross-entropy: verdad p=(1,0)p=(1,0) (clase 0), predicción q=(0.8,0.2)q=(0.8,0.2). H(p,q)=(1log0.8+0log0.2)=log0.80.223H(p,q)=-(1\cdot\log 0.8+0\cdot\log 0.2)=-\log 0.8\approx0.223 nats. Si predices mejor q=(0.99,0.01)q=(0.99,0.01): log0.990.01-\log0.99\approx0.01 → loss menor. Así entrena un clasificador.

Notebook exercises (by hand)

  1. Entropy de una distribución uniforme sobre 4 resultados (en bits).
  2. Entropy de p=(0.7,0.3)p=(0.7,0.3).
  3. Cross-entropy H(p,q)H(p,q) con p=(1,0)p=(1,0) y q=(0.6,0.4)q=(0.6,0.4); repítela con q=(0.9,0.1)q=(0.9,0.1) y compara.
  4. Calcula DKL(pq)D_{KL}(p|q) para p=(0.5,0.5)p=(0.5,0.5), q=(0.9,0.1)q=(0.9,0.1); y DKL(qp)D_{KL}(q|p). Confirma que difieren (no simétrica).
  5. Verifica numéricamente H(p,q)=H(p)+DKL(pq)H(p,q)=H(p)+D_{KL}(p|q) en un ejemplo.
  6. Explica por qué, con etiquetas one-hot, la cross-entropy loss es logqclase correcta-\log q_{\text{clase correcta}}.

Python lab

import numpy as np

def entropy(p, base=2):
    p = np.asarray(p); p = p[p > 0]
    return -np.sum(p * np.log(p)) / np.log(base)

def cross_entropy(p, q, base=2):
    p, q = np.asarray(p), np.asarray(q)
    return -np.sum(p * np.log(q)) / np.log(base)

def kl(p, q, base=2):
    p, q = np.asarray(p), np.asarray(q); m = p > 0
    return np.sum(p[m] * np.log(p[m]/q[m])) / np.log(base)

p = np.array([0.5, 0.5]); q = np.array([0.9, 0.1])
print("H(p):", entropy(p))                       # 1.0 bit
print("H(p,q):", cross_entropy(p, q))
print("KL(p||q):", kl(p, q), " KL(q||p):", kl(q, p))   # asimétrica
print("check H(p,q)=H(p)+KL:", np.isclose(cross_entropy(p,q), entropy(p)+kl(p,q)))

# cross-entropy loss de un clasificador (one-hot)
y_true = np.array([1, 0, 0])                     # clase 0
for pred in [[0.6,0.3,0.1], [0.9,0.05,0.05], [0.98,0.01,0.01]]:
    print("loss:", cross_entropy(y_true, np.array(pred), base=np.e))  # baja al mejorar

Examen final 📝

Intenta cada nivel antes de abrir las soluciones.

🟡 Medio

  1. Entropy (en bits) de p=(0.25,0.25,0.25,0.25)p=(0.25,0.25,0.25,0.25) y de p=(0.5,0.25,0.25)p=(0.5,0.25,0.25).
  2. Cross-entropy H(p,q)H(p,q) con p=(1,0)p=(1,0) (clase 0) y q=(0.7,0.3)q=(0.7,0.3), en nats.

🟠 Medio-difícil

  1. Calcula DKL(pq)D_{KL}(p|q) y DKL(qp)D_{KL}(q|p) para p=(0.5,0.5)p=(0.5,0.5), q=(0.25,0.75)q=(0.25,0.75) y confirma la asimetría.
  2. Verifica numéricamente la identidad H(p,q)=H(p)+DKL(pq)H(p,q)=H(p)+D_{KL}(p|q) con los valores del ej. 3 (usa qq como predicción y pp como verdad).

🔴 Difícil

  1. Demuestra que DKL(pq)0D_{KL}(p|q)\ge0 con igualdad sólo si p=qp=q (desigualdad de Gibbs; usa lnxx1\ln x\le x-1).
  2. Demuestra que para etiquetas one-hot, minimizar la cross-entropy H(p,q)H(p,q) equivale a maximizar la log-likelihood del modelo (conecta Prob-07 y Prob-09), y explica por qué la entropía de las etiquetas H(p)H(p) no afecta la optimización.
✅ Soluciones
  1. Uniforme sobre 4: H=log24=2H=\log_2 4=2 bits. (0.5,0.25,0.25)(0.5,0.25,0.25): H=(0.5log20.5+20.25log20.25)=0.5+1=1.5H=-(0.5\log_2 0.5+2\cdot0.25\log_2 0.25)=0.5+1=1.5 bits.
  2. H(p,q)=ln(0.7)0.357H(p,q)=-\ln(0.7)\approx0.357 nats.
  3. DKL(pq)=0.5log20.50.25+0.5log20.50.75=0.5(1)+0.5(0.585)=0.2075D_{KL}(p|q)=0.5\log_2\frac{0.5}{0.25}+0.5\log_2\frac{0.5}{0.75}=0.5(1)+0.5(-0.585)=0.2075 bits. DKL(qp)=0.25log20.250.5+0.75log20.750.5=0.25(1)+0.75(0.585)=0.189D_{KL}(q|p)=0.25\log_2\frac{0.25}{0.5}+0.75\log_2\frac{0.75}{0.5}=0.25(-1)+0.75(0.585)=0.189 bits. Distintos ⇒ asimétrica.
  4. H(p)=1H(p)=1 bit; H(p,q)=0.5log20.250.5log20.75=1+0.2075=1.2075H(p,q)=-0.5\log_2 0.25-0.5\log_2 0.75=1+0.2075=1.2075; y H(p)+DKL=1+0.2075=1.2075H(p)+D_{KL}=1+0.2075=1.2075 ✓.
  5. DKL(pq)=plnqpp(qp1)=qp=11=0-D_{KL}(p|q)=\sum p\ln\frac{q}{p}\le\sum p(\frac{q}{p}-1)=\sum q-\sum p=1-1=0 (usando lnxx1\ln x\le x-1). Luego DKL0D_{KL}\ge0; igualdad sólo cuando q/p=1q/p=1 en todo el soporte, i.e. p=qp=q.
  6. Con pp one-hot (clase correcta cc), H(p,q)=logqcH(p,q)=-\log q_c = la NLL de esa observación. Sumar sobre el dataset = NLL total = -log-likelihood, así que minimizar CE = maximizar likelihood (MLE). Como H(p,q)=H(p)+DKL(pq)H(p,q)=H(p)+D_{KL}(p|q) y H(p)H(p) es constante respecto a los parámetros del modelo, minimizar CE = minimizar KL, sin que H(p)H(p) influya en el argmin\arg\min.