Sparse Attention
La atención dispersa permite que cada token preste atención a un subconjunto seleccionado de los demás, como una ventana local, tokens globales o selecciones top-k, para reducir el coste de las secuencias largas.
La atención dispersa es una familia de mecanismos de atención en los que cada consulta puntúa solo un subconjunto seleccionado de claves, en lugar de todas las claves de la secuencia. La autoatención completa sobre N tokens calcula N² puntuaciones por cabezal, por lo que duplicar la longitud de un documento cuadruplica el coste de atención; en cambio, un patrón en el que cada token atiende a k elementos cuesta N·k. El patrón puede fijarse de antemano, como una ventana local, o seleccionarse según el contenido, como las claves con mayor puntuación para cada consulta. El Sparse Transformer de OpenAI de 2019 utilizó patrones con saltos, cuyo coste era O(N√N), para modelar secuencias de decenas de miles de pasos; los modelos de lenguaje grandes (LLM) actuales utilizan capas dispersas para admitir ventanas de contexto de más de 100.000 tokens.
Patrones de dispersión habituales#
Los patrones fijos determinan de antemano qué pares se puntúan. La atención de ventana deslizante permite que cada token vea solo los w tokens anteriores: Mistral 7B utiliza una ventana de 4.096 tokens, y los modelos de pesos abiertos gpt-oss de OpenAI alternan capas densas con capas de ventana de 128 tokens, igual que la alternancia entre capas densas y localmente dispersas que utilizó GPT-3. Cada capa con ventana transmite información otros w tokens hacia delante, por lo que una pila profunda sigue conectando tokens distantes. Los patrones con saltos añaden cada s-ésimo token anterior, de modo que la información también puede recorrer grandes distancias en una sola capa. Los tokens globales atienden a todas las posiciones y reciben atención de todas ellas: Longformer los asigna a tokens de tarea, como el token de clasificación; BigBird también añade conexiones aleatorias; y los sumideros de atención mantienen visibles los primeros tokens para todas las consultas, lo que estabiliza la generación en streaming.
Los patrones basados en el contenido eligen los pares a partir de los datos. Native Sparse Attention de DeepSeek (NSA, 2025) combina resúmenes comprimidos de bloques de claves, una selección de los bloques más relevantes y una ventana deslizante; todo se entrena de extremo a extremo. DeepSeek Sparse Attention en DeepSeek-V3.2 ejecuta un pequeño «indexador rápido» que puntúa cada token anterior para cada consulta y después calcula la atención completa solo sobre los 2.048 mejores, por lo que el coste principal de atención de cada consulta se mantiene fijo por larga que sea la ventana de contexto. Los modelos de producción suelen combinar estas reglas:
Cómo convertir un patrón en ahorro#
Una máscara aplicada a una matriz densa de puntuaciones sigue calculando todas las puntuaciones, por lo que las mejoras de velocidad dependen de núcleos que omitan los bloques vacíos de la matriz. Los núcleos de atención Flash admiten directamente las ventanas deslizantes, y FlexAttention de PyTorch compila cualquier función de máscara en un núcleo disperso por bloques de GPU. Su create_block_mask muestra qué bloques omite un núcleo de este tipo con una ventana de 1.024 tokens y cuatro tokens sumidero:
from torch.nn.attention.flex_attention import create_block_mask
seq_len, window, sinks = 8192, 1024, 4
def local_plus_sinks(b, h, q_idx, kv_idx):
"""Causal attention to the previous 1,024 tokens plus the first 4 tokens."""
causal = q_idx >= kv_idx
return causal & ((q_idx - kv_idx <= window) | (kv_idx < sinks))
# FlexAttention divide la máscara en bloques de 128 x 128 para que sus núcleos puedan omitir los bloques vacíos
block_mask = create_block_mask(local_plus_sinks, B=None, H=None, Q_LEN=seq_len, KV_LEN=seq_len, device="cpu")
print(block_mask)La salida muestra sparsity=85.47%, la proporción de bloques de 128 × 128 de la matriz de puntuaciones de 8.192 × 8.192 que no contienen ningún par permitido, y dibuja el patrón como una banda diagonal para la ventana y una columna a la izquierda para los tokens sumidero. Cuando flex_attention se ejecuta en torch.compile, su núcleo omite esos bloques por completo.
Atención dispersa frente a conceptos relacionados#
- Atención Flash: un núcleo que tiene en cuenta las operaciones de entrada/salida y calcula la atención exacta entre todos los pares, dividiendo el trabajo en bloques en la memoria rápida del propio chip. Estos bloques también son la unidad que omiten los núcleos dispersos por bloques.
- Atención lineal: mantiene todos los pares, pero sustituye la softmax por un mapa de características, de modo que todas las claves y valores anteriores se comprimen en un estado de tamaño fijo.
- Atención deformable: mecanismo de visión en el que cada consulta atiende a unos pocos puntos de muestreo con desplazamientos aprendidos en un mapa de características, en lugar de seguir un patrón fijo.
- Mezcla de expertos (MoE): dispersión en los parámetros, donde cada token activa solo unas pocas redes expertas mientras que su patrón de atención sigue siendo denso.
Aplicaciones#
Los modelos de lenguaje con contexto largo son su principal aplicación: las capas dispersas limitan el cálculo, y las capas con ventanas también limitan la caché KV, lo que permite a los modelos resumir informes largos o buscar en grandes bases de código en una sola solicitud. BigBird aplicó su patrón disperso a secuencias de ADN, cuya entrada de miles de pares de bases es mucho más larga que una frase habitual, para predecir regiones promotoras. En visión artificial, el número de tokens aumenta con la resolución de la imagen, así que los modelos restringen la atención a regiones locales: Swin Transformer atiende dentro de ventanas desplazadas. YOLO12, un detector centrado en la atención de investigadores de la University at Buffalo y la University of Chinese Academy of Sciences que se ejecuta en el paquete Ultralytics, utiliza atención por áreas: su etapa del backbone con stride 16 divide el mapa de características de 40 × 40 de una imagen de 640 píxeles en cuatro franjas horizontales de 400 tokens y atiende solo dentro de cada franja; así puntúa una cuarta parte de los 2,56 millones de pares que necesitaría la atención completa sobre los 1.600 tokens.










