Transformers » Autoregresive Transformers
Autoregresive Transformers

Los Transformers Autoregresivos son una variante de los modelos Transformer que generan texto de manera secuencial, palabra por palabra, usando como entrada solo las palabras previas generadas. Su arquitectura se basa en la atención enmascarada para evitar que el modelo vea futuras palabras durante el entrenamiento, lo que lo hace ideal para tareas como modelado de lenguaje, generación de texto y autocompletado.

Un Autoregressive Transformer es un modelo basado en la arquitectura Transformer que genera secuencias de manera paso a paso, prediciendo un token a la vez y usando sus propias predicciones como entrada para los siguientes pasos.

Si queremos que el modelo genere la frase "Hola mundo", el proceso sería:

  1. 1. Entrada: ["Hola"] → Predicción: "mundo". Luego se agrega esta palabra a la entrada original y se lo vuelve a entregar al modelo.

  2. 2. Entrada: ["Hola", "mundo"] → Predicción: ".". Como en el paso anterior, se agrega este carácter a la oración original y se lo vuelve a entregar al modelo.

  3. 3. Entrada: ["Hola", "mundo", "."] → "<EOS>". Cuando se genera un token de parada (como un punto o <EOS>) significa que el transformer debe romper el bucle y dejar de generar palabras.

El resumen del proceso está aquí:

De esta manera, a partir de la entrada inicial "Hola", obtuvimos la respuesta "Hola mundo."

Decodificador

El Autoregresive Transformer está compuesto por una serie decodificadores puestos en pila donde cada decodificador procesa la salida del decodificador anterior, excepto el primer decodificador que procesa la imagen.

El Autoregresive Transformer está compuesto por decodificadores. Acá puedes ver un Vision Transformer con un solo decodificador:

Pero por lo general, los Autoregresive Transformer suelen tener muchos decodificadores que se agrupan en bloques. Acá puedes ver un transformer con 3 decodificadores.

Flujo de trabajo

PASO 1: Embedding de entrada

El Embedding solo ocurre en el decodificador más inferior. El decodificador comienza convirtiendo tokens de entrada en vectores mediante capas de embedding. Las capas de embedding capturan el significado semántico de los tokens y los convierten en vectores numéricos.

¿Qué es un token?

Todos los decodificadores reciben una lista de vectores, cada uno de tamaño 512 (tamaño fijo). En el decodificador inferior, esa sería el embeddings de palabras, pero en otros decodificadores, sería la salida del decodificador que está directamente debajo de ellos.

PASO 2: Embedding Posicional

Dado que los Transformers no tienen un mecanismo de recurrencia como los RNN, utilizan embeddings posicionales agregadas al embeddings de entrada para proporcionar información sobre la posición de cada token en la secuencia. Esto les permite comprender la posición de cada palabra dentro de la oración.

Para ello, se emplean una combinación de varias funciones seno y coseno para crear vectores posicionales, permitiendo el uso de este codificador posicional para oraciones de cualquier longitud.

En este enfoque, cada dimensión está representada por frecuencias y desplazamientos únicos de la onda, con valores que oscilan entre -1 y 1, lo que representa efectivamente cada posición.

PASO 3 - Mecanismo de autoatención de múltiples cabezales

En el decodificador, la atención de múltiples cabezas utiliza un mecanismo de atención especializado conocido como autoatención. Este enfoque permite a los modelos relacionar cada palabra de la entrada con las otras palabras de dicha entrada. Por ejemplo, en un ejemplo dado, el modelo podría aprender a conectar la palabra "eres" con "tú".

