Transformers

Arquitectura de un Transformer

Antecedentes

Para entender el origen de los Transformers necesitamos repasar algunos conceptos que no hemos tratado todavía.

De palabras a vectores

Hasta ahora hemos abordado arquitecturas principalmente orientadas a imagen, lo cual facilita su procesamiento porque ya vienen en formato numérico (las imágenes son matrices de píxeles), pero los Transformers se crearon para tratar texto. Las redes neuronales no entienden palabras, así que hay que transformar el texto en una representación numérica.

One-Hot Encoding

La aproximación más básica sería asociar cada palabra con un número. Por ejemplo, podríamos representar la frase "The cat sat on the mat" como un vector "[25, 7, 4, 8, 27, 15]".

❗ Problema → Si introdujéramos esos identificadores enteros directamente como valores numéricos, la red interpretaría relaciones de orden y distancia que no existen. En la práctica, los token IDs se usan como índices de una tabla de embeddings, no como magnitudes.

Dos palabras representadas por números arbitrarios

💡 En su lugar se podría asociar cada palabra con un vector con tantas posiciones como palabras haya en el vocabulario del problema a tratar. Para representar una palabra se marcaría un 1 en la posición que le corresponde y 0 en el resto. Por ejemplo, si el vocabulario solo tuviera 3 palabras:

One-hot encoding de tres palabras y su representación geométrica

Con esta representación la distancia entre palabras se mantiene! Esto ocurre independientemente del número de palabras (dimensionalidad) del vocabulario.

❗ Sin embargo:

  • Almacenamiento innecesario: una frase de 10 palabras con un vocabulario de 400 términos se convierte en una matriz de 10×400 donde la mayoría de valores son 0.
  • Todas las palabras son equidistantes: esta representación no expresa que palabras como "cat" y "dog" estén semánticamente más cerca que "cat" y "table".

Embeddings

En relación con esto último, nosotros como humanos entendemos que hay palabras que semánticamente guardan más relación con unas que con otras. "coche", "mecánica" y "rueda" están conceptualmente más cerca entre sí que "nube" o "volcán".

Por ejemplo, ¿cómo ordenarías mentalmente las imágenes de la izquierda?

Una opción podría ser por color y tipo de coche → Quedaría algo como la imagen de la derecha.

Ejemplo de ordenación de imágenes de coches por color y tipo

La ordenación anterior es solo una representación esquemática en dos dimensiones de algunas propiedades que percibimos. No implica que el cerebro comprima literalmente las imágenes a un plano. Una red neuronal sí puede aprender una representación vectorial más compacta y útil para una tarea posterior.

Esto no ocurre únicamente con imágenes, cualquier dato que pueda convertirse a una representación numérica puede ser sujeto a este mismo proceso. El texto ya vimos que puede ser convertido a una representación numérica, cuya dimensionalidad es muy grande, así que se puede modelar para reducirla/comprimirla.

Al principio, la capa de embeddings no tiene ningún conocimiento sobre cómo organizar los datos, pero, a medida que se entrena, aprende representaciones adecuadas para resolver la tarea. Por ejemplo, al analizar si la reseña de una película es positiva o negativa, palabras como "contento", "satisfactorio" o "gusta" tenderán a quedar próximas. Si la tarea es detectar si una publicación es ofensiva, la organización no tiene por qué seguir el mismo patrón.

Tokens

En la práctica el texto no se separa en palabras sino en unidades numéricas que denominamos tokens.

Los tokens son solo índices dentro de un vocabulario: el número 1437 no significa nada por sí mismo, es simplemente una posición en una lista de tokens. Los embeddings de cada token se inicializan de forma aleatoria y, según el modelo va viendo palabras durante el entrenamiento, ajusta los valores de cada vector para obtener la mejor representación de cada uno.

Pipeline de tokenización y lookup de embeddings

Existen diferentes formas de tokenizar el texto. BPE, Unigram y WordPiece son algoritmos habituales; SentencePiece es una biblioteca que puede entrenar, entre otros, modelos Unigram o BPE.

Redes recurrentes y Vanishing Gradient

Volviendo a la parte de modelado, inicialmente muchas tareas de aprendizaje automático se resolvían con arquitecturas neuronales sencillas. Con el tiempo, las arquitecturas evolucionaron para adaptarse a la naturaleza de los datos:

  • Imágenes → Convolutional Neural Networks (CNNs)
  • Datos organizados en grafos → Graph Neural Networks (GNNs)
  • Datos secuenciales, como texto o series temporales → Recurrent Neural Networks (RNNs)

