Una cifra mejor puede ocultar otra unidad
Queremos elegir un modelo lingüístico para leer informes de mantenimiento. Dos candidatos se evalúan sobre el mismo texto: uno tiene perplejidad 2 y otro aproximadamente 3,17. Como normalmente se prefiere una perplejidad menor, podríamos elegir el primero. Pero ¿qué cuenta el denominador? Si un modelo divide una palabra en tres fragmentos y otro la trata como un elemento, realizan distinto número de predicciones. Compararlos directamente puede premiar la división del texto en lugar de la probabilidad asignada al propio texto.
Resumen. Deducimos la perplejidad de las probabilidades de tokens y mostramos una inversión de clasificación con tres modelos probabilísticos sintéticos. Normalizamos después la sorpresa total por los bytes del mismo texto, sin confundirlo con una evaluación universal de capacidades. Examinamos agregación de documentos, Unicode, contexto y diferencia entre probabilidad de una tokenización y de una cadena. No entrenamos ni ejecutamos redes neuronales: las probabilidades condicionales son datos didácticos explícitos y Python recalcula todos los resultados.
Tokens y probabilidades: qué se predice
Un tokenizador convierte texto en una secuencia de elementos llamados tokens: palabras, fragmentos, espacios u otras unidades del vocabulario. Un modelo autorregresivo asigna probabilidades al siguiente token utilizando los anteriores. Para evaluar texto conocido miramos la probabilidad de los tokens observados, no la de los que elegiría como respuesta más probable. Este artículo considera solo esa evaluación causal.
La probabilidad de una secuencia de tokens es el producto de las probabilidades condicionales. «Condicional» significa que cada valor puede depender del prefijo; no suponemos independencia. Para evitar productos muy pequeños sumamos logaritmos negativos. En base 2, la cantidad se mide en bits y se interpreta como sorpresa: un evento de probabilidad 1/2 aporta un bit; uno de probabilidad 1/4, dos.
N es el número de tokens evaluados y L_bits la sorpresa total. La perplejidad, PPL, eleva exponencialmente la sorpresa media por token. Logaritmos naturales y exponencial natural dan el mismo resultado si se usan de forma coherente. PPL no es un porcentaje de respuestas correctas. Una probabilidad cero para un token observado genera sorpresa infinita; las aproximaciones numéricas deben declararse, no repararse en silencio.
La frase guía: «motore caldo»
Conservamos la misma frase italiana en todas las versiones, porque traducirla cambiaría el experimento. «motore caldo» contiene doce bytes UTF-8: seis letras, un espacio y cinco letras. El modelo sintético A la divide en [mo, to, re, espacio, cal, do], seis tokens. Asigna probabilidad 1/2 a cada token observado dado su prefijo. La probabilidad de la secuencia es (1/2)⁶=1/64, la sorpresa total seis bits y PPL=2^(6/6)=2.
B utiliza tres tokens, [motore, espacio, caldo], con probabilidad 1/4 cada uno. Obtenemos (1/4)³=1/64 y los mismos seis bits totales. Pero la media ahora es dos bits por token: PPL=2^(6/3)=4. El valor se duplicó sin cambiar la probabilidad de la secuencia que representa la frase. No demostramos que A entienda mejor el dominio: cambiamos el número de unidades promediadas.
C usa los tres tokens de B con probabilidades [1/2, 1/4, 1/4]. El producto es 1/32, el doble de la probabilidad de A para la secuencia. La sorpresa baja a cinco bits, pero PPL=2^(5/3)≈3,1748 sigue superando 2. Una clasificación ingenua elige A aunque C asigne más probabilidad a esa secuencia. Es el caso de la apertura. No simulamos las demás probabilidades del vocabulario: pueden recibir la masa restante para completar cada distribución.
| Modelo | Tokens | Probabilidad secuencia | Bits totales | PPL | Bits/byte |
|---|---|---|---|---|---|
| A | 6 | 1/64 | 6 | 2 | 0.5 |
| B | 3 | 1/64 | 6 | 4 | 0.5 |
| C | 3 | 1/32 | 5 | 3.1748 | 0.4167 |
Un denominador común: los bytes del texto
Para eliminar esa diferencia de unidades dividimos la sorpresa total por B, el número de bytes UTF-8 del texto realmente evaluado. Llamamos al resultado BPB, bits por byte. Aquí B es un conteo, no el modelo de la tabla. El denominador debe cubrir exactamente el contenido que contribuye al numerador:
A y B dan 6/12=0,5 bits por byte; C da 5/12≈0,4167. La comparación coincide con las probabilidades de las secuencias: A y B empatan y C asigna mayor probabilidad. La segunda forma explica por qué PPL no basta: hacen falta N y B. Otra normalización no crea evidencia nueva; explicita la unidad de una medida ya calculada.

