30 · Auto-atención: cada posición atiende a todas las demás
La auto-atención permite que cada posición de una secuencia atienda a todas las demás — sin recurrencia, totalmente en paralelo, el motor de los transformers.
La auto-atención permite que cada posición atienda a todas las demás en la MISMA secuencia — sin recurrencia, totalmente en paralelo, el motor de los transformers.
Sin esto:
Sin auto-atención, los transformers (la arquitectura que domina desde 2023+) no tienen sentido.
En la lección anterior, la atención se definió como: el decoder consulta los estados ocultos del encoder. La consulta venía de una secuencia (lado del decoder); las claves y valores venían de una secuencia diferente (lado del encoder). Esto es atención cruzada.
La auto-atención elimina la distinción encoder-decoder. Cada posición en una única secuencia consulta a TODAS las demás posiciones en la misma secuencia. Las consultas, claves y valores provienen todos de la misma fuente.
¿Por qué importa esto? En una RNN, la posición t solo puede "ver" la posición t-1 directamente. Para combinar información de posiciones separadas por 10 tokens, la señal debe viajar a través de 10 estados ocultos secuenciales, cada uno con su propia transformación. Las dependencias de largo alcance son difíciles de capturar y requieren muchas capas.
En la auto-atención, cada posición atiende directamente a todas las demás en un solo paso — la distancia entre posiciones no importa. La posición t y la posición t-50 se comunican exactamente con el mismo costo que posiciones adyacentes. El mecanismo es:
- Proyectar la entrada X de forma
(seq, d)a tres matrices: Q (queries), K (keys), V (values), cada una con una proyección lineal aprendida. - Calcular puntuaciones:
S = Q @ K^T / sqrt(d_k)— forma(seq, seq), una puntuación por par. - Softmax por filas: cada fila es la distribución de atención para una posición de salida.
- Agregar valores:
output = softmax(S) @ V— misma forma que la entrada.
La escala / sqrt(d_k) es crítica: sin ella, un d_k grande hace que los productos punto crezcan tanto que el softmax se satura, haciendo que los gradientes desaparezcan para todas las posiciones no máximas.
Formas de la auto-atención: X (seq, d) → Q, K, V → puntuaciones (seq, seq) → salida (seq, d)
Python (in browser)
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
Auto-atención (5×5): cada fila es una distribución de probabilidad sobre las 5 posiciones — completamente paralelo, sin recurrencia
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Por qué dividir por sqrt(d_k): sin escalado, un d_k grande causa saturación del softmax y gradientes desvanecidos
Read-along de PyTorch: nn.MultiheadAttention y auto-atención de producto punto escalado manual
Complejidad de la auto-atención: la memoria O(n^2) es el cuello de botella; el paralelismo total es por qué los transformers superan a las RNNs en GPU
¿Cuál es la ventaja clave de la auto-atención sobre las RNNs para el procesamiento de secuencias?
- La auto-atención calcula Q = X W_Q, K = X W_K, V = X W_V, luego salida = softmax(Q K^T / sqrt(d_k)) V — la misma secuencia de entrada produce los tres.
- Dividir por sqrt(d_k) previene la saturación del softmax cuando las dimensiones de embedding son grandes — el 'escalado' en la atención de producto punto escalado.
- La auto-atención es O(n^2) en memoria (el cuello de botella para contextos largos) pero completamente paralela en GPU — por eso los transformers reemplazaron a las RNNs como arquitectura dominante.
La auto-atención es la operación MÁS IMPORTANTE en la IA moderna. BERT, GPT, Whisper, Stable Diffusion, AlphaFold — todos están construidos sobre ella. Entenderla es obligatorio para entender cualquier modelo actual.
Si lo quitas: Podrías usar transformers pero no razonar sobre por qué funcionan, depurar patrones de atención, elegir longitudes de contexto apropiadas, ni entender los compromisos de ingeniería en modelos de contexto largo como GPT-4 y Gemini.