Las mismas probabilidades, dos formas de equivocarse
Un modelo pequeño aproxima una distribución más rica. Penalizar lo que omite no equivale a penalizar propuestas sin respaldo cuando sus posibilidades están restringidas. La divergencia Kullback–Leibler, KL, tiene dirección. Invertir argumentos cambia la aproximación elegida. Usamos tres categorías y candidatos, no entrenamiento de grandes modelos.
¿Quién pondera cada error?
p es referencia y q candidata, probabilidades no negativas que suman uno en iguales categorías. Logaritmos naturales dan nats. D_KL(p||q) pondera log(p_i/q_i) por p_i; al invertir, pondera log(q_i/p_i) por q_i. No es métrica: no es simétrica ni exige desigualdad triangular. «Pérdida KL» omite parte esencial del objetivo.
Con p fijo, el primer criterio minimiza entropía cruzada −Σ p_i log q_i porque Σ p_i log p_i es constante. Las categorías importantes para p siguen pesando aunque q las ignore. En el inverso q decide cuánto contribuye cada región. La intuición no prueba que toda KL inversa elija un modo: importan los límites de la familia candidata.
Un contraste totalmente reproducible
p=(0,495;0,01;0,495) tiene extremos frecuentes y centro raro. q_W=(0,34;0,32;0,34) cubre extremos pero sobrepondera centro. q_L=(0,98;0,01;0,01) favorece el primero; q_R es su reflejo. Son toda la familia permitida, no óptimos atribuidos a una red gaussiana o arquitectura.
En p||q_L el tercer término 0,495·log(0,495/0,01) es grande: casi elimina un evento frecuente. En q_W||p el centro 0,32·log(0,32/0,01) penaliza sobreproducir una categoría rara. Términos individuales pueden ser negativos, pero la suma no. El cálculo elige W para p||q y empata L, R para q||p.
| Candidato | p || q (nats) | q || p (nats) |
|---|---|---|
| W | 0.337199 | 0.853619 |
| L | 1.593394 | 0.630315 |
| R | 1.593394 | 0.630315 |

Los ceros cambian el dominio, no solo el valor
Un término de peso cero contribuye cero por convenio. Pero p_i>0 con q_i=0 hace infinito p||q. El candidato (0,99;0,01;0) tiene KL directa infinita e inversa finita frente a p positivo. Añadir epsilon elimina infinito pero cambia la distribución: hay que renormalizar y declarar el problema aproximado.
Sin restricciones ambas eligen la referencia
Quitando la restricción, q=p da cero en ambas y no puede mejorarse. Para distribuciones positivas log z≤z−1 implica Σp_i log(q_i/p_i)≤Σ(q_i−p_i)=0; al negar, KL≥0. La igualdad exige q=p, tratando soportes incompletos aparte. La discrepancia nace de restricciones de representación, no de verdades incompatibles.
Las derivadas por coordenadas positivas son −p_i/q_i y log(q_i/p_i)+1. Una parametrización normalizada necesita regla de la cadena y restricción de suma; no son actualizaciones listas. Entrenar exige muestreo, estimación de gradientes y análisis de familia, no ejecutados aquí; no medimos calidad del texto.
Elegir dirección es elegir la comparación
Invertir KL no es cosmético: cambia el candidato preferido al ponderar de otro modo regiones omitidas o sobrerrepresentadas. En destilación y generación hay que fijar referencia, candidata, soporte y límites antes de elegir pérdida. Cobertura y concentración son intuiciones a verificar, no experimentos sustitutos. La fuente define; el contraste finito es análisis didáctico reproducible.
SciPy 1.18.0 — Relative entropy.
import math,json,sys
from pathlib import Path
p=[.495,.01,.495];candidates={'wide':[.34,.32,.34],'left':[.98,.01,.01],'right':[.01,.01,.98]}
def kl(a,b):
assert abs(sum(a)-1)<1e-12 and abs(sum(b)-1)<1e-12
if any(x>0 and y==0 for x,y in zip(a,b)):return math.inf
return math.fsum(x*math.log(x/y) for x,y in zip(a,b) if x>0)
rows=[dict(name=k,q=q,forward=kl(p,q),reverse=kl(q,p)) for k,q in candidates.items()]
assert min(rows,key=lambda x:x['forward'])['name']=='wide'
assert rows[1]['reverse']<rows[0]['reverse'] and abs(rows[1]['reverse']-rows[2]['reverse'])<1e-12
assert kl(p,p)==0 and math.isinf(kl(p,[.99,.01,0])) and math.isfinite(kl([.99,.01,0],p))
r=dict(python=sys.version.split()[0],seed=None,scope='Exact finite candidate comparison, not training or inference benchmark',p=p,rows=rows,hardReverse=kl([.99,.01,0],p),hardForward='infinite',units='nats, natural logarithms')
Path(__file__).with_name('results.json').write_text(json.dumps(r,indent=2),encoding='utf8')
Código, datos e instrucciones · JSON. Cálculos didácticos ejecutados con Python 3.14.0; figuras con Matplotlib 3.11.2. Análisis asistido por IA, sin afirmar revisión por pares ni humana. Portada original ImageGen ilustrativa: no documenta personas, sedes ni instalaciones de EL-AI. Fuentes consultadas el 25 de octubre de 2026.

