En 04-03 dejamos un problema señalado con nombre y apellidos: en los modelos secuencia-a-secuencia, toda la frase de entrada debía comprimirse en un único vector antes de generar la salida — el cuello de botella que degrada las secuencias largas, como resumir una reseña de 300 palabras en una nota adhesiva y traducir desde la nota. Esta lección presenta la solución, la atención, y la arquitectura que nació de llevarla al extremo: el Transformer, que desde 2017 destronó a las RNN y es la base de BERT, GPT y los LLMs actuales — cerrando el arco histórico que abrimos en 01-02. Para TecnoMarket, entender esta pieza explica por qué la vía práctica para analizar sus reseñas ya no es entrenar LSTMs desde cero, sino apoyarse en modelos de lenguaje preentrenados: el transfer learning de 05-03 aplicado al texto.

Contenido

  1. El cuello de botella, revisitado
  2. La atención: mirar toda la secuencia y ponderar
  3. Consulta, clave y valor: la analogía del catálogo
  4. Self-attention paso a paso con números
  5. Multi-head: varios focos a la vez
  6. La arquitectura Transformer a alto nivel
  7. Por qué destronó a las RNN
  8. De BERT y GPT a los LLMs
  9. Qué significa para TecnoMarket
  10. MultiHeadAttention en Keras: clasificador de reseñas

El cuello de botella, revisitado

Recuerda el esquema seq2seq de 04-03: un encoder RNN lee la frase palabra a palabra y su último estado oculto —un solo vector— es todo lo que el decoder recibe para producir la salida. Los problemas:

  • Compresión forzosa: da igual si la entrada tiene 5 palabras o 300; todo debe caber en el mismo vector de tamaño fijo.
  • Sesgo de cercanía: lo leído al final está "fresco" en el estado; lo del principio se ha ido diluyendo paso a paso (pariente del vanishing gradient de 02-03, que la LSTM alivia con su cinta transportadora pero no elimina en secuencias largas).
  • Procesamiento secuencial: para representar la palabra 300 hay que haber procesado las 299 anteriores, una a una. Nada se puede paralelizar.

La pregunta que condujo a la atención: ¿y si el decoder, en lugar de depender de un resumen único, pudiera volver a mirar toda la secuencia de entrada cada vez que lo necesita?

La atención: mirar toda la secuencia y ponderar

Esa es exactamente la idea. Con atención, el modelo conserva un vector por cada posición de la entrada (no solo el último) y, cada vez que necesita producir o representar algo, calcula cuánto importa cada posición para lo que está haciendo ahora y construye una media ponderada.

Intuitivamente: al traducir "no" en una frase, el modelo pone casi todo el peso en la palabra de negación de la entrada e ignora el resto; al decidir el sentimiento de "la batería es pésima pero la pantalla es excelente", puede repartir su foco entre "pésima" y "excelente" sin que la distancia entre ellas importe. Los pesos de atención se aprenden — son el resultado de entrenar, no reglas escritas a mano — y además son inspeccionables: puedes visualizar a qué atendió el modelo, un extra de interpretabilidad que las RNN no ofrecían.

Consulta, clave y valor: la analogía del catálogo

La formulación moderna de la atención usa tres papeles: consulta (query, Q), clave (key, K) y valor (value, V). La analogía natural en TecnoMarket es buscar en su catálogo:

  1. Escribes en el buscador "cafetera espresso barata" — esa es tu consulta (Q).
  2. Cada producto del catálogo tiene una ficha indexada: título, categoría, etiquetas — eso es su clave (K).
  3. El buscador compara tu consulta con todas las claves y asigna a cada producto una puntuación de relevancia.
  4. Lo que te llevas de cada producto no es su clave, sino su contenido: precio, descripción, imagen — su valor (V).
  5. El "resultado" es una mezcla dominada por los productos más relevantes.

La atención hace esto mismo con vectores: la puntuación de relevancia es un producto escalar Q·K (¿te suena? es la misma operación que la similitud coseno con la que comparamos embeddings en 03-04 y 04-03 — sin normalizar), las puntuaciones pasan por una softmax (02-02) que las convierte en pesos que suman 1, y la salida es la suma ponderada de los valores.

En la self-attention (auto-atención), la vuelta de tuerca clave del Transformer, cada palabra de una frase hace de las tres cosas a la vez: cada palabra genera su Q, su K y su V (mediante tres matrices de pesos aprendidas), lanza su consulta contra las claves de todas las palabras de la frase —incluida ella misma— y se re-representa como mezcla de los valores. Resultado: la representación de cada palabra pasa a incorporar su contexto. La palabra "banco" acaba representada de forma distinta en "banco de peces" y en "banco online", porque atendió a vecinas distintas.

