Transformers » Translator Transformers
Translator Transformers

Los transformers en machine learning son una arquitectura de redes neuronales diseñada inicialmente para procesar secuencias de datos, como texto, pero que también se ha adaptado a otros tipos de datos, como imágenes y audio. Fueron introducidos en el paper de 2017 titulado "Attention is All You Need" por Vaswani et al., y desde entonces han revolucionado muchas áreas del aprendizaje automático, especialmente el procesamiento del lenguaje natural (NLP).

Los Transformers son el primer modelo de transducción que se basa completamente en la autoatención para calcular representaciones de su entrada y salida sin utilizar RNN alineados con secuencias o convolución. La principal característica central de la arquitectura Transformers es que mantienen el modelo codificador-decodificador.

Si comenzamos a considerar un Transformer para la traducción de idiomas como una simple caja negra, tomaría una oración en un idioma, español por ejemplo, como entrada y generaría su traducción en inglés.

Si buceamos un poco, observamos que esta caja negra se compone de dos partes principales:

  1. El codificador toma nuestra entrada y genera una representación matricial de esa entrada. Por ejemplo, la palabra en español "Hola".

  2. El decodificador toma esa representación codificada y genera iterativamente una salida. En nuestro ejemplo, la palabra traducida "Hello".

Sin embargo, tanto el codificador como el decodificador son en realidad una pila con múltiples capas (el mismo número para cada una). Todos los codificadores presentan la misma estructura, y la entrada entra en cada uno de ellos y pasa al siguiente. Todos los decodificadores también presentan la misma estructura y obtienen la entrada del último codificador y del decodificador anterior.

Nuestro transformer puede tener tantos codificadores y decodificadores como queramos, ósea N codificadores y decodificadores.

El flujo de trabajo del codificador

El codificador es un componente fundamental de la arquitectura Transformer. La función principal del codificador es transformar los tokens de entrada en representaciones contextualizadas. A diferencia de los modelos anteriores que procesaban tokens de forma independiente, el codificador Transformer captura el contexto de cada token con respecto a la secuencia completa.

Su composición estructural es la siguiente:

Entonces, dividamos su flujo de trabajo en sus pasos más básicos:

PASO 1: Embedding de entrada

El Embedding solo ocurre en el codificador más inferior. El codificador 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 codificadores reciben una lista de vectores, cada uno de tamaño 512 (tamaño fijo). En el codificador inferior, esa sería el embeddings de palabras, pero en otros codificadores, sería la salida del codificador 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: Pila de capas del codificador

El codificador Transformer consta de una pila de capas idénticas (N capas).

La capa codificadora sirve para transformar todas las secuencias de entrada en una representación abstracta y continua que encapsula la información aprendida de toda la secuencia. Esta capa comprende dos submódulos:

  1. Un mecanismo de atención de múltiples cabezas.

  2. Una red totalmente conectada.

  3. Además, incorpora conexiones residuales alrededor de cada subcapa, a las que luego se normalizan.

El flujo es el siguiente:

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

En el codificador, 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 codificador 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.

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 codificador con una comprensión sólida y multifacética.

PASO 3.2 - Normalización y conexiones residuales

Cada subcapa en una capa de codificador 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.3 - 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 codificador

La salida de la capa codificadora final es un conjunto de vectores, cada uno de los cuales representa la secuencia de entrada con una buena comprensión contextual. Esta salida luego se utiliza como entrada para el decodificador en un modelo Transformer.

Esta cuidadosa codificación allana el camino para el decodificador, guiándolo a prestar atención a las palabras correctas en la entrada cuando llega el momento de decodificar.

Piense en ello como construir una torre, donde puede apilar N capas de codificador. Cada capa de esta pila tiene la oportunidad de explorar y aprender diferentes facetas de la atención, al igual que las capas de conocimiento. Esto no sólo diversifica la comprensión, sino que podría amplificar significativamente las capacidades predictivas de la red de transformers.

El flujo de trabajo del decodificador

La función del decodificador se centra en la elaboración de secuencias de texto. Al igual que el codificador, 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 codificador, 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.

El decodificador tiene una estructura diseñada específicamente para generar esta salida decodificando la información codificada.

Es importante notar que el decodificador opera de manera autorregresiva, iniciando su proceso con un token de inicio. Utiliza una lista de salidas generadas previamente como entradas, junto con las salidas del codificador que son ricas en información de atención de la entrada inicial.

Esta danza secuencial de decodificación continúa hasta que el decodificador llega a un momento crucial: la generación de un token que señala el final de la creación de su salida.

¿Que significa 'Autoregresivo'?

PASO 1: Embedding de salida

En la línea de inicio del decodificador, el proceso refleja el del codificador. Aquí, la entrada pasa primero a través de una capa de embedding.

PASO 2: Embedding Posicional

Después del embedding de salida, nuevamente al igual que en el decodificador, la entrada pasa por la capa de embedding posicional. Esta secuencia está diseñada para producir embeddings posicionales.