En los datos secuenciales el orden importa. Al procesar una palabra, por ejemplo, es necesario tener en cuenta las palabras anteriores porque aportan el contexto que permite interpretarla. Las redes recurrentes son precisamente útiles para esto porque incorporan conexiones que reutilizan la información procesada en pasos anteriores (a diferencia de una red multicapa, cuyas conexiones avanzan únicamente hacia la salida).

En una RNN, la primera palabra se procesa y el estado resultante se incorpora al procesamiento de la siguiente. El proceso se repite hasta recorrer toda la secuencia. Así, el estado de la red en cada paso depende tanto de la entrada actual como de los estados anteriores, de ahí el nombre de red recurrente.

El problema principal con las RNNs es que, cuando las secuencias son muy largas, la influencia de los primeros elementos sobre los últimos puede hacerse cada vez menor. La red acaba «olvidando» información del comienzo de la secuencia, un problema relacionado con lo que se conoce como el vanishing gradient.

Las arquitecturas LSTM y GRU mitigan este problema mediante mecanismos que controlan qué información se conserva, actualiza u olvida. Aun así, cada estado depende del anterior: esta dependencia impide paralelizar los pasos temporales de una misma secuencia, aunque sí puedan procesarse varias secuencias en paralelo.

Mecanismos de atención

El trabajo Neural Machine Translation by Jointly Learning to Align and Translate[bahdanau2014neural] popularizó la atención neuronal en traducción automática: para producir cada salida, el modelo construye una combinación ponderada de las representaciones de entrada.

Piensa en cómo traducimos a otro idioma. No traducimos palabra a palabra, sino que nos centramos en palabras específicas de la frase original para traducir la palabra actual. Es decir, fijamos nuestra atención en partes específicas de la frase.

Por ejemplo, en una frase como "el jugador mostró sus cartas":

  • La relación entre "jugador" y "cartas" nos traslada al concepto de juego
  • "mostró" como verbo de la oración, está muy conectado al sujeto "jugador"
La atención conecta las palabras jugador, mostró y cartas según su relación contextual

Cada representación de entrada se multiplica por tres matrices aprendidas, WQW_Q, WKW_K y WVW_V, para producir tres proyecciones:

  • Query (Q): expresa qué información busca el token actual.
  • Key (K): describe qué información ofrece cada token.
  • Value (V): contiene la información que se combinará para producir la salida.

No son tres redes recurrentes independientes, sino proyecciones lineales que se aprenden junto con el resto del Transformer.

Las proyecciones Query y Key producen scores de compatibilidad entre tokens

Para cuantificar la compatibilidad calculamos productos escalares entre queries y keys. El resultado depende de su dirección y magnitud; por eso se divide por dk\sqrt{d_k} antes de aplicar softmax:

S=QKdk,A=softmax(S),Attention(Q,K,V)=AV.S=\frac{QK^\top}{\sqrt{d_k}},\qquad A=\operatorname{softmax}(S),\qquad \operatorname{Attention}(Q,K,V)=AV.

Cada fila de SS contiene scores sin normalizar. Cada fila de AA contiene pesos no negativos que suman 1.

Producto escalar key-query (1)
Producto escalar key-query (2)

La figura siguiente muestra una fila de la matriz de pesos AA: cuánto atiende el token The a cada posición.

Pesos de atención normalizados del token The sobre cinco palabras
Vector de atención para el token 'The'.

De esta manera, a diferencia de las redes recurrentes, se pueden asociar palabras sin importar qué tan lejos estén en la frase.

La tercera proyección aprendida produce un vector Value para cada token.

Vectores Value que contienen la información combinada por los pesos de atención

La salida para una consulta es la suma ponderada de los vectores Value, jAijVj\sum_j A_{ij}V_j. El resultado es un vector contextualizado:

Suma ponderada de cinco vectores Value para producir un vector contextualizado

En multi-head attention, varias cabezas aplican proyecciones distintas en paralelo. Cada una puede especializarse en relaciones diferentes; sus salidas se concatenan y se proyectan de nuevo.

Transformers

Habíamos visto que con las redes recurrentes teníamos principalmente dos problemas derivados del procesamiento secuencial:

  • se dificulta el manejo de dependencias muy lejanas;
  • no se pueden paralelizar los pasos temporales de una misma secuencia.

Con los mecanismos de atención se mitiga en parte el primer problema, pero el segundo sigue existiendo.

Bloque Transformer con atención multi-cabeza, red feed-forward, residuales y normalización
Arquitectura simplificada de un transformer.

Cada bloque Transformer combina multi-head attention con una red feed-forward aplicada de forma independiente a cada posición. Ambas subcapas están rodeadas por conexiones residuales y normalización. El encoder utiliza self-attention bidireccional; el decoder autorregresivo aplica una máscara causal y, en la arquitectura encoder-decoder original, cross-attention sobre la salida del encoder.

