Atención: ponderación dinámica de relaciones en una secuencia
En muchos problemas con secuencias (texto, audio, series temporales), cada elemento no se interpreta de forma aislada: su significado depende del contexto. La atención modela esto como una ponderación dinámica de las relaciones entre elementos: para representar un elemento en la posición t, el modelo decide cuánto “mirar” a cada otra posición j y combina la información relevante.
Intuición: si estás procesando la frase “El banco cerró temprano”, la palabra banco puede referirse a una entidad financiera o a un asiento; la atención permite que la representación de banco se apoye más en palabras cercanas como “cerró” (acción típica de una institución) o en otras señales del contexto.
Atención como mezcla ponderada
La idea central es construir una representación contextualizada como una suma ponderada de vectores:
contexto(t) = Σ_j α(t, j) * valor(j)donde α(t, j) son pesos no negativos que suman 1 (una distribución) y se calculan en función de la similitud entre el elemento en t y cada elemento j.
Self-attention: consultas (Q), llaves (K) y valores (V)
En self-attention, la secuencia se atiende a sí misma: cada posición produce tres proyecciones lineales: consulta (Q), llave (K) y valor (V). Estas proyecciones se aprenden y permiten que el modelo compare “qué busco” (Q) con “qué ofrezco” (K) para decidir “qué información paso” (V).
- Escuche el audio con la pantalla apagada.
- Obtenga un certificado al finalizar.
- ¡Más de 5000 cursos para que explores!
Descargar la aplicación
Fórmula de atención escalada por producto punto
Para una secuencia de longitud L con embeddings de dimensión d_model, se construyen matrices:
Q = X W_QK = X W_KV = X W_V
Luego se calculan puntuaciones de similitud y se normalizan con softmax:
scores = (Q K^T) / sqrt(d_k) # matriz LxL de compatibilidades t vs j (escalado para estabilidad) attn = softmax(scores) # filas suman 1 salida = attn V # mezcla ponderada de valoresIntuición operativa: cada fila de attn responde a “para representar el token en la posición t, ¿a qué posiciones j debo prestar atención y con qué intensidad?”. La salida en t es una combinación de los V de toda la secuencia, ponderada por esa distribución.
Representaciones contextualizadas
El resultado de self-attention es que el embedding de cada posición deja de ser “local” y pasa a incorporar información de otras posiciones. Esto es especialmente útil para dependencias largas (por ejemplo, concordancia sujeto-verbo en frases extensas) sin necesidad de recorrer la secuencia paso a paso.
Guía práctica paso a paso: calcular self-attention en una mini-secuencia
Esta guía describe el flujo de cómputo a nivel de tensores, tal como lo implementan librerías como PyTorch o TensorFlow (por ejemplo, en cursos de DeepLearning.AI o fast.ai).
Paso 1: prepara la entrada
Supón una secuencia de L tokens ya convertidos a embeddings: X con forma (L, d_model).
Paso 2: proyecta a Q, K y V
Aprendes matrices W_Q, W_K, W_V y calculas:
Q = X @ W_Q # (L, d_k) K = X @ W_K # (L, d_k) V = X @ W_V # (L, d_v)Paso 3: calcula similitudes (scores)
scores = (Q @ K.T) / sqrt(d_k) # (L, L)Cada entrada scores[t, j] mide cuán relevante es la posición j para la posición t.
Paso 4: aplica máscara si corresponde
- Máscara causal (modelos autoregresivos): impide atender al futuro, forzando
scores[t, j] = -infsij > t. - Máscara de padding: ignora posiciones de relleno en lotes con longitudes variables.
Paso 5: normaliza con softmax
attn = softmax(scores, axis=-1) # (L, L)Ahora cada fila es una distribución de probabilidad sobre las posiciones atendidas.
Paso 6: combina valores para obtener la salida
Y = attn @ V # (L, d_v)Y[t] es la representación contextualizada del token en t.
Paso 7 (opcional): inspecciona pesos de atención
En tareas de NLP, es común visualizar attn como un mapa de calor para entender qué tokens influyen en otros. Esto no es una explicación causal perfecta, pero sí una herramienta útil de diagnóstico.
Atención multi-cabeza (Multi-Head Attention)
Una sola atención puede ser limitada: quizá una parte del modelo necesita enfocarse en relaciones sintácticas (por ejemplo, sujeto-verbo) y otra en relaciones semánticas (por ejemplo, correferencias). La atención multi-cabeza ejecuta varias atenciones en paralelo con proyecciones distintas.
Cómo funciona
- Se divide el espacio en
hcabezas. - Cada cabeza tiene sus propias matrices
W_Q^i,W_K^i,W_V^i. - Se calcula self-attention por cabeza y luego se concatenan las salidas.
head_i = Attention(X W_Q^i, X W_K^i, X W_V^i) concat = [head_1 || head_2 || ... || head_h] salida = concat W_OEsto permite que el modelo aprenda múltiples “patrones de relación” simultáneamente.
Arquitectura Transformer a nivel de bloques
El Transformer organiza el procesamiento en bloques repetidos. A nivel conceptual, cada bloque combina: (1) atención para mezclar información entre posiciones y (2) una red feed-forward para transformar cada posición de manera no lineal, con estabilización mediante normalización y conexiones residuales.
Componentes principales de un bloque
- Multi-Head Self-Attention: mezcla información entre posiciones.
- Feed-Forward (FFN) por posición: aplica el mismo MLP a cada token de forma independiente.
- Conexiones residuales: suman la entrada del sub-bloque a su salida para facilitar el flujo de información.
- Normalización (LayerNorm): estabiliza activaciones y entrenamiento.
Esquema típico (forma conceptual)
| Sub-bloque | Operación | Intuición |
|---|---|---|
| Atención | X1 = LayerNorm(X + MHA(X)) | Mezcla contexto manteniendo una ruta directa (residual) |
| FFN | X2 = LayerNorm(X1 + FFN(X1)) | Refina cada token con transformaciones no lineales |
Nota: existen variantes “pre-norm” y “post-norm” (el orden exacto de LayerNorm puede cambiar), pero la idea de bloques con atención + FFN + residual + normalización se mantiene.
Codificación posicional: introducir el orden en el modelo
La self-attention por sí sola es invariante al orden: si permutas los tokens, las operaciones matriciales no “saben” qué token estaba primero. Para que el modelo use el orden, se añade información posicional al embedding.
Dos enfoques comunes
- Positional encoding fijo (por ejemplo, senos y cosenos): agrega un vector determinista según la posición.
- Positional embedding aprendido: aprende un vector por posición (hasta un máximo de contexto).
En ambos casos, el input al primer bloque suele ser:
X0 = Embedding(tokens) + PositionalEncoding(posiciones)También existen enfoques relativos (posiciones relativas) que modelan distancias entre tokens, útiles cuando importa más “qué tan lejos” que “en qué índice exacto”.
Complejidad, tamaño de contexto y consideraciones prácticas
Complejidad de self-attention
El cuello de botella clásico es la matriz scores de tamaño L x L. Esto implica:
- Tiempo: aproximadamente
O(L^2 * d_k)por capa (por cabeza, con constantes). - Memoria: almacenar
attny activaciones también escala comoO(L^2).
Cuando L (longitud de contexto) crece, el costo aumenta rápidamente. Por eso, el “tamaño de contexto” es una decisión de diseño clave: más contexto permite capturar dependencias más largas, pero encarece entrenamiento e inferencia.
Implicaciones del tamaño de contexto
- Calidad: tareas como resumen, QA o generación coherente suelen mejorar con más contexto hasta cierto punto.
- Latencia: en inferencia, especialmente en generación token a token, el costo puede ser alto.
- Ventanas y truncamiento: en práctica se usan ventanas deslizantes, truncamiento o segmentación de documentos.
Estrategias comunes (conceptuales) para manejar contextos largos
- Atención eficiente/sparse: restringir a vecindarios o patrones (reduce el costo cuadrático).
- Compresión/memoria: resumir partes antiguas del contexto en estados compactos.
- Recuperación (RAG): traer fragmentos relevantes desde un índice externo en lugar de meter todo en el contexto.
Estas ideas aparecen frecuentemente en implementaciones modernas y en material práctico de plataformas como Coursera, edX y Udacity, además de documentación de PyTorch y TensorFlow.
Tareas típicas con Transformers (visión conceptual)
Clasificación de texto
Objetivo: asignar una etiqueta a una secuencia (sentimiento, tema, toxicidad). Conceptualmente:
- El Transformer produce representaciones contextualizadas por token.
- Se agrega un vector representativo de la secuencia (por ejemplo, un token especial o pooling).
- Una capa final produce probabilidades de clase.
Traducción automática
En traducción, es común un esquema encoder-decoder:
- Encoder: procesa la oración fuente con self-attention y produce una memoria contextual.
- Decoder: genera la oración destino token a token con atención causal y cross-attention hacia la memoria del encoder.
La cross-attention permite que cada token generado “mire” a las partes relevantes de la oración fuente.
Modelos generativos (autoregresivos)
En generación de texto, el modelo predice el siguiente token condicionado en los anteriores:
- Usa self-attention causal para evitar ver el futuro.
- Produce una distribución sobre el vocabulario en cada paso.
- La salida se convierte en texto mediante estrategias de decodificación (por ejemplo, muestreo o búsqueda), a nivel conceptual.