Este mecanismo permite que el decodificador se centre en diferentes partes de la secuencia de entrada mientras procesa cada token. Calcula puntuaciones de atención basadas en 3 tipos de vectores:

  1. Vector Consulta (Query): Representa la pregunta o enfoque que el modelo está realizando sobre la secuencia. Es la representación de lo que se quiere buscar o lo que se quiere obtener de la secuencia. En otras palabras, es el "foco" de atención del modelo, indicando lo que se necesita saber.

  2. Vector Clave (Key): Representa la información identificativa o característica de una posición específica en la secuencia. Es un vector que está asociado a cada token o palabra en la secuencia y contiene la información que podría ser relevante para la consulta (query).

  3. Vector Valor (Value): Cada valor está asociado con una clave y se utiliza para construir la salida de la capa de atención. Cuando una consulta y una clave coinciden bien, lo que básicamente significa que tienen una puntuación de atención alta, el valor correspondiente se enfatiza en el resultado.

Este primer módulo de Autoatención permite al modelo capturar información contextual de toda la secuencia. En lugar de realizar una única función de atención, las consultas, claves y valores se proyectan linealmente h veces. En cada una de estas versiones proyectadas de consultas, claves y valores, el mecanismo de atención se realiza en paralelo, generando valores de salida de dimensión h.

La arquitectura detallada es la siguiente:

Multiplicación de matrices: producto escalar de vectores consulta (query) y clave (key)

Una vez que los vectores de consulta, clave y valor pasan a través de una capa lineal, se realiza una multiplicación de matriz de producto escalar entre las consultas y las claves, lo que da como resultado la creación de una matriz de puntajes.

La matriz de puntajes establece el grado de énfasis que debe poner cada palabra sobre otras palabras. Por lo tanto, a cada palabra se le asigna un puntaje en relación con las otras palabras dentro del mismo intervalo de tiempo. Un puntaje más alto indica una mayor concentración.

Este proceso asigna efectivamente las consultas a sus claves correspondientes.

Reducir la magnitud de las puntuaciones de atención

Luego, las puntuaciones se reducen dividiéndolas por la raíz cuadrada de la dimensión de la consulta y los vectores clave. Este paso se implementa para garantizar gradientes más estables, ya que la multiplicación de valores puede generar efectos excesivamente grandes.

Mecanismo de Enmascarado

Este mecanismo sirve para evitar que las posiciones atiendan a posiciones posteriores, lo que significa que cada token de la secuencia no se ve influenciada por tokens futuros. Esto se logra sumando una gran penalización (como −∞) a la matriz de puntajes.

¿Porque se usa Mecanismo de autoatención enmascarado?

Por ejemplo, en una oracion tal como "Ustedes son buenos", cuando se calculan las puntuaciones de atención para la palabra "Ustedes", es importante que "Ustedes" no eche un vistazo a "son", que es una palabra posterior en la secuencia.

Así, cada token solo puede atender a sí mismo y a los anteriores, pero no a los futuros.

Miremos un ejemplo:

La palabra "Ustedes" solo tiene puntaje para si mismo, porque no tiene palabras previas:

La palabra "son" tiene el puntaje para si mismo y de la palabra anterior "Ustedes":

La palabra "buenos" tiene el puntaje de si mismo y de las anteriores palabras "son" y "Ustedes":

Aplicación de Softmax a las puntuaciones ajustadas

Posteriormente, se aplica una función Softmax a las puntuaciones ajustadas para obtener los pesos de atención. Esto da como resultado valores de probabilidad que van de 0 a 1. La función Softmax enfatiza las puntuaciones más altas mientras disminuye las puntuaciones más bajas, mejorando así la capacidad del modelo para determinar de manera efectiva qué palabras deberían recibir más atención.

Combinando los resultados de Softmax con el vector de valor

El siguiente paso del mecanismo de atención es que los pesos derivados de la función Softmax se multiplican por el vector de valor, lo que da como resultado un vector de salida.

En este proceso, sólo se conservan las palabras que presentan puntuaciones Softmax altas. Finalmente, este vector de salida se introduce en una capa lineal para su posterior procesamiento.

¡Y finalmente obtenemos el resultado del mecanismo de Atención!