Estas incorporaciones posicionales luego se canalizan hacia la primera capa de atención de múltiples cabezales del decodificador, donde se calculan meticulosamente las puntuaciones de atención específicas de la entrada del decodificador.

¿Por qué se llama 'Salida (Desplazada a la derecha)'?

PASO 3: Pila de capas de decodificador

El decodificador consta de una pila de capas idénticas (N capas). Cada capa tiene tres subcomponentes principales:

PASO 3.1 - Mecanismo de autoatención enmascarado

Esto es similar al mecanismo de autoatención del codificador, pero con una diferencia crucial: evita 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":

PASO 3.2 - Atención multicabezal o atención cruzada del codificador-decodificador

En la segunda capa de atención de múltiples cabezales del decodificador, vemos una interacción única entre los componentes del codificador y del decodificador. Aquí, las salidas del codificador asumen las funciones de consultas y claves, mientras que las salidas de la primera capa de atención de múltiples encabezados del decodificador sirven como valores.

Esta configuración alinea efectivamente la entrada del codificador con la del decodificador, permitiendo al decodificador identificar y enfatizar las partes más relevantes de la entrada del codificador.

Después de esto, la salida de esta segunda capa de atención de múltiples cabezas se refina a través de una capa de avance puntual, mejorando aún más el procesamiento.

En esta subcapa, las consultas provienen de la capa decodificador a anterior y las claves y valores provienen de la salida del codificador. Esto permite que cada posición en el decodificador atienda todas las posiciones en la secuencia de entrada, integrando efectivamente la información del codificador con la información en el decodificador.

PASO 3.3 - Red neuronal de retroalimentación

De manera similar al codificador, cada capa de decodificador incluye una red de alimentación directa completamente conectada, aplicada a cada posición de forma separada e idéntica.

PASO 4: Clasificador lineal y Softmax para generar probabilidades de salida

El viaje de los datos a través del modelo transformador culmina con su paso por una capa lineal final, que funciona como clasificador.

El tamaño de este clasificador corresponde al número total de clases involucradas (número de palabras contenidas en el vocabulario). Por ejemplo, en un escenario con 1000 clases distintas que representan 1000 palabras diferentes, la salida del clasificador será una matriz con 1000 elementos.

Luego, esta salida se introduce en una capa Softmax, que la transforma en un rango de puntuaciones de probabilidad, cada una de las cuales se encuentra entre 0 y 1. La más alta de estas puntuaciones de probabilidad es clave, su índice correspondiente apunta directamente a la palabra que el modelo predice como siguiente en la secuencia.

Normalización y conexiones residuales

A cada subcapa (autoatención enmascarada, atención codificador-decodificador, red de retroalimentación) le sigue un paso de normalización, y cada una también incluye una conexión residual a su alrededor.

Salida del decodificador

La salida de la capa final se transforma en una secuencia predicha, generalmente a través de una capa lineal seguida de un Softmax para generar probabilidades sobre el vocabulario.

El decodificador, en su flujo operativo, incorpora la salida recién generada en su creciente lista de entradas y luego continúa con el proceso de decodificación. Este ciclo se repite hasta que el modelo predice un token específico, lo que indica su finalización.

El token predicho con la probabilidad más alta se asigna como clase final, a menudo representada por el token final.

Recuerde nuevamente que el decodificador no se limita a una sola capa. Puede estructurarse con N capas, cada una de las cuales se basa en la entrada recibida del codificador y sus capas anteriores. Esta arquitectura en capas permite que el modelo diversifique su enfoque y extraiga diferentes patrones de atención en sus cabezas de atención.

Un enfoque de múltiples capas de este tipo puede mejorar significativamente la capacidad de predicción del modelo, ya que desarrolla una comprensión más matizada de las diferentes combinaciones de atención.

Y la arquitectura final es algo similar a esto (del documento original)

Conclusiones

Los transformers son una arquitectura revolucionaria en el campo del aprendizaje profundo, especialmente en el procesamiento de secuencias como texto, audio y datos temporales. Aquí te dejo algunas ventajas clave sobre ellos:

  1. Paralelización: A diferencia de los modelos secuenciales como RNNs y LSTMs, los transformers permiten procesar secuencias completas de forma paralela, acelerando significativamente el entrenamiento.

  2. Autoatención: El mecanismo de atención auto-regresiva (Self-Attention) permite que el modelo capture relaciones a largo plazo entre elementos de una secuencia, independientemente de su distancia.

  3. Flexibilidad: Son aplicables a diversas tareas, como traducción automática, generación de texto, clasificación, procesamiento de imágenes (Vision Transformers), e incluso modelos multi-modal (como texto e imágenes juntos).

  4. Escalabilidad: Pueden beneficiarse enormemente del aumento en la capacidad de cómputo y de datos, como lo demuestran modelos como GPT y BERT.

  5. Transferencia de Aprendizaje: Los transformers pre-entrenados (e.g., BERT, GPT) pueden ser ajustados (fine-tuned) fácilmente para tareas específicas con una cantidad relativamente pequeña de datos.

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 😁.