¿Qué son los tranformers?

Los Transformers en Deep Learning son un tipo de arquitectura de red neuronal diseñada para procesar secuencias de datos, especialmente en tareas de procesamiento del lenguaje natural (NLP). Fueron introducidos en el artículo "Attention Is All You Need" (2017) por Vaswani et al.

Principales características

Mecanismo de Atención (Self-Attention)

En lugar de procesar datos de manera secuencial (como en las RNNs), los Transformers analizan todas las palabras de una secuencia al mismo tiempo. Usan self-attention para asignar pesos a cada palabra según su relevancia en el contexto.

Arquitectura basada en capas

Incluye capas de Multi-Head Self-Attention, Normalización, y Feed-Forward. Se compone de un encoder (procesa la entrada) y un decoder (genera la salida).

Uso de Positional Encoding

Como no son secuenciales, usan positional encodings para conservar el orden de las palabras en una oración.

Escalabilidad y Paralelización

A diferencia de las RNNs, los Transformers pueden procesar grandes cantidades de datos en paralelo, acelerando el entrenamiento.

Mecanismo de Atención

Una red neuronal estándar consta de una serie de capas de transformación no lineal, donde cada capa produce una representación oculta de dimensión fija. Para tareas con espacios de entrada grandes, este paradigma dificulta el control de la interacción entre los componentes. Por ejemplo, en la traducción automática, la fuente consiste en una oración completa y la salida es una predicción para cada palabra en la oración traducida. El uso de una red estándar conduce a un cuello de botella de información, donde una capa oculta debe codificar toda la oración fuente. La atención proporciona un enfoque alternativo.

Una red de atención mantiene un conjunto de representaciones ocultas que escalan con el tamaño de la fuente. El modelo utiliza un paso de inferencia interna para realizar una selección suave sobre estas representaciones. Este método permite que el modelo mantenga una memoria de longitud variable y ha demostrado ser de importancia crucial para el escalado de sistemas para muchas tareas.

En otras palabras lo que implica es que estos mecanismos logran extraer mejor el siginificado de las palabras de acuerdo a las palabras que le rodean. Es decir, que en cierto grado logran capturar el sigfinicado de acuerdo a su contexto.

Definición

Formalmente como se descibe en el artículo Structured Attention Networks. Sea x=[x1,,xn] una secuencia de inputs, sea q una query (consulta) y sea z una variable catégorica latente con espacio muestral {1,,n} que codifica la selección deseada entre estos inputs.

El objetivo es producir un contexto c basado en la secuencia y la query. Para ello, asumimos el acceso a una distribución de atención zp(z|x,q), el contexto sobre la secuencia es definida como un valor esperado, c=Ezp(z|x,q)[f(x,z)] donde f(x,z) es una función de anotación.

La atención de esta forma se puede aplicar a cualquier tipo de entrada, sin embargo, la función de anotación y la distribución de atención se parametrizan con redes neuronales, y el contexto producido es un vector que se alimenta a una red descendente.

Ejemplo

Consideremos el caso de la traducción automática neuronal basada en la atención introducida en Neural Machine Translation by Jointly Learning to Align and Translate (uno de los primeros artículos o sino el primero donde se menciona los mecanismos de atención.) Allí las secuencias de entrada [x1,,xn] son los estados ocultos de una red neuronal recurrente (RNN), al recorrer las palabras de la oración de origen, q es el estado oculto de la RNN del decodificador de destino ( es decir, una representación vectorial de la consulta q) y z representa la posición de la fuente a la que se debe prestar atención para la traducción. La distribución de atención p es simplemente p(z=i|x,q)=softmax(θi) donde θRn está parametrizado típicamente basado en una red neuronal. La función de anotación está definida para devolver simplemente el estado oculto seleccionado, f(x,z)=xz. El vector contexto puede ser calculado usando una suma c=Ezp(z|x,q)[f(x,z)]=i=1np(z=i|x,q)xi Otras tareas, como responder preguntas, utilizan la atención de manera similar, por ejemplo, reemplazando la fuente [x1,,xn] con un conjunto de hechos potenciales y q con una representación de la pregunta.

En resumen, interpretamos el mecanismo de atención como tomar la expectativa de una función de anotación f(x,z) con respecto a una variable latente zp, donde p está parametrizada para ser función de x y q.

Self-Attention

A veces también llamado intra-atención, es un mecanismo de atención que relaciona diferentes posiciones de una sola secuencia para calcular una representación de la secuencia.

Una función de atención se puede describir como la asignación de una consulta y un conjunto de pares clave-valor a una salida, donde la consulta, las claves, los valores y la salida son todos vectores. La salida se calcula como una suma ponderada de los valores, donde el peso asignado a cada valor se calcula mediante una función de compatibilidad de la consulta con la clave correspondiente.

Scaled Dot-Product Attention

Atención del producto punto escalado. Las entradas consisten de consultas y claves de dimensión dk, y valores de dimensión dv. Calculamos el producto punto de la consulta con todas las claves, cada una se divide por dk y aplicamos la función softmax para obtener los pesos de los valores. Softmax se aplica a cada columna en la matriz correspondiente.