Entonces, quizás te preguntes por qué se llama Atención de múltiples cabezas.

Recuerde que antes de que comience todo el proceso, descomponemos nuestras consultas, claves y valores h veces. Este proceso, conocido como autoatención, ocurre por separado en cada una de estas etapas más pequeñas o "cabezas". Cada cabeza hace su magia de forma independiente, evocando un vector de salida.

Este conjunto pasa por una capa lineal final, muy parecida a un filtro que afina su interpretación colectiva. La belleza aquí radica en la diversidad de aprendizaje en cada cabeza, enriqueciendo el modelo decodificador con una comprensión sólida y multifacética.

PASO 3.1 - Normalización y conexiones residuales

Cada subcapa en una capa de decodificador va seguida de un paso de normalización. Además, la salida de cada subcapa se agrega a su entrada (conexión residual) para ayudar a mitigar el problema del gradiente que desaparece, lo que permite modelos más profundos. Este proceso también se repetirá después de la red neuronal.

PASO 3.2 - Red neuronal de retroalimentación

El viaje de la producción residual normalizada continúa mientras navega a través de una red de retroalimentación puntual, una fase crucial para un refinamiento adicional.

Imagine esta red como un dúo de capas lineales, con una activación ReLU ubicada entre ellas, actuando como un puente. Una vez procesada, la salida sigue un camino familiar: retrocede y se fusiona con la entrada de la red de alimentación directa puntual.

A esta reunión le sigue otra ronda de normalización, asegurando que todo esté bien ajustado y sincronizado para los próximos pasos.

PASO 4 - Salida del decodificador

La función del decodificador se centra en la elaboración de secuencias de texto. El decodificador está equipado con un conjunto similar de subcapas. Cuenta con dos capas de atención de múltiples cabezales, una capa de red neuronal e incorpora conexiones residuales y normalización de capas después de cada subcapa.

Estos componentes funcionan de manera similar a las capas del decodificador, pero con un giro: cada capa de atención de múltiples cabezas en el decodificador tiene una misión única.

El final del proceso del decodificador implica una capa lineal, que sirve como clasificador, rematada con una función Softmax para calcular las probabilidades de elegir las diferentes palabras del vocabulario.

Conclusiones

Los Autoregressive Transformers (Transformers autorregresivos) han demostrado ser increíblemente efectivos en tareas de modelado de lenguaje, síntesis de texto, generación de código y otras aplicaciones donde la predicción secuencial es clave. Aquí algunas conclusiones sobre ellos:

Ventajas

  1. Alta capacidad generativa: Modelos como GPT (Generative Pre-trained Transformer) pueden generar texto coherente y contextualizado, manteniendo la estructura lógica en secuencias largas.
  2. Escalabilidad: Han demostrado mejoras significativas al aumentar su tamaño, lo que los hace altamente efectivos en tareas complejas.
  3. Adaptabilidad: Se pueden ajustar (fine-tuning) para tareas específicas, desde generación de texto hasta resolución de preguntas y asistencia conversacional.
  4. Entrenamiento eficiente: Aunque son pesados computacionalmente, el entrenamiento puede ser paralelizado en la fase de pre-entrenamiento con máscara causal.

Desventajas

  1. Generación secuencial: La inferencia es más costosa en comparación con modelos bidireccionales como BERT, ya que cada token se genera uno por uno.
  2. Dependencia a largo plazo limitada: Aunque manejan dependencias largas mejor que los RNN y LSTM, pueden perder coherencia en textos muy largos.
  3. Propensión a sesgos y alucinaciones: Debido a su entrenamiento en grandes corpus de datos, pueden generar información incorrecta o sesgada.
  4. Costo computacional: Requieren hardware potente, como GPUs o TPUs, para entrenar y ejecutar modelos grandes.

Hemos llegado al final de este artículo. Espero que te halla resultado útil y que hallas disfrutado leyéndolo tanto como yo disfrute escribiéndolo 😁.