🏗️ Arquitectura Transformer
El Transformer es una fábrica con estaciones de trabajo dispuestas en cadena. Cada estación transforma los datos y los pasa a la siguiente.
Una fábrica de palabras
El Transformer procesa la información en una cadena de estaciones:
Cada Capa (Transformer Block) tiene 2 estaciones:
- Atención: cada palabra "mira a las demás" para entender contexto
- Feed-Forward: cada palabra "piensa en lo que ha visto"
Al final, una estación de salida convierte los vectores en probabilidades para elegir la siguiente palabra.
Diagrama de una capa
┌─────────────────────────────────────┐
│ ENTRADA (x) │
│ [seq_len × d_model] │
└────────────┬────────────────────────┘
│
▼
┌──────────────────────┐
│ RMSNorm │ ← normalización
└────────────┬─────────┘
│
▼
┌─────────────────────────────────────┐
│ Multi-Head Self-Attention │
│ │
│ Q = x · W_Q [d_model → d_model] │
│ K = x · W_K [d_model → d_model] │
│ V = x · W_V [d_model → d_model] │
│ │
│ heads = split(Q,K,V, n_heads) │
│ for each head: │
│ attn = softmax(Q·K^T/√d_k)·V │
│ │
│ out = concat(heads) · W_O │
└────────────┬────────────────────────┘
│
▼
┌──────────────────────┐
│ Residual: x + out │ ← la conexión que salva el gradiente
└────────────┬─────────┘
│
▼
┌──────────────────────┐
│ RMSNorm │
└────────────┬─────────┘
│
▼
┌─────────────────────────────────────┐
│ Feed-Forward (SwiGLU) │
│ │
│ gate = SiLU(x · W_gate) │
│ up = x · W_up │
│ hidden = gate × up │
│ out = hidden · W_down │
│ │
│ d_model → d_ff → d_model │
│ (d_ff ≈ 4 × d_model) │
└────────────┬────────────────────────┘
│
▼
┌──────────────────────┐
│ Residual: x + out │
└────────────┬─────────┘
│
▼
┌──────────────────────┐
│ SALIDA │
│ (misma forma) │
└──────────────────────┘ Parámetros clave por tamaño de modelo
| Modelo | d_model | n_layers | n_heads | d_ff | n_params |
|---|---|---|---|---|---|
| TinyLLaMA 1.1B | 2048 | 22 | 16 | 5632 | 1.1B |
| LLaMA 3.2 3B | 3072 | 28 | 24 | 8192 | 3.2B |
| LLaMA 3.1 8B | 4096 | 32 | 32 | 11008 | 8.0B |
| Mistral 7B | 4096 | 32 | 32 | 14336 | 7.3B |
| Qwen 2.5 14B | 5120 | 48 | 40 | 13696 | 14.3B |
| LLaMA 3 70B | 8192 | 80 | 64 | 22016 | 70.6B |
| DeepSeek V3 (MoE) | 7168 | 67 | 64 | 2048×256 | 671B |
Fórmula de total de parámetros (LLaMA-like):
Total = vocab × d_model (embedding + LM head)
+ n_layers × 4 × d_model² (attention: Q,K,V,O)
+ n_layers × 3 × d_model × d_ff (FFN: gate, up, down)
+ n_layers × 2 × d_model (2× RMSNorm por capa)
+ 1 × d_model (RMSNorm final) El núcleo del Transformer
La atención es el mecanismo que permite a cada palabra mirar a las demás para entender el contexto.
💡 Analogía: estás en una fiesta y alguien dice "¡mira eso!". No sabes qué es "eso" hasta que ves hacia dónde mira. Eso es la atención: cada palabra mira a las demás para entender qué significan en este contexto.
Ejemplo:
"El banco cerró la cuenta" → "banco" mira a "cerró" y "cuenta" → banco = entidad financiera
"Me senté en el banco del parque" → "banco" mira a "senté" y "parque" → banco = asiento
Mapa de Atención Interactivo
Escribe una frase y observa cómo cada token presta atención a los demás.
Scaled Dot-Product Attention
Para cada token, creamos tres vectores:
- Q (Query): "¿qué estoy buscando?"
- K (Key): "¿qué información tengo?"
- V (Value): "¿qué información doy?"
Score = Q · K^T ← similitud entre cada par de tokens
Scale: / √d_k ← evitar que scores crezcan con dimensión
Mask (causal): −∞ para tokens futuros ← en autoatención causal
Softmax: normalizar a [0,1]
Output: scores × V ← suma ponderada de valores Multi-Head Attention
En lugar de una atención, hacemos h en paralelo. Para un modelo 7B: h=32 cabezas, d_head=128. Cada cabeza aprende un tipo de relación diferente:
- Cabeza 1: relaciones sintácticas (sujeto-verbo)
- Cabeza 2: relaciones anafóricas (pronombre → referente)
- Cabeza 3: patrones posicionales
- Cabeza 4: relaciones semánticas profundas
- Cabeza 5-8: relaciones de negación, condición...
Variantes de atención
| Tipo | Ratio K,V compartidas | Ahorro KV Cache | Modelos |
|---|---|---|---|
| MHA (Multi-Head) | 1:1 | 1× | GPT-2, LLaMA 1 |
| GQA (Grouped Query) | 8 queries → 1 par K,V | 8× | LLaMA 2/3, Mistral |
| MQA (Multi-Query) | todas → 1 par K,V | 32× | Falcon, PaLM |
| MLA (Multi-Latent) | compresión latente | ~10× | DeepSeek V2/V3 |
La memoria del conocimiento
Si la atención decide qué información considerar, el Feed-Forward decide qué hacer con ella.
Es como preguntar a un experto: le das la información, el experto consulta su memoria (expansión), filtra lo relevante (activación), y te da una respuesta elaborada (compresión).
SwiGLU en detalle
En LLaMA y modelos modernos se usa SwiGLU (una variante de GLU con activación SiLU):
RMSNorm(x) → normalización
x · W_up → proyección UP: [d_model] → [d_ff] (expansión)
x · W_gate → proyección GATE: [d_model] → [d_ff] (control)
SiLU(x_gate) × x_up → activación elemento a elemento
resultado · W_down → proyección DOWN: [d_ff] → [d_model] (compresión) Donde d_ff ≈ 4 × d_model (para 7B: 4096 → 11008).
¿Qué hace realmente cada neurona?
Se ha observado que neuronas individuales se especializan:
- Neurona 5723: se activa con contextos relacionados a París
- Neurona 8921: se activa con términos de programación
- Neurona 1452: se activa con conceptos matemáticos
Eliminar una neurona específica puede eliminar la capacidad de hablar de un tema concreto. Esto se llama "surgical model editing" y se usa para corregir hechos sin reentrenar.
Activaciones en modelos modernos
| Tipo | Fórmula | Usado en |
|---|---|---|
| ReLU | max(0, x) | GPT-1, modelos antiguos |
| GELU | x · Φ(x) (CDF gaussiana) | GPT-2, BERT |
| Swish/SiLU | x · σ(x) | LLaMA 1 |
| SwiGLU | SiLU(x·W_gate) × (x·W_up) | LLaMA 2/3, Mistral |
| GeGLU | GELU(x·W_gate) × (x·W_up) | PaLM |
El bloque Transformer completo
32 capas como esta apiladas forman un modelo de 7B parámetros.
┌────────────────────────────┐
│ x ∈ [seq_len × 4096] │ ← activación de la capa anterior
└────────────┬───────────────┘
│
▼
┌────────────────────────────┐
│ RMSNorm │ 4096 params (escala)
│ y = x / sqrt(mean(x²) + ε)│
└────────────┬───────────────┘
│
▼
┌──────────────────────────────────────────────────┐
│ ATTENTION (4 matrices de 4096×4096 ≈ 67M params)│
│ │
│ Q = x · W_Q → [s, 4096] │
│ K = x · W_K → [s, 4096] │
│ V = x · W_V → [s, 4096] │
│ │
│ Reshape: [s, 32×128] → 32 cabezas [s, 128] │
│ for head in 32: │
│ attn = softmax(Q·K^T/11.3) · V √128 = 11.3 │
│ Concat + W_O → [s, 4096] │
└────────────┬─────────────────────────────────────┘
│
▼
┌────────────────────────────┐
│ + x (residual) │ → [s, 4096]
└────────────┬───────────────┘
│
▼
┌────────────────────────────┐
│ RMSNorm │
└────────────┬───────────────┘
│
▼
┌──────────────────────────────────────────────────┐
│ FFN (SwiGLU) (3 matrices ≈ 135M params) │
│ │
│ gate = SiLU(x · W_gate) [4096→11008] │
│ up = x · W_up [4096→11008] │
│ hidden = gate × up [11008] │
│ out = hidden · W_down [11008→4096] │
└────────────┬────────────────────────────────────┘
│
▼
┌────────────────────────────┐
│ + x (residual) │
└────────────┬───────────────┘
│
▼
┌────────────────────────────┐
│ x' ∈ [seq_len × 4096] │ ← salida = entrada de la sig. capa
└────────────────────────────┘