Self-attention paso a paso con números

Veámoslo con una frase mínima de tres tokens de una reseña: "no funciona bien". Usaremos vectores de juguete de dimensión 2 y nos centraremos en cómo la palabra "funciona" se re-representa. Supón que, tras aplicar las matrices aprendidas, tenemos:

Token Q K V
no (1, 0) (1, 0) (−1, 0)
funciona (1, 1) (0, 1) (0, 1)
bien (0, 1) (0, 1) (1, 1)

Paso 1 — puntuaciones: la consulta de "funciona", Q = (1, 1), se multiplica (producto escalar) con la clave de cada token:

  • con "no": (1, 1)·(1, 0) = 1
  • con "funciona": (1, 1)·(0, 1) = 1
  • con "bien": (1, 1)·(0, 1) = 1

(En la práctica se divide por la raíz de la dimensión para estabilizar — con dim 2, entre √2 ≈ 1.41: todas quedan en ≈ 0.71.)

Paso 2 — softmax: las tres puntuaciones son iguales, así que softmax reparte el peso por igual: (0.33, 0.33, 0.33). Si la puntuación con "no" hubiera sido 2 en vez de 1 (tras escalar, 1.41 frente a 0.71), softmax daría ≈ (0.50, 0.25, 0.25): la negación dominaría la mezcla — así es como "funciona" se entera de que está negada.

Paso 3 — mezcla de valores: la nueva representación de "funciona" es la suma ponderada de los V:

0.33·(−1, 0) + 0.33·(0, 1) + 0.33·(1, 1) = (0, 0.67)

Eso es todo el mecanismo: producto escalar → softmax → media ponderada. Tres operaciones que ya conocías por separado, y que se calculan para todas las palabras a la vez como productos de matrices — de ahí su eficiencia en GPU. Y fíjate en el detalle crucial: la distancia entre palabras no aparece por ningún lado. "no" influye sobre "funciona" igual si está al lado que a 200 palabras: el cuello de botella y el sesgo de cercanía han desaparecido.

Multi-head: varios focos a la vez

Una sola atención mezcla toda la relevancia en un único reparto de pesos. Pero en una frase conviven relaciones distintas: la sintaxis ("funciona" se relaciona con su sujeto), la negación ("no" modifica a "funciona"), la correferencia ("la" se refiere a "batería")... La solución del Transformer es la atención multi-cabeza (multi-head attention): ejecutar en paralelo varias atenciones independientes —cada una con sus propias matrices Q/K/V, cada una un "foco" distinto— y concatenar sus resultados.

La analogía con las CNN es directa: igual que en 03-02 cada filtro de una capa convolucional se especializaba en un patrón (bordes verticales, cierta textura), cada cabeza de atención tiende a especializarse en un tipo de relación. Ocho o doce focos mirando la misma frase desde ángulos distintos.

La arquitectura Transformer a alto nivel

El artículo "Attention Is All You Need" (2017) hizo la apuesta radical que su título anuncia: eliminar la recurrencia por completo y construirlo todo con atención. La arquitectura, a vista de pájaro:

flowchart TB
    T[Tokens de la frase] --> E[Embeddings<br/>uno por token]
    P[Codificacion posicional<br/>marca el ORDEN] --> S
    E --> S((suma))
    S --> B1[Bloque Transformer 1]
    B1 --> B2[Bloque Transformer 2]
    B2 --> BN[... bloque N]
    BN --> OUT[Representaciones contextuales<br/>una por token]

    subgraph Bloque[Cada bloque Transformer]
        A[Self-attention multi-cabeza<br/>cada token mira a todos] --> FF[Red feed-forward<br/>procesa cada posicion]
    end

Las piezas, y por qué casi todas te suenan:

  • Embeddings: la misma capa de 04-03 — cada token se convierte en un vector denso.
  • Codificación posicional: al eliminar la recurrencia se pierde la noción de orden (la atención trata la frase como un conjunto: "perro muerde hombre" = "hombre muerde perro"). La solución es sumar a cada embedding un vector que codifica su posición, devolviendo el orden a la red.
  • Bloques apilados (6, 12, 96...): cada uno combina self-attention multi-cabeza (comunicación entre posiciones) con una pequeña red feed-forward (procesamiento de cada posición por separado), más conexiones residuales —las skip connections de ResNet que vimos en 03-03, la "autopista del gradiente" imprescindible para apilar tantos bloques— y normalización de capa (prima hermana de la BatchNormalization de 05-04).
  • Sin recurrencia: nada espera a nada. Todas las posiciones se procesan en paralelo, y esa es la propiedad que cambió la historia: permite entrenar con volúmenes de texto y tamaños de modelo que una RNN, condenada a leer palabra a palabra, jamás podría digerir.

