🏗️ 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:

Entrada Tokenizar Embedding Capa 1 Capa 2 ... Capa N Salida

Cada Capa (Transformer Block) tiene 2 estaciones:

  1. Atención: cada palabra "mira a las demás" para entender contexto
  2. 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

Modelod_modeln_layersn_headsd_ffn_params
TinyLLaMA 1.1B2048221656321.1B
LLaMA 3.2 3B3072282481923.2B
LLaMA 3.1 8B40963232110088.0B
Mistral 7B40963232143367.3B
Qwen 2.5 14B512048401369614.3B
LLaMA 3 70B819280642201670.6B
DeepSeek V3 (MoE)716867642048×256671B

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

TipoRatio K,V compartidasAhorro KV CacheModelos
MHA (Multi-Head)1:1GPT-2, LLaMA 1
GQA (Grouped Query)8 queries → 1 par K,VLLaMA 2/3, Mistral
MQA (Multi-Query)todas → 1 par K,V32×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.

Entrada Expansión 4× Activación Compresión Salida

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

TipoFórmulaUsado en
ReLUmax(0, x)GPT-1, modelos antiguos
GELUx · Φ(x) (CDF gaussiana)GPT-2, BERT
Swish/SiLUx · σ(x)LLaMA 1
SwiGLUSiLU(x·W_gate) × (x·W_up)LLaMA 2/3, Mistral
GeGLUGELU(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
        └────────────────────────────┘