En la práctica, se calcula la función de atención en un conjunto de consultas simultáneamente, empaquetadas juntas en una matriz Q. Las claves y los valores también se empaquetan juntos en las matrices K y V. Calculamos la matriz de resultados como: Attention(Q,K,V)=softmax(QKTdk)V Las dos funciones de atención más utilizadas son la atención aditiva y la atención de producto escalar (multiplicativa). La atención de producto escalar es idéntica a la que acabamos de ver, excepto por el factor de escala de 1/dk. La atención aditiva calcula la función de compatibilidad utilizando una red de propagación hacia adelante con una sola capa oculta. Si bien las dos son similares en complejidad teórica, la atención de producto escalar es mucho más rápida y más eficiente en el uso del espacio en la práctica, ya que se puede implementar utilizando un código de multiplicación de matrices altamente optimizado.

Si bien para valores pequeños de dk los dos mecanismos funcionan de manera similar, la atención aditiva supera a la atención del producto escalar sin escalar para valores mayores de dk. Se sospecha que para valores grandes de dk, los productos escalares crecen en magnitud, empujando la función softmax a regiones donde tiene gradientes extremadamente pequeños. Para contrarrestar este efecto, escalamos los productos escalares en 1/dk.

Multi-Head Attention

En lugar de realizar una única función de atención con claves, valores y consultas de dimensiones dmodel, resulta beneficioso proyectar linealmente las consultas, claves y valores h veces con diferentes proyecciones lineales aprendidas para las dimensiones dk, dk y dv, respectivamente. En cada una de estas versiones proyectadas de consultas, claves y valores, realizamos la función de atención en paralelo, lo que produce una salida de valores dv-dimensional. Estos se concatenan y se proyectan nuevamente, dando como resultado los valores finales.

La atención de múltiples cabezas permite que el modelo preste atención de manera conjunta a la información de diferentes subespacios de representación en diferentes posiciones. Con una sola cabeza de atención, el promedio inhibe esto. MultiHead(Q,K,V)=Concat(head1,,headh)WO donde headi=Attention(QWiQ,KWiK,VWiV) donde las proyecciones son matrices de paramétros WiQRdmodel×dkWiKRdmodel×dkWiVRdmodel×dvWiORhdmodel×dk En el artículo original se usaron h=8 capas de atención paralelas, o cabezas. Para cada una de estas de tiene dk=dv=dmodel/h=64.

¿Cómo se usa la atención en este modelo?

En las capas de "atención del codificador-decodificador", las consultas provienen de la capa decodificadora anterior, y las claves y valores de memoria provienen de la salida del codificador. Esto permite que cada posición en el decodificador preste atención a todas las posiciones en la secuencia de entrada. Esto imita los mecanismos de atención del codificador-decodificador típicos en los modelos de secuencia a secuencia.

El codificador contiene capas de self-atention o autoatención. En una capa de autoatención, todas las claves, valores y consultas provienen del mismo lugar, en este caso, de la salida de la capa anterior del codificador. Cada posición del codificador puede atender a todas las posiciones de la capa anterior del codificador.

De manera similar, las capas de autoatención en el decodificador permiten que cada posición en el decodificador preste atención a todas las posiciones en el decodificador hasta esa posición inclusive. Necesitamos evitar el flujo de información hacia la izquierda en el decodificador para preservar la propiedad autorregresiva. Implementamos esto dentro de la atención del producto escalado enmascarando (estableciendo en ) todos los valores en la entrada del softmax que corresponden a conexiones ilegales.

Position-wise Feed-Forward Networks

Además de las subcapas de atención, cada una de las capas de nuestro codificador y decodificador contiene una Feed-Forward Network totalmente conectada, que se aplica a cada posición por separado y de manera idéntica. Esta consta de dos transformaciones lineales con una activación ReLU entre ellas. FFN(x)=max(0,xW1+b1)W2+b2 Si bien las transformaciones lineales son las mismas en diferentes posiciones, utilizan parámetros diferentes de una capa a otra.

Positional Encoding

Dado que nuestro modelo no contiene recurrencia ni convolución, para que el modelo haga uso del orden de la secuencia, debemos inyectar alguna información sobre la posición relativa o absoluta de los tokens en la secuencia. Para ello, añadimos "codificaciones posicionales" a las incrustaciones (embeddings) de entrada en la parte inferior de las pilas del codificador y del decodificador. Las codificaciones posicionales tienen la misma dimensión dmodel que las incrustaciones, de modo que se pueden sumar las dos. Hay muchas opciones de codificaciones posicionales, aprendidas y fijas. En este trabajo se usaron funciones seno y coseno de diferentes frecuencias: PE(pos,2i)=sin(pos100002i/dmodel)PE(pos,2i+1)=cos(pos100002i/dmodel) donde pos es la posición e i es la dimensión. Es decir, cada dimensión de la codificación posicional corresponde a una sinusoide. Las longitudes de onda forman una progresión geométrica desde 2π hasta 100002π. Elegimos esta función porque planteamos la hipótesis de que permitiría al modelo aprender fácilmente a atender por posiciones relativas, ya que para cualquier desplazamiento fijo k, PEpos+k puede representarse como una función lineal de PEpos.

También se experimentó con el uso de incrustaciones posicionales aprendidas y descubrieron que las dos versiones produjeron resultados casi idénticos. Se tomo la versión sinusoidal porque puede permitir que el modelo se extrapole a longitudes de secuencia más largas que las encontradas durante el entrenamiento.