Por qué destronó a las RNN

Aspecto RNN / LSTM (módulo 4) Transformer
Procesamiento de la secuencia Secuencial: token a token Paralelo: todos los tokens a la vez
Dependencias largas Se degradan con la distancia (pese a la cinta transportadora de la LSTM) Distancia irrelevante: cualquier token atiende a cualquier otro en un paso
Cuello de botella Sí: el estado oculto resume todo No: una representación por token, siempre accesible
Velocidad de entrenamiento en GPU Limitada (no paraleliza en el tiempo) Excelente (productos de matrices)
Escalabilidad a modelos/datos enormes Pobre La razón de la era de los LLMs
Coste con secuencias muy largas Lineal en longitud Cuadrático (cada token con cada token): su talón de Aquiles
Interpretabilidad Estado oculto opaco Pesos de atención visualizables
¿Sigue teniendo sentido usarla? Sí: series temporales, dispositivos modestos, secuencias muy largas con pocos recursos Estándar en NLP y en expansión (visión, audio)

La LSTM de tu clasificador de reseñas no era mala; es que el Transformer come mejor con los mismos recursos, y sobre todo escala donde la RNN se atasca.

De BERT y GPT a los LLMs

Sobre la arquitectura Transformer se construyeron las dos familias que definen el NLP moderno. Ambas explotan la misma idea que el transfer learning de 05-03: preentrenar carísimo una vez, adaptar barato muchas veces.

  • BERT (2018) — comprensión. Se preentrena tapando palabras al azar en miles de millones de frases y pidiendo a la red que las adivine mirando el contexto en ambas direcciones (recuerda Bidirectional de 04-02, elevado al cubo). El resultado es un modelo que "entiende" el idioma y que se afina en horas para sentimiento, clasificación, extracción de entidades o búsqueda semántica. Es la base congelada de MobileNetV2, pero para texto.
  • GPTgeneración. Se preentrena con la tarea más simple imaginable: predecir la siguiente palabra, una y otra vez, sobre cantidades enormes de texto, atendiendo solo al contexto anterior. De esa tarea humilde, a suficiente escala, emerge la capacidad de redactar, resumir, traducir y conversar.
  • Los LLMs actuales (GPT-4 y sucesores, Claude, Llama, Gemini...) son, en lo esencial, la misma receta a escala brutal — más bloques, más cabezas, más datos, más GPU — más técnicas de afinado posterior para seguir instrucciones. Aquí se cierra el arco que abrimos en la historia de 01-02: del perceptrón a AlexNet fue medio siglo; de "Attention Is All You Need" a los LLMs conversacionales, un lustro. Las tendencias y lo que viene después lo tratamos en 08-03.

Qué significa para TecnoMarket

La consecuencia práctica es la moraleja de 05-03 aplicada al lenguaje: TecnoMarket no debe entrenar modelos de lenguaje desde cero. Su hoja de ruta razonable para las reseñas:

  1. Corto plazo: mantener el clasificador LSTM de 04-03 donde ya funciona (es barato y está en producción con su umbral de confianza).
  2. Siguiente paso: sustituirlo por un modelo tipo BERT preentrenado en español, afinado con las reseñas etiquetadas de TecnoMarket — mismos datos, varios puntos más de accuracy, y mejor manejo de negaciones y frases largas ("no diría que sea mala, pero...").
  3. Más allá: usar LLMs vía API para tareas generativas — resumir las 400 reseñas de un producto en tres frases para la ficha, redactar respuestas borrador para atención al cliente (con revisión humana: el patrón de cola de revisión de 03-04, una vez más).

MultiHeadAttention en Keras: clasificador de reseñas

Keras trae la atención multi-cabeza como capa (layers.MultiHeadAttention). Para tocar el mecanismo con las manos, construyamos un mini-clasificador de sentimiento que sustituye la LSTM de 04-03 por un bloque de self-attention:

from tensorflow import keras
from tensorflow.keras import layers

VOCABULARIO = 10000   # tokens distintos, como en 04-03
LONGITUD = 200        # reseñas truncadas/rellenadas a 200 tokens
DIM_EMB = 64

entradas = keras.Input(shape=(LONGITUD,))            # ids de tokens

