29 · Atención: el decoder mira todos los estados del encoder
La atención permite al decoder consultar todos los estados ocultos del encoder en cada paso de salida — ponderados por relevancia — resolviendo el cuello de botella del vector de contexto.
La atención permite al decoder mirar TODOS los estados ocultos del encoder en cada paso de salida — ponderados por relevancia con lo que se está generando.
Sin esto:
El seq2seq simple comprime toda la entrada en un único vector de contexto; la atención lo soluciona al permitir al decoder consultar todo el historial de entrada.
En la última lección construimos seq2seq y vimos su debilidad central: todo el significado de una oración — sin importar su longitud — debe caber en un único vector de contexto de tamaño fijo. Para oraciones cortas esto funciona sorprendentemente bien. Para oraciones largas (20+ tokens), el rendimiento cae bruscamente.
Piensa en lo que hace un traductor humano. Al traducir "The cat sat on the mat" al español y generar la palabra "gato", no intentas recordar toda la oración en inglés — miras específicamente "cat". Al generar "sobre", miras "on". La atención le da a la red neuronal la misma capacidad: en cada paso de salida, mira hacia atrás en TODOS los estados ocultos del encoder y decide cuáles son más relevantes ahora mismo.
Formalmente, en el paso t del decoder con estado oculto actual s_t:
- Puntuaciones de alineación: para cada posición
idel encoder, calcula una puntuación escalare_{t,i} = score(s_t, h_i)que mide cuánto importa la posiciónipara este paso de salida. - Pesos de atención: softmax sobre las puntuaciones:
α_{t,i} = exp(e_{t,i}) / Σ_j exp(e_{t,j}). Suman 1 y forman una distribución suave sobre las posiciones de entrada. - Vector de contexto: suma ponderada de los estados ocultos del encoder:
c_t = Σ_i α_{t,i} · h_i. - Entrada del decoder: concatenar
c_tcon el estado actual del decoder y alimentar al siguiente paso LSTM.
La idea clave: c_t es diferente en CADA paso de salida. El decoder obtiene un resumen fresco y específico de la tarea de la entrada en cada paso temporal — no un vector fijo para toda la secuencia de salida.
Receta de atención: puntuaciones de alineación → softmax → suma ponderada de estados del encoder → vector de contexto
Python (in browser)
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Pasa el cursor por una fila (token objetivo) para resaltar su distribución de atención. Cambia de cabeza arriba.
Python (in browser)
Mapa de calor de atención para un par de 5 tokens fuente y 4 tokens objetivo — las celdas más brillantes indican mayor peso de atención
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Atención Bahdanau vs Luong: funciones de puntuación, dónde se inyecta el contexto, costo en parámetros
Atención como búsqueda suave diferenciable: query, keys, values — la abstracción que lleva a los transformers
¿Qué representa el peso de atención α_{t,i}?
- La atención calcula un vector de contexto dinámico c_t en cada paso del decoder como una suma ponderada por softmax de TODOS los estados ocultos del encoder — no un vector fijo para toda la salida.
- Las tres funciones de puntuación son producto punto, bilineal (Luong) y MLP (Bahdanau). La atención de producto punto se generaliza directamente a la auto-atención de transformers.
- La atención es una búsqueda suave diferenciable: query, keys, values — la misma abstracción que potencia BERT, GPT y cada transformer moderno.
La atención es LA idea central de los transformers. La misma fórmula softmax(QK^T)V corre en BERT, GPT, T5, Stable Diffusion, AlphaFold — todos ellos.
Si lo quitas: Usarías los transformers como cajas negras sin entender por qué query-key-value es la abstracción correcta — una brecha que hace que la depuración, el fine-tuning y las elecciones de arquitectura sean opacas.