Self-Attention, Transformers, NLP y LLMs — Guía en 4 Niveles

Self-Attention, Transformers, NLP y LLMs

Guía completa en 4 niveles: desde cero hasta arquitecturas avanzadas. Elige tu punto de entrada y sube de nivel a tu ritmo.

🟢
FASE 1 — Fundamentos: NLP, tokens y embeddings
Base 1. ¿Qué es el NLP?

NLP (Natural Language Processing) es la rama de la IA que enseña a las máquinas a leer, escribir y entender lenguaje humano.

Cuando Siri pone una canción, Gmail detecta spam o ChatGPT responde una pregunta — todo eso es NLP.

💡 En una frase: NLP es hacer que las máquinas entiendan lo que decimos y escribimos.
Base 2. Tareas típicas de NLP
  • Clasificación: ¿spam o no spam?
  • Sentimiento: ¿reseña positiva o negativa?
  • Traducción: español → inglés.
  • Resumen: noticia larga → titular.
  • Q&A: "¿Quién fundó Google?" → respuesta.
  • Generación: crear texto nuevo (ChatGPT).
Base 3. Tokens: la unidad mínima

Un token es la pieza mínima en que se divide el texto. Puede ser una palabra, parte de una palabra o un carácter.

"El gato duerme" → ["El", "gato", "duerme"] "increíble" → ["incre", "íble"] "IA" → ["IA"]

El modelo no ve palabras: ve tokens convertidos en números.

Base 4. Embeddings: el mapa de las palabras

Un embedding es un vector (lista de números) que representa una palabra. Palabras con significado parecido quedan cerca en ese espacio.

"rey" → [0.2, -0.5, 0.8, ...] "reina" → [0.3, -0.4, 0.7, ...] ← cerca "pizza" → [-0.9, 0.1, -0.2, ...] ← lejos
💡 Analogía: es como un mapa de ciudades donde cada palabra es una ciudad. Palabras parecidas están en la misma región.
Base 5. Glosario mínimo
TérminoSignificado
TokenUnidad mínima de texto
EmbeddingVector que representa una palabra
PromptLo que tú escribes al modelo
ContextoTodo lo que el modelo puede "ver"
LLMModelo de lenguaje grande (GPT, Claude…)
AlucinaciónCuando el modelo inventa datos falsos
🟩
FASE 2 — Self-Attention y Transformers
Intermedio 1. ¿Qué es Self-Attention?

Self-Attention permite que cada palabra "mire" a todas las demás y decida cuáles son importantes para entenderla.

Ejemplo:

"El banco estaba cerrado porque el río lo había inundado"

"Banco" es ambiguo. Self-Attention lo conecta con "río" para desambiguar.

Intermedio 2. Query, Key, Value (Q, K, V)

Cada token se transforma en tres vectores:

  • Query (Q): "¿Qué estoy buscando?"
  • Key (K): "¿Qué información ofrezco?"
  • Value (V): "¿Qué contenido aporto?"
import torch
import torch.nn as nn

d_model = 512
x = torch.randn(1, 10, d_model)

W_q = nn.Linear(d_model, d_model)
W_k = nn.Linear(d_model, d_model)
W_v = nn.Linear(d_model, d_model)

Q = W_q(x)
K = W_k(x)
V = W_v(x)
Intermedio 3. La fórmula de Self-Attention
Attention(Q, K, V) = softmax( Q·Kᵀ / √dₖ ) · V
  1. Q·Kᵀ: similitud entre tokens.
  2. /√dₖ: escalado para estabilidad.
  3. softmax: convierte en pesos (suman 1).
  4. ·V: pondera los values.
"El gato duerme" → para "gato": Q_gato · K_El = 0.2 → peso bajo Q_gato · K_gato = 0.9 → peso alto Q_gato · K_duerme = 0.5 → peso medio Softmax → [0.15, 0.55, 0.30]
Intermedio 4. Multi-Head Attention

Varias "cabezas" en paralelo. Cada una aprende a fijarse en relaciones distintas.

Cabeza 1 → sintaxis (sujeto-verbo) Cabeza 2 → semántica (sinónimos) Cabeza 3 → dependencias largas Cabeza 4 → puntuación y estructura ...
Intermedio 5. Positional Encoding

Self-Attention no tiene noción de orden. Se añade información posicional con senos y cosenos:

PE(pos, 2i) = sin(pos / 100002i/d)
PE(pos, 2i+1) = cos(pos / 100002i/d)
Intermedio 6. Bloque Transformer completo
class TransformerBlock(nn.Module):
    def __init__(self, d_model, n_heads, d_ff):
        super().__init__()
        self.attn = MultiHeadAttention(d_model, n_heads)
        self.norm1 = nn.LayerNorm(d_model)
        self.norm2 = nn.LayerNorm(d_model)
        self.ff = nn.Sequential(
            nn.Linear(d_model, d_ff),
            nn.GELU(),
            nn.Linear(d_ff, d_model)
        )

    def forward(self, x, mask=None):
        x = x + self.attn(self.norm1(x), mask)
        x = x + self.ff(self.norm2(x))
        return x
🟡
FASE 3 — LLMs, RAG y Prompt Engineering
Avanzado 1. ¿Qué es un LLM?