Un byte no es una letra, ni una lengua es otra
ASCII es cómodo porque cada carácter ocupa un byte, pero UTF-8 no funciona así para todo texto. El programa comprueba que «é» precompuesta ocupa dos bytes, «e» más acento combinante ocupa tres y el carácter chino «热» ocupa tres. La normalización Unicode NFC unifica las primeras dos representaciones, pero aplicarla es una decisión de preprocesamiento que debe fijarse antes de evaluar y ser idéntica para todos los candidatos.
Comparar modelos sobre el mismo corpus byte a byte elimina la ambigüedad del denominador. No hace equivalente un corpus italiano a su traducción china: cambian bytes, construcciones y distribuciones. Un BPB menor en una lengua no demuestra por sí solo mayor competencia en ella. Las cuatro versiones editoriales traducen el razonamiento y mantienen deliberadamente idéntica la cadena experimental.
Cómo agregar documentos sin cambiar la pregunta
Supongamos un documento de 12 bytes con 6 bits de sorpresa y otro de 120 bytes con 12 bits. Sus BPB son 0,5 y 0,1. La media simple es 0,3, pero el corpus tiene 132 bytes y 18 bits: su BPB es 18/132≈0,13636. La media simple pondera igual cada documento; el cociente de sumas pondera igual cada byte. Ambas estadísticas son definibles, pero responden a preguntas distintas y no deben confundirse.
Lo mismo vale para PPL: la perplejidad del corpus no es la media aritmética de las perplejidades documentales. Se suman pérdidas de tokens evaluados, se divide por su conteo y después se exponencia. Si el objetivo operativo pondera igual cada expediente, esa agregación puede ser intencionada, pero debe declararse junto a la medida del corpus. El denominador es una decisión de evaluación, no un detalle del informe.
Contexto, máscaras y límites forman parte de la medida
El modelo evalúa un token dado el contexto, no aisladamente. Reiniciar el texto previo en cada bloque cambia el problema. La guía de Hugging Face trata ventanas separadas y deslizantes y código para evitar contar dos veces tokens. Leímos definición, método y código; no ejecutamos su benchmark GPT-2 ni presentamos sus cifras como propias.
Nuestro ejemplo cuenta todas las probabilidades desde un contexto inicial convencional. Excluye el token de fin de secuencia: evalúa la continuación textual, no la decisión de terminar ahí. Las comparaciones reales deben alinear inicio, final, prompt, plantillas, separadores y tokens excluidos. Si solo se evalúan respuestas, no se puede dividir la pérdida por todos los bytes de prompt y respuesta: reduciría artificialmente el resultado.
Dar a dos tokenizadores la misma ventana de 1.000 tokens tampoco garantiza igual contexto textual: pueden cubrir partes distintas del informe. Hay que declarar qué información recibe cada modelo. El caso sintético evita esa dificultad: la frase es corta y cada probabilidad usa todo su prefijo. En un corpus real sigue siendo una decisión experimental que documentar, no algo que BPB resuelva automáticamente.
La cautela sutil: secuencia y cadena no siempre tienen igual probabilidad
Hemos dicho deliberadamente «probabilidad de la secuencia». Si distintas secuencias de tokens se decodifican al mismo texto, su probabilidad total debe sumar las contribuciones admitidas con criterios coherentes de límites y terminación. Un tokenizador determinista puede escoger una secuencia canónica, mientras el modelo generativo da probabilidad a otras que producen los mismos caracteres. Evaluar solo la canónica no realiza esa suma.
Un ejemplo abstracto muestra la diferencia: dos secuencias completas y excluyentes que decodifican «ab» tienen probabilidades 0,02 y 0,08. La probabilidad de la cadena es 0,10; un evaluador que selecciona la primera registra 0,02. No implementamos la marginalización sobre todos los recorridos de un tokenizador real. Nuestros BPB son pérdida normalizada de la secuencia elegida, no una promesa de verosimilitud textual exacta e independiente de toda tokenización.
Qué evaluar en un modelo especializado
En informes de mantenimiento excluidos del entrenamiento, la pérdida lingüística mide cuán previsible considera el modelo el texto del dominio. No mide automáticamente identificación del fallo, conservación de unidades, cumplimiento de procedimientos ni causas inventadas. Puede asignar alta probabilidad a frases frecuentes pero inútiles para decidir. La selección necesita pruebas de tarea junto a métricas lingüísticas, errores relevantes y protocolo separado. No presentamos resultados aplicados que no ejecutamos.
Respuesta: aclarar la unidad antes de clasificar
Distintas perplejidades no implican necesariamente distinta calidad lingüística: pueden promediar sorpresa sobre unidades diferentes. A obtiene 2 y C unos 3,17, pero C da mayor probabilidad a la secuencia de la misma frase. Normalizar por bytes revela ese hecho sin resolver contexto, preprocesamiento, secuencias alternativas ni utilidad. Primero hay que preguntar qué pérdida se midió, sobre qué contenidos y bajo qué condiciones; después tiene sentido comparar cifras.
El código reproduce los tres valores. El archivo incluye tokens, probabilidades, comprobaciones de reconstrucción, agregación, ejemplos Unicode y datos gráficos. Todo es determinista, sin semilla. Calcular puntuaciones recorre N probabilidades una vez: O(N), sin incluir inferencia de un modelo real. La figura usa números guardados en JSON. La documentación respalda definición y cautela metodológica; los ejemplos son análisis didáctico independiente.
Fuente y código
Hugging Face Transformers — Perplexity of fixed-length models.
from math import log2
text = "motore caldo"
for name, probs in [("A", [.5]*6), ("B", [.25]*3), ("C", [.5,.25,.25])]:
bits = -sum(log2(p) for p in probs)
ppl = 2**(bits/len(probs))
bpb = bits/len(text.encode("utf8"))
print(name, bits, ppl, bpb)
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 3 de octubre de 2026.

