Si self-attention te dio UNA forma de mirar la frase, multi-head te da VARIAS en paralelo. Cada "cabeza" es una self-attention completa pero con sus propias matrices, capturando un tipo de relación distinto.
Multi-head es hacer self-attention varias veces en paralelo, cada vez con un "enfoque" distinto, y combinar los resultados.
Ejecutar varias self-attentions en paralelo ("cabezas"), cada una con sus propias matrices, para capturar distintos tipos de relación a la vez.
Múltiples perspectivas simultáneas (sintáctica, semántica, posicional...). Combinadas, dan una comprensión mucho más rica de la frase que una sola atención.
Una sola atención solo puede capturar UN tipo de relación por capa. Pero las frases tienen muchos tipos de relación al mismo tiempo — necesitamos varias "miradas" en paralelo.
↓ A continuación, el detalle con ejemplos y visualizaciones ↓
Eso es prácticamente todo lo que tenés que entender. Lo demás son detalles de cómo se hace la combinación. Si ya entendiste el paso 4 (self-attention), ya entendiste la mayor parte del paso 5.
Self-attention con UN solo set de matrices (WQ, WK, WV) puede aprender un tipo de relación entre tokens. Pero las palabras de una frase tienen muchos tipos de relaciones simultáneamente.
Una sola self-attention NO puede capturar todas estas relaciones al mismo tiempo. Tendría que elegir cuál priorizar — por ejemplo, sujeto-verbo a costa de adjetivo-sustantivo.
Imagina una escena de fútbol filmada por una sola cámara fija. Vas a ver solo lo que esa cámara captura desde su ángulo. Pierdes información: lo que pasa fuera del cuadro, los detalles del rostro de los jugadores, etc.
Ahora imagina la misma escena filmada por varias cámaras al mismo tiempo: una panorámica, una de primer plano, una desde el arco, una aérea con dron. Cada cámara da una perspectiva distinta. Al juntarlas (en el editing), obtenés una comprensión mucho más rica de la jugada.
El flujo es así:
Esta parte es muy importante. La idea: no hacemos H cabezas de la dimensión completa (sería muy costoso). Hacemos H cabezas más chicas, cada una usando d_model / H dimensiones.
d_model = 4 (dimensión del input — viene del paso 3) H = 2 (número de cabezas que vamos a usar) Dimensión de cada cabeza: d_k = d_model / H = 4 / 2 = 2 Cada cabeza tendrá: W_Q^h shape = [d_model, d_k] = [4, 2] W_K^h shape = [d_model, d_k] = [4, 2] W_V^h shape = [d_model, d_k] = [4, 2] Salida de cada cabeza: 3 vectores de dim 2. Después de concatenar 2 cabezas: 3 vectores de dim (2 + 2) = 3 vectores de dim 4 Matriz W_O para mezclar las cabezas: W_O shape = [d_model, d_model] = [4, 4] Output final: 3 vectores de dim 4 (misma forma que el input — importante!)
Imagina que tenemos d_model = 768 (típico en BERT). Sin dividir, cada cabeza tendría matrices de 768×768 = ~590k parámetros. Con 12 cabezas, serían ~7 millones de parámetros solo para una capa de atención. Demasiado.
Dividiendo: cada cabeza tiene matrices 768×64 = ~49k parámetros. Con 12 cabezas, totalizamos los mismos ~590k que tendría una sola cabeza grande, pero ahora con 12 perspectivas distintas en lugar de una. Misma cantidad de parámetros, mucho más expresividad.
| Modelo | d_model | num_heads | d_k por cabeza |
|---|---|---|---|
| GPT-2 small | 768 | 12 | 64 |
| GPT-2 medium | 1024 | 16 | 64 |
| GPT-3 / GPT-4 | 12288 | 96 | 128 |
| LLaMA-2 7B | 4096 | 32 | 128 |
| Nuestro ejemplo | 4 | 2 | 2 |
Vamos a aplicar multi-head attention con 2 cabezas a nuestros 3 vectores. Las matrices son inventadas (en un modelo real se aprenderían).
Columnas 0-1 de las W del paso 4
Columnas 2-3 de las W del paso 4
Es exactamente como en el paso 4, pero usando las matrices de cada cabeza. Las salidas tienen dimensión 2 (no 4) porque las matrices son 4×2.
Cada cabeza ejecuta los 5 sub-pasos del paso 4 con sus propios Q, K, V: producto punto, escalar (por √d_k = √2 ≈ 1.414), softmax, suma ponderada de V. Las matrices de atención salen distintas porque las matrices W son distintas.
Cada fila = quien pregunta. Cada columna = a quién atiende. Suma de cada fila = 100%.
Mira cómo este patrón es distinto al de la Cabeza 1.
"Concatenar" significa pegar los vectores uno al lado del otro. Si la salida de la cabeza 1 para "perro" es [a, b] y la de la cabeza 2 es [c, d], el concat es [a, b, c, d].
Tres ejemplos simples: concat([1, 2], [3, 4]) = [1, 2, 3, 4] concat([a, b, c], [d]) = [a, b, c, d] concat([1, 2], [3, 4], [5, 6]) = [1, 2, 3, 4, 5, 6] La dimensión final = suma de las dimensiones de cada parte. En nuestro caso: dim 2 (cabeza 1) + dim 2 (cabeza 2) = dim 4.
El concat ya tiene la dim correcta (4), pero las 4 dimensiones todavía vienen "separadas": las primeras 2 son de la cabeza 1, las otras 2 de la cabeza 2. WO es una matriz que mezcla esa información para que las dimensiones finales combinen información de ambas cabezas.
WO es una matriz [d_model × d_model] = [4 × 4] que también se aprende durante el entrenamiento.
Esto es lo que sale del bloque de multi-head attention. Mismo número de tokens (3) y misma dimensión (4) que el input — listo para el siguiente paso del Transformer.
Los investigadores han estudiado los modelos entrenados (BERT, GPT) abriendo el capó y mirando qué patrón aprende cada cabeza. Lo que descubrieron es fascinante:
Click "Siguiente paso" para ver cada fase de multi-head attention con números reales calculados en JS:
El output tiene la misma forma que el input (3 vectores de dim 4) — esto es crucial para los conexiones residuales que veremos en el paso 7.
En el Paso 6: Feed-Forward Network, cada uno de esos vectores va a pasar por una pequeña red neuronal que procesa cada token de forma independiente, agregando más capacidad de cómputo al modelo.