# 1. Embeddings de tokens (04-03) + embeddings de POSICION (aprendidos)
emb_tokens = layers.Embedding(VOCABULARIO, DIM_EMB)(entradas)
posiciones = keras.ops.arange(LONGITUD)              # [0, 1, ..., 199]
emb_pos = layers.Embedding(LONGITUD, DIM_EMB)(posiciones)
x = emb_tokens + emb_pos   # sin esto, la atencion ignoraria el ORDEN

# 2. Self-attention multi-cabeza: la frase se atiende A SI MISMA
#    (query=x, value=x, key=x -> por eso es "self")
atencion = layers.MultiHeadAttention(
    num_heads=4,       # 4 focos en paralelo
    key_dim=16,        # dimension de Q/K por cabeza (4 x 16 = 64)
)(query=x, value=x, key=x)

# 3. Conexion residual + normalizacion: la receta del bloque Transformer
#    (la autopista del gradiente de 03-03, en version NLP)
x = layers.LayerNormalization()(x + atencion)

# 4. De una representacion POR TOKEN a un vector por reseña, y a clasificar
x = layers.GlobalAveragePooling1D()(x)   # promedia los 200 vectores
x = layers.Dropout(0.3)(x)               # regularizacion (05-04)
salidas = layers.Dense(1, activation="sigmoid")(x)   # sentimiento +/-

modelo = keras.Model(entradas, salidas)
modelo.compile(optimizer="adam", loss="binary_crossentropy",
               metrics=["accuracy"])
modelo.summary()

Los puntos finos:

  • query=x, value=x, key=x: los tres papeles salen de la misma secuencia — eso es exactamente la self-attention. (En un seq2seq con atención cruzada, la query vendría del decoder y claves/valores del encoder.)
  • Embeddings de posición sumados: la versión aprendida de la codificación posicional. Comenta esa línea y verás caer la accuracy: sin posición, "no funciona bien" y "funciona bien, no" serían indistinguibles.
  • Residual + LayerNormalization (x + atencion): el mismo patrón del bloque residual que implementaste en 03-03, que permite apilar bloques sin ahogar el gradiente. Para un Transformer "de verdad" añadirías la pequeña red feed-forward y repetirías el bloque N veces.
  • Entrenado sobre IMDB (el dataset de 04-03), este modelo alcanza cifras similares a la LSTM (~86-88 %) entrenando más rápido por época en GPU. La ventaja decisiva del Transformer no se ve a esta escala de juguete — aparece al escalar a modelos y corpus enormes, que es justo lo que los preentrenados ya hicieron por ti.

No entrenaremos aquí un Transformer completo (ni falta que hace: la lección de 05-03 es que ese preentrenamiento ya está pagado); el objetivo era que el mecanismo deje de ser una caja negra.

Errores Comunes y Consejos

  • Olvidar la codificación posicional. El error conceptual número uno: la atención por sí sola es ciega al orden. Si tu modelo con MultiHeadAttention rinde sospechosamente mal, comprueba que sumas embeddings de posición.
  • Creer que la atención "entiende". Los pesos de atención son similitudes aprendidas útiles para la tarea, no comprensión humana. Visualizarlos ayuda a depurar, pero sobreinterpretarlos lleva a conclusiones erróneas.
  • Descartar las RNN por moda. Para la serie de ventas de 04-04, con una secuencia univariante y hardware modesto, la LSTM sigue siendo una elección excelente. El coste cuadrático de la atención con secuencias largas es real.
  • Confundir los papeles Q/K/V. Regla mnemotécnica de catálogo: la consulta es lo que buscas, la clave es el índice contra el que se compara, el valor es lo que te llevas. En self-attention los tres salen del mismo sitio, pero con matrices de proyección distintas.
  • Entrenar un Transformer desde cero con pocos datos. Con los ~25 000 ejemplos de IMDB, un Transformer grande sobreajusta (aplica lo aprendido en 05-04). La vía correcta con pocos datos es partir de un modelo preentrenado — transfer learning, 05-03.

Ejercicios

Ejercicio 1. Explica, usando el cuello de botella de 04-03 y la tabla RNN vs. Transformer, por qué una LSTM tiende a fallar en la reseña "Al principio pensé que era el mejor altavoz que había tenido, con un sonido espectacular y un diseño precioso, pero después de dos semanas dejó de funcionar" y por qué la self-attention lo tiene más fácil.

Ejercicio 2. Con la tabla Q/K/V del ejemplo numérico, calcula la nueva representación del token "no" (consulta Q = (1, 0)): puntuaciones con las tres claves, softmax (puedes aproximar; sin escalado, para simplificar) y mezcla de valores. Los valores eran: no → (−1, 0), funciona → (0, 1), bien → (1, 1).

