Transformer: la tecnología que domina el mundo

En un post anterior ya te expliqué qué son los modelos secuenciales y cómo han ido evolucionando desde las redes neuronales recurrentes (RNN) hasta el Transformer, pasando por LSTM y GRU. En este post toca explicar en detalle qué es un Transformer, el estado del arte para tareas de NLP. Os traigo una explicación muy sencilla de qué es y veremos pieza a pieza la arquitectura para que podáis entender a la perfección cómo funciona esta arquitectura y lo podáis aplicar vosotros. Empezamos!

Qué es un Transformer

Directos al grano. Un transformer no es el robot interestelar que lucha contra los Decepticon, ya me gustaría a mí. Se trata de una arquitectura de redes neuronales que en estos momentos se considera estado del arte en modelos secuenciales. El Transformer, en NLP, resuelve tareas Seq2Seq sin los problemas de dependencias largas que presentan las LSTM o RNN. Esta arquitectura se propuso por primera vez en un paper de Vaswani et al. en 2017 llamado Attention Is All You Need.

«El Transformer es el primer modelo de *transducción que se basa completamente en la auto-atención para calcular representaciones de su entrada y salida sin utilizar RNN alineados en secuencia o convolución.»

Attention is All You Need.
* Transducción significa en la conversión de una secuencia en otra secuencia nueva.

Para los que quieran profundizar en los conceptos de este tipo de modelos, recomiendo encarecidamente que os leáis el paper, aunque aquí os voy a contar los aspectos clave para que sepáis utilizarlo en vuestros proyectos.

La idea clave del Transformer es gestionar completamente las dependencias entre la entrada y la salida con atención y recurrencia.

Arquitectura del Transformer
Attention Is All You Need

Diseccionando la Estructura

El Transformer se basa en un Encoder y un Decoder. La idea clave aquí es que se utiliza el encoder para analizar el contexto de la secuencia de entrada y el decoder es el encargado de generar la secuencia del output a partir de este contexto. Podemos ver en el Gif de abajo cómo sucede esto en una tarea de traducción de texto.

Volviendo a la estructura de un Transformer, es fácil encontrar dónde están estos dos componentes:

transformer nlp

Embedding del texto

Para que el encoder y el decoder puedan trabajar bien, es necesario realizar un embedding del texto. Embedding, en NLP, significa simplemente una representación vectorial de las palabras. La magia de esta transformación a vectores, es que conseguimos una representación numérica de las palabras, y que, además, las palabras con sentido semántico similar estarán cerca en dicho espacio vectorial. El ejemplo más famoso que se me ocurre ahora mismo de word embedding es Word2Vec, y otros más avanzados como ELMo, o GloVe.

Codificación Posicional

La posición de una palabra juega un papel principal para que el modelo pueda entender la secuencia que le hemos pasado.

Las RNN, por su arquitectura recurrente, dan importancia al orden de la secuencia. Sin embargo, el Transformer pierde el mecanismo de recurrencia para utilizar el mecanismo de «auto-atención de múltiples cabezas». Esto, en teoría, permite capturar dependencias más largas y agilizar el entrenamiento bastante.

En un Transformer, el texto fluye de manera simultánea a entre el encoder y el decoder (ver el GIF de más arriba). Así pues, es primordial añadir información sobre la posición de cada palabra en el vector de secuencia. Los autores del paper decidieron aplicar una función sinusoidal (ver más de abajo) en la que no voy a entrar mucho en detalle, puesto que se va del scope del post.

Image for post

El criterio que siguieron los autores para proponer estas funciones senoidales se basa en satisfacer los siguientes puntos:

  • Tenemos un valor único para cada paso único (la posición de la palabra).
  • La distancia entre dos palabras separadas el mismo número de pasos debe ser consistente sin importar la longitud del texto.
  • El rango de valores posibles es consistente e indiferente a la longitud de la secuencia.
  • Es determinístico.

Si queréis tener más detalle sobre esta codificación posicional os dejo un artículo donde viene explicado minuciosamente, y el paper explica matemáticamente esto.

Auto-atención

¿Y esto qué mierda es? Vaya algoritmo más egocéntrico.

Nota en mis apuntes cuando estudié el Transformer.

El mecanismo de auto-atención es lo que permite al modelo saber con qué otra palabra de la secuencia está relacionada la palabra que se procesa en ese instante de tiempo. Parece complejo de entender, pero vamos a ver un ejemplo que lo facilita todo. Supongamos que queremos traducir la siguiente frase:

Mary and Paul were running together but he got injured

Cuando el modelo está procesando la secuencia, ¿a qué se refiere «he»? Parece una pregunta muy sencilla para una persona, pero se trata de un problema complejo que ha existido durante bastante tiempo en NLP. El mecanismo de auto-atención permite asociar «he» con Paul en vez de con el resto de palabras.