Un LLM (Large Language Model) es un Transformer gigante entrenado para predecir el siguiente token.

Prompt: "El cielo es" ↓ Predice: "azul" (94%), "gris" (3%), "enorme" (1%) ↓ Elige "azul" y continúa.
Avanzado 2. Ciclo de vida de un LLM
  1. Preentrenamiento: lee billones de palabras.
  2. Instruction Tuning: se ajusta con pares instrucción-respuesta.
  3. RLHF / DPO: alineación con preferencias humanas.
  4. Despliegue: inferencia con prompts.
  5. Fine-tuning / LoRA: adaptación a dominios.
Avanzado 3. Parámetros de inferencia
ParámetroQué hace
temperatureAleatoriedad (0 = determinista, 1.5 = caótico)
top_kElegir entre los k más probables
top_pElegir entre los que sumen p de probabilidad
max_tokensLímite de tokens a generar
Avanzado 4. RAG: memoria externa

RAG combina el LLM con una base de conocimiento externa.

Pregunta → Buscar en vector DB → Añadir contexto → LLM → Respuesta
pregunta = "¿Capital de Australia?"
embedding = embed(pregunta)
docs = vector_db.search(embedding, top_k=3)
prompt = f"Contexto: {docs}\nPregunta: {pregunta}"
respuesta = llm.generate(prompt)
Avanzado 5. Prompt Engineering
  • Zero-shot: sin ejemplos.
  • Few-shot: con ejemplos.
  • Chain of Thought: "piensa paso a paso".
  • Role prompting: "actúa como experto en…".
🔴
FASE 4 — Arquitecturas avanzadas y fine-tuning
Pro 1. Formulación completa de Self-Attention
Q = XWQ,   K = XWK,   V = XWV
Attention(Q, K, V) = softmax( QKᵀ / √dk ) V
Pro 2. Complejidad computacional
ComponenteTiempoEspacio
Self-AttentionO(n² · d)O(n² + n·d)
Feed-ForwardO(n · d²)O(n · d)
Multi-HeadO(n² · d + n · d²)O(n² · h + n · d)
⚠️ Duplicar la longitud de contexto cuadruplica el coste de atención.
Pro 3. Soluciones modernas al O(n²)
FlashAttention

Reordena los cálculos para minimizar accesos a memoria HBM. Acelera 2–4× en GPU.

Sparse Attention (Longformer, BigBird)

Solo se calcula atención entre tokens cercanos o seleccionados. O(n · √n).

Linear Attention (Performer)

Aproxima el softmax con kernels. Complejidad O(n · d²).

Sliding Window (Mistral)

Cada token atiende solo a los w anteriores. Muy eficiente en práctica.

RoPE (Rotary Position Embedding)

Rota Q y K en el plano complejo. Usado en Llama, Qwen.

GQA / MQA

Comparten K y V entre varias cabezas Q. Reduce el KV-cache. Usado en Llama 3.

Pro 4. LoRA: fine-tuning eficiente
W' = W + BA

Con B ∈ ℝd×r, A ∈ ℝr×k, r ≪ d. Solo se entrenan A y B (<1% de parámetros).

from peft import LoraConfig, get_peft_model

config = LoraConfig(
    r=8,
    lora_alpha=16,
    target_modules=["q_proj", "v_proj"],
    lora_dropout=0.05
)
model = get_peft_model(base_model, config)
Pro 5. RLHF vs DPO

RLHF: reward model + PPO.

DPO: optimización directa de preferencias sin RL.

LDPO = −E[ log σ( β (log πθ(yw|x) − log πθ(yl|x) − log πref(yw|x) + log πref(yl|x) ) ) ]
Pro 6. Scaling Laws
L(N, D) ≈ (Nc/N)α + (Dc/D)β

Chinchilla (2022): óptimo N ≈ D/20. Más datos, menos parámetros.

Pro 7. MiniGPT completo en PyTorch
class MiniGPT(nn.Module):
    def __init__(self, vocab_size, d_model=256,
                 n_heads=8, n_layers=6, d_ff=1024):
        super().__init__()
        self.token_emb = nn.Embedding(vocab_size, d_model)
        self.pos_emb = nn.Embedding(512, d_model)
        self.blocks = nn.ModuleList([
            TransformerBlock(d_model, n_heads, d_ff)
            for _ in range(n_layers)
        ])
        self.norm = nn.LayerNorm(d_model)
        self.head = nn.Linear(d_model, vocab_size, bias=False)

    def forward(self, idx, mask=None):
        B, T = idx.shape
        pos = torch.arange(T, device=idx.device).unsqueeze(0)
        x = self.token_emb(idx) + self.pos_emb(pos)
        for block in self.blocks:
            x = block(x, mask)
        x = self.norm(x)
        return self.head(x)
Pro 8. Recursos avanzados
  • 📄 Attention Is All You Need (Vaswani et al., 2017)
  • 📄 Chinchilla (Hoffmann et al., 2022)
  • 📄 LoRA (Hu et al., 2021)
  • 📄 FlashAttention (Dao et al., 2022)
  • 📄 DPO (Rafailov et al., 2023)
  • 🎥 CS224n (Stanford), CS25 (Transformers)
  • 🛠️ Hugging Face, nanoGPT (Karpathy)