13 Inferencia y decodificación
Dónde estamos. Tenemos un modelo entrenado (Cap. 11). Pero un modelo no “suelta” una respuesta entera: la escribe palabra a palabra. Este capítulo explica cómo se genera texto —elegir el siguiente token, la temperatura, top-k/top-p— y el KV-cache, la pieza que hace la generación rápida… y que crece hasta convertirse en un cuello de botella. Con él cerramos los fundamentos (Parte I) y abrimos la puerta a nuestra Parte II.
13.1 La idea en una frase
Generar es un bucle: el modelo predice el siguiente token, se elige uno, se añade al texto, y se vuelve a empezar —token a token hasta terminar—.
13.2 Conceptos clave y su papel en el transformer
Antes de entrar en detalle, definimos los términos de este capítulo y para qué sirve cada uno dentro de un transformer:
- Bucle autoregresivo. Definición: predecir → elegir → añadir → repetir, token a token. En el transformer: es cómo “escribe” un modelo; cada elección se condiciona en todo lo anterior.
- Logits. Definición: las puntuaciones crudas que el modelo asigna a cada token del vocabulario antes del softmax. En el transformer: el punto de partida de toda estrategia de decodificación.
- Greedy / beam search. Definición: tomar siempre el token más probable (greedy) o mantener las B secuencias más probables (beam). En el transformer: deterministas y buenas en tareas cerradas, pero repetitivas en texto abierto.
- Sampling (muestreo). Definición: elegir al azar según la distribución. En el transformer: aporta variedad, pero el muestreo puro a veces pesca tokens raros de la cola.
- Temperatura. Definición: divide los logits antes del softmax,
softmax(logits/T). En el transformer: regula cuánto se “atreve”; T<1 cauto, T>1 creativo, T→0 greedy. - Top-k. Definición: muestrear solo entre los k tokens más probables. En el transformer: corta la cola con un k fijo, esté el modelo seguro o dudando.
- Top-p / nucleus. Definición: muestrear del conjunto mínimo cuya probabilidad acumulada llega a p. En el transformer: el número de candidatos se adapta a la confianza del modelo; es el estándar actual.
- KV-cache. Definición: almacén de las claves (K) y valores (V) de los tokens pasados. En el transformer: hace la generación rápida (no recomputa el pasado), pero crece con la longitud → cuello de botella de memoria.
Con estas piezas entendidas, el resto del capítulo es verlas trabajar juntas en cada paso de la generación.
13.3 El bucle autoregresivo
Esto es, literalmente, “escribir” para un modelo:
- Mirar todo lo escrito hasta ahora → predecir la distribución del siguiente token.
- Elegir un token de esa distribución (las estrategias vienen ahora).
- Añadirlo al texto.
- Repetir, hasta un token de fin o un límite de longitud.
Cada elección se condiciona en todo lo anterior. Por eso un modelo puede escribir de forma coherente: cada palabra “ve” las que ya ha puesto.
13.4 De logits a una elección: las estrategias de decodificación
El modelo da unas puntuaciones (logits) → probabilidades. ¿Qué token tomamos?
- Greedy (voraz): siempre el más probable. Determinista, pero repetitivo y soso, y puede entrar en bucles. (Sutil: elegir el más probable en cada paso no da la secuencia globalmente más probable —es óptimo local—.)
- Beam search: mantiene las B secuencias parciales más probables y al final se queda con la mejor. Va bien en tareas con respuesta “correcta” (traducir, resumir), pero en texto abierto sale igual de blando y repetitivo.
- Sampling (muestreo): elige al azar según la distribución → variedad. Pero el muestreo puro a veces pesca tokens raros de la “cola” y suelta incoherencias.
Las dos siguientes ideas arreglan justo eso.
13.5 Temperatura
La temperatura regula cuánto se “atreve” el modelo. Se aplica a los logits antes del softmax:
\[ \text{softmax}(\text{logits} / T) \]
Qué hace T:
- T < 1 → agudiza la distribución: más peso al token dominante (cauto, confiado).
- T > 1 → la aplana: reparte entre más opciones (creativo, arriesgado).
- T → 0 → equivale a greedy (siempre el más probable).
🧩 Analogía. T baja = un escritor prudente que usa siempre la palabra obvia; T alta = uno atrevido que prueba palabras inesperadas (a veces brillante, a veces incoherente). (Ojo: la temperatura se aplica a los logits, no a las probabilidades ya normalizadas.)
13.6 Top-k y top-p (nucleus)
En vez de muestrear de todo el vocabulario, restringimos a los candidatos buenos:
- Top-k (Fan et al. 2018): muestrea solo entre los k tokens más probables. Pega con un k fijo, dé igual si el modelo está seguro o dudando.
- Top-p / nucleus (Holtzman et al. 2020): muestrea del conjunto más pequeño de tokens cuya probabilidad acumulada llega a p (p. ej. 0.92). El número de candidatos se adapta: pocos cuando el modelo está seguro, más cuando duda.
¿Por qué ganan? Cortan la cola poco fiable (mejor que el muestreo puro) y evitan la repetición/degeneración del greedy y el beam search. Es el punto dulce entre coherencia y variedad —por eso top-p es el más usado hoy—.
(Hay además parches contra repeticiones: la repetition penalty baja el logit de lo ya dicho, y no-repeat-ngram prohíbe repetir grupos de palabras.)
import torch, torch.nn.functional as F
def siguiente_token(logits, T=0.8, p=0.92):
logits = logits / T # temperatura
probs = F.softmax(logits, dim=-1)
orden = probs.argsort(descending=True) # nucleus (top-p):
acum = probs[orden].cumsum(0)
corte = (acum >= p).nonzero()[0].item() + 1 # el "núcleo" mínimo
elegidos = orden[:corte]
return elegidos[torch.multinomial(probs[elegidos], 1)] # muestrear del núcleo13.7 El KV-cache: el puente a la Parte II
Aquí está la pieza que conecta con todo lo que viene. Sin ella, generar el token número n obligaría a recomputar la atención sobre todos los anteriores en cada paso —un desperdicio enorme—.
La solución: el KV-cache guarda las claves (K) y valores (V) de los tokens pasados. Así, cada token nuevo solo calcula lo suyo y atiende a lo ya guardado.
- Para qué sirve: hace la generación rápida (no recomputa el pasado).
- El problema: el cache crece linealmente con la longitud × capas × cabezas → se convierte en el principal cuello de botella de memoria en contexto largo.
🧩 Analogía. En vez de releer toda la página desde el principio antes de escribir cada palabra, guardas unas notas de lo leído (las K/V) y solo las consultas —pero esas notas ocupan cada vez más sitio en la mesa—.
Ese cache que crece sin parar es justo lo que abordamos en la Parte II: derivamos de γ una ventana de compresión del KV-cache (qué tokens conservar y cuáles descartar, sin parámetros que ajustar), y veremos cómo GQA/MQA lo encogen compartiendo K/V entre cabezas. El “problema del KV-cache” es una de las puertas a nuestro territorio único.
13.8 Resumen
- Generar = bucle autoregresivo: predecir → elegir → añadir → repetir, token a token.
- Greedy (repetitivo), beam (bueno en tareas cerradas), sampling (variado pero a veces incoherente).
- Temperatura
softmax(logits/T): T<1 cauto, T>1 creativo, T→0 greedy. - Top-k (k fijo) y top-p/nucleus (adaptativo) cortan la cola poco fiable → el punto dulce; top-p es el estándar.
- El KV-cache cambia memoria por velocidad: acelera la generación pero crece con la longitud → cuello de botella que la Parte II ataca (ventana D_f, GQA/MQA).
- La decodificación es inferencia (modelo ya entrenado), no entrenamiento.
Fin de la Parte I. Ya entiendes un transformer completo: de los tokens a la generación, pieza por pieza. Siguiente (Parte II): entramos en nuestro terreno — cómo atiende un modelo a lo largo de la distancia, la ley de decaimiento γ, y las herramientas que salen de ella—.
13.9 Ejercicios
- Greedy. Da un ejemplo intuitivo de por qué elegir la palabra más probable en cada paso puede no dar la frase más probable.
- Temperatura. ¿Qué T usarías para (a) un asistente de código fiable; (b) un generador de ideas creativas? ¿Por qué?
- Top-p adaptativo. Explica por qué top-p considera menos candidatos cuando el modelo está seguro y más cuando duda. ¿Qué ventaja tiene sobre top-k?
- KV-cache. ¿Por qué la generación se vuelve más lenta y consume más memoria a medida que el texto crece? ¿Qué intercambia el cache?