Atención y transformadores en deep learning

Capítulo 11

Tiempo estimado de lectura: 8 minutos

+ Ejercicio

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).

Continúa en nuestra aplicación.
  • Escuche el audio con la pantalla apagada.
  • Obtenga un certificado al finalizar.
  • ¡Más de 5000 cursos para que explores!
O continúa leyendo más abajo...
Download App

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_Q
  • K = X W_K
  • V = 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 valores

Intuició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] = -inf si j > 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 h cabezas.
  • 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_O

Esto 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-bloqueOperaciónIntuición
AtenciónX1 = LayerNorm(X + MHA(X))Mezcla contexto manteniendo una ruta directa (residual)
FFNX2 = 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 attn y activaciones también escala como O(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.

Ahora responde el ejercicio sobre el contenido:

¿Cuál es el propósito principal de la codificación posicional en un Transformer?

¡Tienes razón! Felicitaciones, ahora pasa a la página siguiente.

¡Tú error! Inténtalo de nuevo.

La self-attention no codifica el orden de los tokens por sí misma. Por eso se suma una codificación/embedding posicional a los embeddings, permitiendo que el modelo distinga posiciones y use la estructura secuencial.

Siguiente capítulo

Implementación práctica de redes neuronales: de cero y con bibliotecas

Arrow Right Icon
Portada de libro electrónico gratuitaIntroducción a las Redes Neuronales: Del Perceptrón al Deep Learning
85%

Introducción a las Redes Neuronales: Del Perceptrón al Deep Learning

Nuevo curso

13 páginas

Descarga la aplicación para obtener una certificación gratuita y escuchar cursos en segundo plano, incluso con la pantalla apagada.