Aunque las RNN permiten referenciar palabras anteriores de la secuencia, sufren de memoria corto-placista. Esto provoca que cuando trabajamos con una secuencia larga las RNN no pueden referenciar palabras muy antiguas. Las GRU y LSTM tienen una ventana de memoria más grande que las RNN, pero siguen teniendo una capacidad limitada. El mecanismo de auto-atención resuelve esto ya que, en teoría, posee una ventana de referencia infinita, acotada únicamente por la potencia computacional. Esto permite que el algoritmo pueda usar el contexto completo para realizar la tarea.

Atención por producto escalar

Producto escalar de atención en Transformer
Atención por producto escalar. Link

Para poder entender el mecanismo complejo de multi-cabezas, primero es necesario entender lo simple. El producto escalar.

El mecanismo toma 3 valores de entrada:

  1. Q: se trata de la query que representa el vector de una palabra.
  2. K: las keys que son todas las demás palabras de la secuencia.
  3. V: el valor vectorial de la palabra que se procesa en dicho punto temporal.

En el caso de auto-atención, los valores V y Q son el mismo vector. Y por lo tanto, el mecanismo nos devuelve la importancia de la palabra en el texto:

Ecuaci?n de auto-atenci?n

Realizar el producto escalar de Q y K (transpuesto) significa calcular la proyección ortogonal de Q en K. O sea, intentar estimar la alineación de los vectores y devolver un peso para cada palabra del texto.

Se normaliza el resultado al dividir por la raíz del tamaño de K (o sea, por el tamaño de la secuencia). Esto se hace para evitar problemas de fuga de gradiente que se producirían en la Softmax si tenemos valores de gran tamaño. Aplicar la softmax se debe a intentar escalar el peso de la palabra en un rango entre 0 y 1. Finalmente, se multiplican estos pesos por el valor (el vector de la palabra con la que estamos trabajando) para reducir la importancia de palabras no relevantes y quedarnos solo con las que nos importan.

Auto-atención por multi-cabeza

La versión del mecanismo que utiliza un Transformer es una proyección de Q, K y V en h espacios lineales. Siendo h la cantidad de cabezas que tiene el mecanismo (siendo h=8 en el paper). Esto permite que cada cabeza se centre en aspectos diferentes, para después concatenar los resultados. El tener varios subespacios y, por lo tanto, varias representaciones de importancia de cada palabra. Esto permite que la propia palabra no sea la dominante en el contexto.

La arquitectura de multi-cabeza es la leche. Nos permite aprender dependencias mucho más complejas sin añadir tiempo de entrenamiento gracias a que la proyección lineal reduce el tamaño de cada vector. (En el paper presentado usan 8 proyecciones en subespacio de dimensión 64).

Juntamos las piezas: ¿Cómo funciona la arquitectura encoder-decoder?

Figura del Transformer

La codificación

  1. Se realiza un embedding de la secuencia de las palabras para convertir cada una en un vector y tener una representación numérica.
  2. Añadir la componente posicional para cada vector de palabra.
  3. Aplicar el mecanismo de auto-atención de múltiples cabezas.
  4. Capa neuronal Feed Forward.

La decodificación

  1. Se realiza un embedding del resultado del punto temporal justo anterior (t-1).
  2. Se añade la componente posicional.
  3. Se aplica el mecanismo de auto-atención de múltiples cabezas a la secuencia del output de t-1.
  4. Se recoge la salida del encoder para el punto temporal t, aplicamos de nuevo el mecanismo de auto-atención, esta vez utilizando las palabras del output t-1 como V, y la salida del encoder (en t) como K y Q.
  5. Capa neuronal de Feed Forward.
  6. Finalizamos con una capa lineal y una Softmax para obtener la probabilidad de la siguiente palabra y devolver aquella con la probabilidad más alta como la siguiente palabra.

Resultados que hacen que los Transformer sean estado del arte

Los autores compararon los resultados de la arquitectura con otras soluciones consideradas estado del arte en 2017. La arquitectura Transformer adelanta por la derecha a todos. Os adjunto los resultados para una tarea de traducción:

Comparativa de resultados Transformer vs estado del arte

Conclusiones

La publicación del paper «Attention is all you need» fue una revolución en el campo de NLP. Solventan los problemas de memoria que presentan las RNN, mejoran el rendimiento de GRU y LSTM, y permiten entrenar más rápido con cuerpos más pesados.

La clave de la arquitectura es el mecanismo de auto-atención y el uso de autoencoders para agilizar el entrenamiento y producir resultados top. Hoy en día, 3 años después, siguen siendo estado del arte con implementaciones como BERT, Roberta, XLNET, o GPT.

Si seguís leyendo después de la parrafada que he soltado, compartid el post con amigos para ayudarnos a crecer o tenéis dudas escribidnos un comentario y os responderemos! Hasta el siguiente!