Fundamentos de la Arquitectura Transformer
El Transformer es un paradigma de modelado de secuencias diseñado para capturar dependencias de largo alcance mediante mecanismos de atención. A diferencia de las redes recurrentes, procesa los datos en paralelo, permitiendo una mayor eficiencia en el entrenamiento.
1. Arquitecturas Derivadas
- Encoder-Decoder (Original): Utilizado en tareas de traducción donde se transforma una secuencia de origen en una de destino.
- Encoder-only (ej. BERT): Especializado en la comprensión del lenguaje, clasificación de texto y extracción de entidades.
- Decoder-only (ej. GPT): Optimizado para la generación de contenido mediante el modelado de lenguaje autorregresivo.
2. Procesamiento de Entrada: Embeddings y Codificación Posicional
Embeddings de Tokens
Cada identificador de palabra se mapea a un espacio vectorial continuo de dimensión d_model. Este proceso convierte representaciones discretas en vectores densos donde la cercanía geométrica suele correlacionarse con la similitud semántica.
Mecanismos de Posición
Debido a que la auto-atención es invariante al orden, es necesario inyectar información sobre la estructura secuencial. Existen tres enfoques principales:
- Codificación Sinusoidal: Utiliza funciones seno y coseno de diferentes frecuencias para codificar posiciones absolutas de forma fija.
- Embeddings Aprendidos: Vectores de posición que el modelo ajusta durante el entrenamiento.
- Codificación Rotatoria (RoPE): Aplica una rotación a las consultas (Queries) y claves (Keys) basada en su posición relativa, técnica estándar en modelos modernos como Llama.
3. Mecanismo de Atención (Scaled Dot-Product Attention)
La operación central consiste en mapear una consulta (Query) y un conjunto de pares clave-valor (Key-Value) a una salida. El cálculo se realiza de la siguiente manera:
def calcular_atencion(q, k, v, mascara=None):
# Dimensión de las claves
d_k = q.shape[-1]
# Producto escalar para medir similitud
similitud = torch.matmul(q, k.transpose(-2, -1))
# Escalamiento para estabilizar gradientes
puntuaciones = similitud / math.sqrt(d_k)
if mascara is not None:
puntuaciones = puntuaciones.masked_fill(mascara == 0, -1e9)
# Distribución de probabilidad sobre la secuencia
pesos_atencion = torch.softmax(puntuaciones, dim=-1)
# Agregación de valores basada en los pesos
return torch.matmul(pesos_atencion, v)
El factor 1/sqrt(d_k) es crucial para evitar que el softmax entre en regiones de gradiente nulo cuando las dimensiones son elevadas, lo que causaría inestabilidad durante el entrenamiento.
4. Atención Multi-Cabezal (Multi-Head Attention)
En lugar de realizar una única función de atención, el modelo proyecta linealmente las consultas, claves y valores múltiples veces de forma independiente. Esto permite que el modelo atienda a información de diferentes subespacios de representación simultáneamente.
# Lógica de concatenación de cabezales
# n_cabezales * d_v = d_model
cabezales = [atencion_individual(q, k, v) for _ in range(num_cabezales)]
salida_unificada = concatenar(cabezales, dim=-1)
salida_final = proyeccion_lineal(salida_unificada)
5. Red de Alimentación Hacia Adelante (FFN)
Cada bloque incluye una red neuronal aplicada a cada posición de forma idéntica e independiente. Generamlente consiste en dos transformaciones lineales con una activación no lineal (como ReLU o GeLU) entre ellas:
FFN(x) = max(0, x * W1 + b1) * W2 + b2
6. Normalización y Conexiones Residuales
Para facilitar el entrenamiento de redes muy profundas, el Transformer utiliza:
- Conexiones Residuales:
Salida = x + Subcapa(x). Permiten que el gradiente fluya sin obstáculos por las capas iniciales. - Layer Normalization (LN): A diferencia de Batch Normalization, LN normaliza a través de las características de cada token individualmente, lo que es ideal para secuencias de longitud variable.
7. El Bloque del Decoder y la Máscara Causal
El bloque del decodificador introduce dos modificaciones clave respecto al codificador:
- Auto-atención Enmascarada: Evita que una posición determinada atienda a posiciones futuras. Durante el entrenamiento, esto se logra mediante una matriz triangular inferior que anula las conexiones con tokens posteriores.
- Atención Cruzada (Encoder-Decoder Attention): Las consultas provienen de la capa anterior del decodificador, mientras que las claves y valores provienen de la salida final del codificador.
8. Proceso de Inferencia
La generación de texto es un proceso iterativo:
- Se introduce un token de inicio de secuencia (
<bos>). - El modelo predice la distribución de probabilidad para el siguiente token.
- Se selecciona un token (mediante búsqueda codiciosa, beam search o muestreo).
- El token seleccionado se añade a la secuencia de entrada para la siguiente iteración.
- El proceso termina al generar el token de fin de secuencia (
<eos>) o alcanzar el límite de longitud.