ELAI S.r.l.

Imitar un modelo de IA: ¿cubrir todas las posibilidades o centrarse en una?

Un ejemplo ejecutado explica por qué invertir la divergencia KL cambia la mejor aproximación dentro de una familia limitada.

Imitar un modelo de IA: ¿cubrir todas las posibilidades o centrarse en una?

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.

D_KL(p||q) = Σ_i p_i log(p_i/q_i); D_KL(q||p) = Σ_i q_i log(q_i/p_i)

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.

Candidatop || q (nats)q || p (nats)
W0.3371990.853619
L1.5933940.630315
R1.5933940.630315
Comparar barras de igual color entre candidatos: invertir dirección cambia el mínimo de esta familia finita. Logaritmos naturales, sin entrenamiento.
Comparar barras de igual color entre candidatos: invertir dirección cambia el mínimo de esta familia finita. Logaritmos naturales, sin entrenamiento.

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.