Después de pasar por todos los bloques, tenemos vectores procesados. Ahora hay que convertirlos en una predicción concreta: ¿cuál es la siguiente palabra? Acá se cierra el ciclo de generación.
Este es el paso final del "forward pass": tomar el vector procesado y convertirlo en una palabra concreta.
Convertir el vector final en una probabilidad sobre todo el vocabulario, y a partir de ahí elegir la siguiente palabra que el modelo va a generar.
La salida concreta: traduce los vectores abstractos a algo usable (una palabra). También permite controlar la "creatividad" del modelo (temperatura, sampling).
Sin este paso, el modelo solo produce vectores de números que nadie entiende. Es lo que cierra la brecha entre "cómputo interno" y "texto que leés en pantalla".
↓ A continuación, el detalle con ejemplos y visualizaciones ↓
Recapitulemos. Le dimos al modelo la frase "el perro come" y queremos que prediga la siguiente palabra. Hasta ahora:
Vector final de "come" (después de los N bloques): vec_final = [+0.85, -0.42, +0.33, +1.20] (dim 4) Este vector ya "entiende" que viene después de "el perro come". Nuestra tarea: convertirlo en una predicción de palabra.
Primer paso: convertir el vector (dim 4) en un puntaje por cada palabra del vocabulario. Si el vocabulario tiene 8 palabras, necesitamos 8 puntajes. Esos puntajes se llaman logits.
[d_model × vocab_size]. Es básicamente lo opuesto al paso 2: en lugar de "palabra → vector", hace "vector → puntaje por palabra".
[dim 4] · [4 × 8] = [dim 8] — un puntaje por cada una de las 8 palabras del vocabulario
En muchos modelos, la matriz de unembedding es literalmente la matriz de embeddings del paso 2, pero traspuesta (filas ↔ columnas). Esto se llama "weight tying" y ahorra millones de parámetros. Tiene sentido: la misma "tabla" que traduce palabra→vector se reutiliza para vector→palabra.
Para visualizar, usamos un vocabulario chiquito de 8 palabras candidatas para seguir "el perro come ___":
Multiplicando el vector de "come" por la matriz de unembedding, obtenemos un logit por palabra:
Los logits son puntajes "crudos" — pueden ser positivos o negativos, no suman nada en particular. Todavía NO son probabilidades. Para eso falta el softmax.
Ya conocés softmax del paso 4. Lo aplicamos a los logits para convertirlos en probabilidades (todas entre 0 y 1, suman 1):
Ahora SÍ son probabilidades. La palabra con la barra más larga es la que el modelo considera más probable como continuación de "el perro come".
Tenemos una distribución de probabilidad. Pero al final hay que elegir UNA palabra concreta. Hay varias estrategias, y la elección afecta mucho el "estilo" del texto generado.
| Estrategia | Qué hace | Resultado |
|---|---|---|
| Greedy | Siempre elige la palabra más probable. | Determinista. Texto coherente pero repetitivo y "aburrido". |
| Temperature | Divide los logits por T antes del softmax. T<1 = más confiado; T>1 = más aleatorio. | Controla la "creatividad". T alto = más variado pero más errores. |
| Top-k | Solo considera las k palabras más probables, descarta el resto. | Evita elegir palabras absurdas (cola larga de baja probabilidad). |
| Top-p (nucleus) | Considera las palabras más probables hasta que su suma llegue a p (ej. 0.9). | Adaptativo: pocas opciones cuando el modelo está seguro, más cuando duda. |
Algo que sorprende a mucha gente: el modelo NO genera la frase completa de una vez. Genera UNA palabra, la agrega al texto, y vuelve a correr TODO el modelo desde el principio para predecir la siguiente. Repite hasta terminar.
Apretá "Generar siguiente palabra" y mirá cómo se va construyendo el texto, palabra por palabra:
¡Con esto, el modelo ya genera texto! Falta entender una sola cosa: ¿cómo aprendió todos esos pesos? Las matrices de embeddings, de atención, de FFN, etc. no aparecieron de la nada.
En el Paso 10: Entrenamiento (el último) vamos a ver cómo, a partir de billones de ejemplos de texto, el modelo ajusta todos sus parámetros para predecir cada vez mejor la siguiente palabra.