Variancias de atención Ventana deslizante, Sparse, Diferencial
Type: Build
Languages: Python
Prerequisites: Phase 7 · 02 (Self-Attention), Phase 7 · 03 (Multi-Head), Phase 7 · 12 (KV Cache / Flash Attention)
Time: ~60 minutes
El problema
Costos de atención plena O(N²)memoria y O(N²)Para un Llama 3 70B de 128K de contexto que es 16 mil millones de entradas de atención por capa, veces 80 capas.O(N²)memoria de activación pero no cambia el costo aritmético cada token todavía atende a cada otro token.
Tres clases de variantes cambian la topología de la matriz de atención misma:
- Sliding window attention (SWA).Cada token se encuentra en una ventana fija de vecinos, no en el prefijo completo.
O(N · W)dondeWGemma 2/3, las primeras capas del Mistral 7B, Phi-3-Long. - Sparse / block attention.Sólo pares seleccionados
(i, j)Los demás se ven obligados a cero peso. Longformer, BigBird, OpenAI transformador escaso. - Differential attention.Computa dos mapas de atención con proyecciones Q/K separadas, restar uno del otro. Mata el "sink de atención" que desangraza el peso en los primeros tokens.
Los modelos fronterizos de 2026 a menudo los mezclan: la mayoría de las capas son SWA-1024, cada quinto es atención completa global, y un puñado de cabezas diferenciales que limpian la recuperación.
El concepto
Atención a las ventanas deslizantes (SWA)
Cada consulta en posición isólo asiste a posiciones en [i - W, i](SWA causal) o [i - W/2, i + W/2]Los tokens fuera de la ventana se ponen.-infen la matriz de puntaje.
full causal: sliding window (W=4):
positions 0-7 positions 0-7, W=4
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
0 | x 0 | x
1 | x x 1 | x x
2 | x x x 2 | x x x
3 | x x x x 3 | x x x x
4 | x x x x x 4 | x x x x
5 | x x x x x x 5 | x x x x
6 | x x x x x x x 6 | x x x x
7 | x x x x x x x x 7 | x x x xParaN = 8192y W = 1024, la matriz de puntaje tiene 1024 × 8192 filas no cero en la expectativa una reducción de 8 ×.
KV cache shrinks with SWA.Sólo el último .WLos tokens de K y V deben mantenerse por capa. Para una configuración Gemma-3-ish (1024 ventanas, contexto 128K), la caché KV cae 128x.
Quality cost.Los transformadores solo SWA luchan con la recuperación a largo alcance. La solución: intercalar capas SWA con capas de atención completa. Gemma 3 utiliza 5:1 SWA:global. Mistral 7B utilizó una pila de SWA causal donde la información "fluye hacia adelante" a través de ventanas superpuestas cada capa extiende el campo receptivo efectivo por W, y después Llas capas que el modelo puede asistir L × Wlos tokens de vuelta.
Atención de escasez / bloqueo
Escoge una .N × NEl patrón de esparcia anticipado.
- Local + strided (OpenAI sparse transformer).Atender a la última .
Wfichas más cadastride-Todo el tiempo, capturando tanto a largo alcance como local.O(N · sqrt(N))¿Qué es eso? - Longformer / BigBird.Ventana local + un pequeño conjunto de tokens globales (por ejemplo
[CLS]En el contexto empírico, el contexto 2x es de calidad igualitaria. - Native Sparse Attention (DeepSeek, 2025).Aprenda qué bloques de
(Q, K)El bloqueo de cero en el núcleo es compatible con FlashAttention.
La matemática es simple (mascarar la matriz de puntaje); la victoria proviene de no cargar nunca las entradas cero en SRAM. FlashAttention-3 y la API 2026 FlexAttention hacen patrones de puntaje personalizados en PyTorch.
El objetivo de la evaluación es garantizar la eficacia de la evaluación de los resultados de la evaluación.
La atención regular tiene un problema de "senqueo de atención": softmax obliga a cada fila a sumar a 1, por lo que los tokens que no quieren atender a nada en particular se desprenden del peso en el primer token (o los primeros pocos).
La atención diferencial corrige esto mediante la computación twomapas de atención y restantes:
A1 = softmax(Q1 K1^T / √d)
A2 = softmax(Q2 K2^T / √d)
DiffAttn = (A1 - λ · A2) VdondeλEs un escalar aprendido (típicamente 0.50.8). A1 captura los pesos reales del contenido; A2 capta el fregadero.
Resultados reportados (Microsoft 2024): 510% menos perplejidad, contexto efectivo 1,52× más largo en la misma longitud entrenada, recuperación de aguja en haystack más nítida.
Comparación de variantes
| Variant | Compute | KV cache | Quality vs full | Production use |
|---|---|---|---|---|
| Full attention | O(N²) | O(N) per layer | baseline | every model's default layer |
| SWA (window 1024) | O(N·W) | O(W) per layer | -0.1 ppl, good with global layers | Gemma 2/3, Phi-3-Long |
| Local + strided sparse | O(N·√N) | mixed | similar to SWA | OpenAI sparse transformer, Longformer |
| BigBird (local + global + random) | O(N) approx | mixed | matches full at 2× context | early long-context BERT |
| Native Sparse (DeepSeek-V3.2) | O(N · active fraction) | O(N) | within 0.05 ppl | DeepSeek-V3.2, 2025 |
| Differential | O(2·N²) | O(2N) | -5 to -10% ppl | DIFF Transformer, early 2026 models |
Construye el mismo
¿ Qué ?code/main.pyImplementamos un comparador de máscaras causales que muestra la atención completa, SWA, local+strided y diferencial lado a lado en una secuencia de juguetes.
Paso 1: máscara causal completa (línea de base)
pythondef causal_mask(n):
return [[0.0 if j <= i else float("-inf") for j in range(n)] for i in range(n)]Línea de base de la lección 07. Triangular inferior; peso cero por encima de la diagonal.
Paso 2: máscara causal de ventana deslizante
pythondef swa_mask(n, window):
M = [[float("-inf")] * n for _ in range(n)]
for i in range(n):
lo = max(0, i - window + 1)
for j in range(lo, i + 1):
M[i][j] = 0.0
return MUn parámetro window- Para .window >= n, se recupera la atención causal completa.window = 1, cada token se atende sólo a sí mismo.
Paso 3: local + máscara escasa de paso
pythondef strided_mask(n, window, stride):
M = [[float("-inf")] * n for _ in range(n)]
for i in range(n):
lo = max(0, i - window + 1)
for j in range(lo, i + 1):
M[i][j] = 0.0
for j in range(0, i + 1, stride):
M[i][j] = 0.0
return MLa ventana local es densa más cada uno .strideEl campo receptor crece en etapas de registro con capas adicionales.
Paso 4: Atención diferenciada
pythondef diff_attention(Q1, K1, Q2, K2, V, lam):
A1 = softmax_causal(Q1 @ K1.T / sqrt_d)
A2 = softmax_causal(Q2 @ K2.T / sqrt_d)
return (A1 - lam * A2) @ VEn el código comparamos el mapa de calor de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la concentración de la cubo en el descienda de la cubo.
Paso 5: Tamaños de caché de KV
Imprima el tamaño de la caché por capa en N = 131072Las variantes SWA y raras caen en 10 100 ×. Dobles diferenciales.
Usalo
Modelos de producción para 2026:
pythonfrom transformers import AutoModelForCausalLM
# Gemma 3 mixes SWA (window=1024) and global layers at 5:1.
model = AutoModelForCausalLM.from_pretrained("google/gemma-3-27b-it")
# print(model.config.sliding_window, model.config.layer_types)FlexAttention en PyTorch 2.5+ acepta una función de máscara:
pythonfrom torch.nn.attention.flex_attention import flex_attention, create_block_mask
def swa_pattern(b, h, q_idx, kv_idx):
return (q_idx - kv_idx < 1024) & (q_idx >= kv_idx)
mask = create_block_mask(swa_pattern, B=batch, H=heads, Q_LEN=n, KV_LEN=n)
out = flex_attention(q, k, v, block_mask=mask)Esto se compiló a un núcleo Triton personalizado. dentro del 10% de la velocidad de FlashAttention-3 para patrones comunes, y la función de máscara es una llamada Python.
When to pick each:
- Pure full attention cada capa hasta ~ 16K contexto, o cuando la calidad de recuperación es primordial.
- SWA + global mix contexto largo (> 32K), formación y inferencia limitada a la memoria.
- Sparse block attention kernel personalizado, patrón personalizado. Reservado para cargas de trabajo especializadas (recuperación, audio).
- Differential attention cualquier carga de trabajo en la que la contaminación por sumido de atención sea perjudicial (RAG de largo contexto, aguja en el manto de heno).
Envío
¿ Qué ?outputs/skill-attention-variant-picker.md. La habilidad selecciona una topología de atención para un nuevo modelo dada la longitud del contexto objetivo, las demandas de recuperación y el perfil de computación de formación/inferencia.
Los ejercicios
- Easy.- ¿ Qué ?
code/main.pyVerifique el SWA enwindow=4cero todo fuera de los últimos 4 tokens por fila.window=nreproducen la atención causal completa de forma bit-identica. - Medium.Implementar la SWA causal con
window=1024¿Cuánto disminuye la pérdida de val vs. plena atención? ¿Cuánto disminuye la memoria máxima? - Hard.Implemente una mezcla de capas de 5:1 de estilo Gemma-3 (5 SWA, 1 global) en el modelo de piedra angular. Compara la calidad de pérdida, memoria y generación con las líneas de base de SWA pura y global pura en parámetros iguales.
- Hard.Implementar la atención diferencial con un aprendiz
λEn el caso de los equipos de detección de datos, el equipo de detección de datos de detección de datos de datos de detección de datos de datos de detección de datos de datos de detección de datos de datos de detección de datos de datos de detección de datos de detección de datos de detección de datos de datos de detección de datos de detección de datos de detección de datos de detección de datos de detección de datos de detección de datos de detección de datos de detección de datos de detección de datos de detección de datos de detección de datos de detección de datos de detección de datos de detección de datos de detección de datos de detección de datos de detección de datos de detección de datos de detección de datos de detección de datos de detección de datos de detección de datos de detección de datos de detección de datos de detección de datos de detección de datos de detección de datos de detección de datos de detección de datos de detección de datos de detección de datos de detección de datos de datos de detección de datos de datos de datos de detección de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de datos de cuyo de cuyo de cuyo de cuyo cuyo cuyo cuyo cuyo cuyo cuyo cuyo cuyo cuyo cuyo cuyo cu
Términos clave
| Term | What people say | What it actually means |
|---|---|---|
| Sliding window attention (SWA) | "Local attention" | Each query attends to its last W tokens; KV cache shrinks to O(W). |
| Effective receptive field | "How far back the model sees" | In an L-layer SWA stack with window W, up to L × W tokens. |
| Longformer / BigBird | "Local + global + random" | Sparse patterns with a few always-attending global tokens; early long-context approach. |
| Native Sparse Attention | "DeepSeek's kernel trick" | Learn block-level sparsity; skip zero blocks at the kernel level while keeping quality. |
| Differential attention | "Two maps, one subtracts" | DIFF Transformer: subtract a learned λ times a second attention map from the first to cancel attention sinks. |
| Attention sink | "Weight bleeds to token 0" | Softmax normalization forces rows to sum to 1; uninformative queries dump weight on position 0. |
| FlexAttention | "Mask-as-Python" | PyTorch 2.5+ API that compiles arbitrary mask functions into FlashAttention-shape kernels. |
| Layer type mix | "5:1 SWA-to-global" | Interleave sparse and full attention layers in a stack to keep quality at lower memory. |
Leer más
- Beltagy, Peters, Cohan (2020). Longformer: The Long-Document Transformer el papel de fichaje global + ventana de deslizamiento canónica.
- Zaheer et al. (2020). Big Bird: Transformers for Longer Sequences local + global + aleatorio.
- Child et al. (2019). Generating Long Sequences with Sparse Transformers El patrón local+pasado de OpenAI.
- Gemma Team (2024). Gemma 2: Improving Open Language Models at a Practical Size la mezcla global de la SWA 1:1.
- Gemma Team (2025). Gemma 3 technical report la combinación 5:1 con ventana=1024 que ahora es el libro de texto predeterminado.
- Ye et al. (2024). Differential Transformer papel transformador DIFF.
- Yuan et al. (2025). Native Sparse Attention La atención de la disparidad aprendida de DeepSeek-V3.2.
- PyTorch — FlexAttention blog and docs Referencia de API para el patrón de máscara como llamada en Use It.
This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.
Browse the complete course catalog or open this lesson on GitHub.