Ejercicio 3. El equipo de TecnoMarket debate dos propuestas: (A) entrenar desde cero un Transformer con sus 30 000 reseñas etiquetadas; (B) afinar un BERT en español preentrenado con esas mismas reseñas. Argumenta cuál es preferible conectándolo con dos lecciones concretas de este módulo.

Soluciones

Solución 1.

La reseña es larga y su primera mitad es intensamente positiva ("el mejor", "espectacular", "precioso"); el giro decisivo ("dejó de funcionar") llega al final, pero el matiz que lo gobierna ("pero después de dos semanas") exige relacionar el final con todo lo anterior. En una LSTM, la información viaja paso a paso por el estado oculto: el sentimiento positivo del principio llega diluido al final (sesgo de cercanía) y todo debe caber en un único vector (cuello de botella), así que la mezcla de señales contradictorias a mucha distancia es su peor escenario. En la self-attention, el token "pero" y "dejó de funcionar" pueden atender directamente, con peso alto y en un solo paso, a los elogios del principio — la distancia no penaliza — y la representación final captura el contraste completo: la clave para clasificarla correctamente como negativa.

Solución 2.

Puntuaciones de Q_no = (1, 0) contra cada clave:

  • con K_no = (1, 0): 1·1 + 0·0 = 1
  • con K_funciona = (0, 1): 1·0 + 0·1 = 0
  • con K_bien = (0, 1): 0

Softmax de (1, 0, 0): e¹ ≈ 2.72 y e⁰ = 1 dos veces → pesos ≈ (2.72, 1, 1)/4.72 ≈ (0.58, 0.21, 0.21).

Mezcla de valores: 0.58·(−1, 0) + 0.21·(0, 1) + 0.21·(1, 1) = (−0.58 + 0.21, 0.21 + 0.21) ≈ (−0.37, 0.42). El token "no" se re-representa atendiendo sobre todo a sí mismo, pero incorporando algo de contexto de "funciona" y "bien" — con matrices entrenadas de verdad, esos repartos se ajustan a lo que la tarea necesite.

Solución 3.

Es preferible la B, por dos conexiones directas con este módulo:

  • 05-03 (transfer learning): preentrenar un modelo de lenguaje exige corpus de miles de millones de palabras y GPU industrial — el "lujo" que alguien ya pagó. Afinar un BERT preentrenado es la misma jugada que MobileNetV2 con las fotos de producto: conocimiento genérico gratis, adaptación específica barata. 30 000 reseñas son excelentes para afinar, pero ridículas para preentrenar.
  • 05-04 (regularización): un Transformer con capacidad suficiente para aprender el idioma desde cero tiene una varianza enorme; con 30 000 ejemplos memorizaría el conjunto de entrenamiento (hueco train/val gigante) por mucha regularización que se apile. El modelo preentrenado ya trae los "rasgos del idioma" y solo ajusta la última milla, con mucho menor riesgo de sobreajuste.

(Además, la opción B llega antes a producción y con mejores métricas — la ingeniería también cuenta.)

Conclusión

El cuello de botella de 04-03 tenía solución: en lugar de comprimir la secuencia en un vector, la atención conserva todo y pondera qué mirar en cada momento — un mecanismo de tres pasos (Q·K, softmax, mezcla de V) construido con piezas que ya dominabas. El Transformer llevó la idea al límite: solo atención, sin recurrencia, con codificación posicional para no perder el orden y bloques apilados sobre conexiones residuales — y su paralelismo desató la escala que produjo BERT, GPT y los LLMs, cerrando la historia que empezamos a contar en 01-02. Para TecnoMarket, la lección operativa es que el análisis de sus reseñas pasa por afinar modelos preentrenados, no por competir con ellos.

Con esto termina el módulo de técnicas avanzadas: ya sabes generar (GAN), comprimir y detectar anomalías (autoencoders), reutilizar conocimiento (transfer learning), generalizar (regularización) y atender (Transformers). En el módulo 6 bajamos al taller: TensorFlow y PyTorch a fondo, cómo elegir framework, y cómo guardar, cargar y desplegar los modelos que ya sabes construir.

Curso de Deep Learning

Módulo 1: Introducción a Deep Learning

Módulo 2: Fundamentos de Redes Neuronales

Módulo 3: Redes Neuronales Convolucionales (CNN)

Módulo 4: Redes Neuronales Recurrentes (RNN)

Módulo 5: Técnicas Avanzadas en Deep Learning

Módulo 6: Herramientas y Frameworks

Módulo 7: Proyectos Prácticos

Módulo 8: Consideraciones Éticas y Futuro del Deep Learning

© Copyright 2026. Todos los derechos reservados