Las entradas/salidas dependen del objetivo a resolver. Ejemplos:

  • Traducción. Input encoder: frase en idioma 1; input decoder: frase en idioma 2; output: frase en idioma 2 desplazada una unidad.
  • Predicción de texto. Input encoder: no hay encoder. Input decoder: frase; output: siguiente token/palabra.
  • Predicción de series temporales. Input encoder: serie temporal (ej: T1, T2, T3, T4). Input decoder: continuación de la serie (T4, T5); output: continuación de la serie desplazada una unidad (T5, T6).

Codificación posicional

Si ahora se procesa todo al mismo tiempo, ¿cómo se sabe el orden de las secuencias?

El Transformer original suma a cada embedding un vector posicional determinista. Utiliza pares de funciones seno y coseno con frecuencias distintas: las dimensiones de baja frecuencia cambian lentamente y las de alta frecuencia distinguen posiciones cercanas. Esta construcción proporciona un patrón único para cada posición y permite que desplazamientos relativos puedan expresarse mediante transformaciones lineales. No se deriva de una codificación binaria ni utiliza una única onda.

PE(pos,2i)=sin(pos100002i/dmodel)PE_{(pos,\,2i)} = \sin\left(\frac{pos}{10000^{2i/d_{model}}}\right) PE(pos,2i+1)=cos(pos100002i/dmodel)PE_{(pos,\,2i+1)} = \cos\left(\frac{pos}{10000^{2i/d_{model}}}\right)

De esta manera, el Transformer recibe información sobre el orden sin introducir una dependencia recurrente entre posiciones.

Ondas seno y coseno de distintas frecuencias codifican la posición de cada token

Resumen

La representación de un token combina su embedding con información posicional
Procesamiento hasta salida del encoder.

Con esto ya tenemos una noción de las partes principales del Transformer.

Positional Embeddings aprendibles

En modelos como BERT o GPT-2 se reemplazaron las funciones senoidales por positional embeddings aprendibles, es decir, cada posición tiene un embedding entrenable, igual que las palabras.

  • Ventaja: el modelo aprende la mejor representación posicional para su tarea.
  • Desventaja: pierde la generalización a secuencias más largas que las vistas durante el entrenamiento.

RoPE (Rotary Positional Embedding)

Tanto la codificación sinusoidal como los positional embeddings aprendibles comparten la misma estrategia: calculan un vector de posición y lo suman al embedding de la palabra antes de que la secuencia entre al Transformer. Sin embargo, a la atención no le interesa la posición absoluta de cada palabra, sino la distancia relativa entre la palabra que pregunta (query) y la palabra a la que atiende (key). Sumar un vector de posición fijo obliga al modelo a inferir esa distancia indirectamente, comparando dos posiciones absolutas.

RoPE[su2021roformer] es una estrategia adoptada por modelos más recientes, en la que, en lugar de sumar la posición, la codifica como una rotación que se aplica directamente a los vectores query y key dentro de cada capa de atención → nunca al embedding de entrada, y nunca al vector value.

La idea geométrica

Rotar un vector 2D un ángulo θ\theta alrededor del origen no cambia su longitud, solo su orientación. RoPE aprovecha justo esta propiedad: toma el vector query (o key) de una palabra en la posición mm, lo divide en parejas de componentes (x2i,x2i+1)(x_{2i}, x_{2i+1}), y rota cada pareja un ángulo proporcional a mm:

(x2ix2i+1)=(cos(mθi)sin(mθi)sin(mθi)cos(mθi))(x2ix2i+1)\begin{pmatrix} x'_{2i} \\ x'_{2i+1} \end{pmatrix} = \begin{pmatrix} \cos(m\theta_i) & -\sin(m\theta_i) \\ \sin(m\theta_i) & \cos(m\theta_i) \end{pmatrix} \begin{pmatrix} x_{2i} \\ x_{2i+1} \end{pmatrix}
RoPE codifica la posición rotando las componentes de Query y Key

Cada pareja de dimensiones ii gira a una frecuencia distinta, θi=100002i/dmodel\theta_i = 10000^{-2i/d_{model}} → las mismas frecuencias que usa la codificación sinusoidal. Las primeras parejas (frecuencia alta) giran rápido y distinguen posiciones cercanas; las últimas (frecuencia baja) giran despacio y capturan relaciones a largo plazo. Un vector de dmodeld_{model} dimensiones se trata así como dmodel/2d_{model}/2 parejas independientes, cada una rotando en su propio plano 2D a su propia velocidad. Este proceso se aplica igual al vector query (con su posición mm) y al vector key (con su posición nn) de cada token.

Por qué esto codifica la posición relativa

Este es el resultado clave de RoPE. Al calcular la atención, lo que importa es el producto escalar entre el query rotado de la posición mm y el key rotado de la posición nn. Llamando RmR_m a la matriz de rotación en la posición mm, y aprovechando que las rotaciones son ortogonales (Rm=RmR_m^\top = R_{-m}):

(Rmq)(Rnk)=qRmRnk=qRnmk(R_m q)^\top (R_n k) = q^\top R_m^\top R_n k = q^\top R_{n-m} \, k

El resultado no depende de mm y nn por separado, sino únicamente de su diferencia nmn-m: la distancia relativa entre las dos palabras. La posición absoluta desaparece de la ecuación y solo sobrevive la relación entre posiciones, que es justo lo que la atención necesita saber.

La diferencia angular entre vectores RoPE representa una distancia relativa entre posiciones

Ventajas frente a las aproximaciones anteriores

  • Codifica relaciones relativas de forma nativa, sin sumar nada al embedding ni aprender una tabla de posiciones.
  • Preserva la norma de los vectores: una rotación no cambia la longitud del vector, así que no distorsiona la escala de los productos escalares como sí lo haría sumar un vector de posición grande.
  • Generaliza mejor a secuencias más largas que las vistas en entrenamiento, porque el mecanismo no está atado a un rango fijo de posiciones aprendidas (aunque extender el contexto mucho más allá del entrenamiento sigue requiriendo ajustes adicionales, como reescalar las frecuencias — técnicas como NTK-aware scaling o YaRN).
  • No añade parámetros: a diferencia de los positional embeddings aprendibles, las rotaciones se calculan con una fórmula fija, no se entrenan.

En resumen, el flujo que siguen QQ y KK justo antes de calcular la atención pasa a ser: embedding → proyección lineal a Q/K/V → rotar Q y K según su posición → producto escalar.

Proceso de aprendizaje

El Transformer original combina un encoder con un decoder autorregresivo. En tareas de generación, ese decoder se entrena para predecir el siguiente token de una secuencia a partir de los tokens anteriores.

Al decoder se le pasa como input la propia secuencia objetivo, y como output esa misma secuencia desplazada una posición. Esto es lo que se conoce como teacher forcing: durante el entrenamiento, en la posición tt el modelo recibe como input los tokens reales x1,,xtx_1, \dots, x_t (no los que él mismo generaría) y tiene que predecir el token xt+1x_{t+1}.

Teacher forcing desplaza la secuencia objetivo para predecir el siguiente token

Para que esto funcione, hacen falta dos ingredientes:

  • Máscara causal: la self-attention del decoder se enmascara para que la predicción del token t+1t+1 no pueda "hacer trampa" mirando tokens futuros → cada posición solo puede atender a sí misma y a las anteriores.
  • Función de pérdida: en cada posición se compara la distribución de probabilidad predicha sobre el vocabulario (la salida de una capa final softmax) con el token real mediante cross-entropy, y se promedia a lo largo de toda la secuencia.

Gracias a la combinación de teacher forcing y máscara causal, todas las posiciones de la secuencia se pueden entrenar a la vez en un único forward pass → no hace falta esperar a que el modelo prediga el token tt para procesar el t+1t+1.

Esta misma idea, entrenar prediciendo el siguiente token a partir del contexto anterior es la que, escalada a cantidades masivas de texto sin etiquetar, se convertirá en el paradigma de preentrenamiento de los modelos fundacionales de lenguaje → lo veremos en detalle en el siguiente capítulo.

Extra: Vision Transformers

En los ViT [dosovitskiy2020image], las imágenes se dividen en múltiples subimágenes (patches) que se pasan al encoder del Transformer como si fueran una secuencia.

Vision Transformer divide una imagen en parches y los procesa como una secuencia

De nuevo, como se trata de un Transformer que procesa todo en paralelo y por tanto desconoce el orden de los datos, es necesario aportarle esa información.

En una imagen, la posición bidimensional de cada patch también importa. El ViT original aplana la cuadrícula en una secuencia y suma embeddings posicionales unidimensionales aprendidos. Las codificaciones sinusoidales y las variantes bidimensionales también son alternativas válidas; la elección depende de la arquitectura y de la extrapolación deseada.

Es decir, se le pasa la imagen y su posición:

ViT suma embeddings posicionales aprendidos a la secuencia de parches

No se le pasan los números 1, 2, 3… sino que cada número está asociado con un vector. Estos vectores son parámetros que el modelo aprende durante el entrenamiento → embeddings aprendibles.

En este caso se puede entrenar solo el encoder con alguno de los paradigmas de aprendizaje que veremos en el siguiente capítulo. Una vez preentrenado el modelo, se pueden construir clasificadores sencillos sobre las representaciones obtenidas.