Ya nos hemos familiarizado con el concepto de auto-atención implementado por el mecanismo de atención Transformer para la traducción automática neuronal. Ahora cambiaremos nuestro enfoque en los detalles de la arquitectura Transformer en sí, para descubrir cómo se puede implementar la auto-atención sin depender del uso de recurrencias y convoluciones.
En este tutorial, descubrirá la arquitectura de red del modelo Transformer.
Después de completar este tutorial, sabrá:
- Cómo la arquitectura Transformer implementa una estructura de codificador-decodificador sin recurrencia ni convoluciones.
- Cómo funcionan el codificador y decodificador Transformer.
- Cómo se compara la atención personal de Transformer con el uso de capas recurrentes y convolucionales.
Empecemos.
Descripción general del tutorial
Este tutorial se divide en tres partes; son:
- La arquitectura del transformador
- Resumen: el modelo de transformador
- Comparación con capas recurrentes y convolucionales
Prerrequisitos
Para este tutorial, asumimos que ya está familiarizado con:
La arquitectura del transformador
La arquitectura del transformador sigue una estructura de codificador-decodificador, pero no se basa en la recurrencia y convoluciones para generar una salida.
En pocas palabras, la tarea del codificador, en la mitad izquierda de la arquitectura del transformador, es mapear una secuencia de entrada a una secuencia de representaciones continuas, que luego se alimenta a un decodificador.
El decodificador, en la mitad derecha de la arquitectura, recibe la salida del codificador junto con la salida del decodificador en el paso de tiempo anterior, para generar una secuencia de salida.
En cada paso, el modelo es auto-regresivo, consumiendo los símbolos generados previamente como entrada adicional al generar el siguiente.
– Atención es todo lo que necesita, 2017.
El codificador
El codificador consta de una pila de $ N $ = 6 capas idénticas, donde cada capa se compone de dos subcapas:
- La primera subcapa implementa un mecanismo de auto-atención de múltiples cabezales. Habíamos visto que el mecanismo de múltiples cabezales implementa $ h $ cabezas que reciben una versión (diferente) proyectada linealmente de las consultas, claves y valores cada una, para producir salidas de $ h $ en paralelo que luego se utilizan para generar un resultado final.
- La segunda subcapa es una red de alimentación directa completamente conectada, que consta de dos transformaciones lineales con activación de unidad lineal rectificada (ReLU) en el medio:
$$ text {FFN} (x) = text {ReLU} ( mathbf {W} _1 x + b_1) mathbf {W} _2 + b_2 $$
Las seis capas del codificador Transformer aplican las mismas transformaciones lineales a todas las palabras en la secuencia de entrada, pero cada La capa emplea diferentes parámetros de peso ($ mathbf {W} _1, mathbf {W} _2 $) y sesgo ($ b_1, b_2 $) para hacerlo.
Además, cada una de estas dos subcapas tiene una conexión residual a su alrededor.
A cada subcapa también le sucede una capa de normalización, $ text {layernorm} (.) $, Que normaliza la suma calculada entre la entrada de la subcapa, $ x $, y la salida generada por la propia subcapa, $ text {sublayer} (x) $:
$$ text {layernorm} (x + text {sublayer} (x)) $$
Una consideración importante a tener en cuenta es que la arquitectura Transformer no puede capturar inherentemente ninguna información sobre las posiciones relativas de las palabras en la secuencia, ya que no hace uso de la recurrencia. Esta información debe inyectarse introduciendo codificaciones posicionales a las incrustaciones de entrada.
Los vectores de codificación posicional tienen la misma dimensión que las incrustaciones de entrada y se generan utilizando funciones de seno y coseno de diferentes frecuencias. Luego, simplemente se suman a las incorporaciones de entrada para inyectar la información posicional.
El decodificador
El decodificador comparte varias similitudes con el codificador.
El decodificador también consta de una pila de $ N $ = 6 capas idénticas que están, cada una, compuestas por tres subcapas:
- La primera subcapa recibe la salida anterior de la pila de decodificadores, la aumenta con información posicional e implementa la auto-atención de múltiples cabezales sobre ella. Si bien el codificador está diseñado para atender todas las palabras en la secuencia de entrada, a pesar de todo de su posición en la secuencia, el decodificador se modifica para atender solamente a las palabras anteriores. Por lo tanto, la predicción de una palabra en la posición $ i $ solo puede depender de las salidas conocidas de las palabras que le preceden en la secuencia. En el mecanismo de atención de múltiples cabezales (que implementa múltiples funciones de atención única en paralelo), esto se logra introduciendo una máscara sobre los valores producidos por la multiplicación escalada de matrices $ mathbf {Q} $ y $ mathbf {K} PS Este enmascaramiento se implementa suprimiendo los valores de la matriz que, de lo contrario, corresponderían a conexiones ilegales:
$$
text {máscara} ( mathbf {QK} ^ T) =
text {máscara} left ( begin {bmatrix}
e_ {11} & e_ {12} & dots & e_ {1n} \
e_ {21} & e_ {22} & dots & e_ {2n} \
vdots & vdots & ddots & vdots \
e_ {m1} & e_ {m2} & dots & e_ {mn} \
end {bmatrix} right) =
begin {bmatrix}
e_ {11} & – infty & dots & – infty \
e_ {21} & e_ {22} & dots & – infty \
vdots & vdots & ddots & vdots \
e_ {m1} & e_ {m2} & dots & e_ {mn} \
end {bmatrix}
$$
El enmascaramiento hace que el decodificador sea unidireccional (a diferencia del codificador bidireccional).
– Aprendizaje profundo avanzado con Python, 2019.
- La segunda capa implementa un mecanismo de auto-atención de múltiples cabezales, que es similar al implementado en la primera subcapa del codificador. En el lado del decodificador, este mecanismo de múltiples cabezales recibe las consultas de la subcapa del decodificador anterior y las claves y valores de la salida del codificador. Esto permite que el decodificador preste atención a todas las palabras en la secuencia de entrada.
- La tercera capa implementa una red de alimentación directa completamente conectada, que es similar a la implementada en la segunda subcapa del codificador.
Además, las tres subcapas en el lado del descodificador también tienen conexiones residuales a su alrededor, y son seguidas por una capa de normalización.
Las codificaciones posicionales también se agregan a las incorporaciones de entrada del decodificador, de la misma manera que se explicó anteriormente para el codificador.
Resumen: el modelo de transformador
El modelo Transformer se ejecuta de la siguiente manera:
- Cada palabra que forma una secuencia de entrada se transforma en un vector de incrustación dimensional $ d _ { text {modelo}} $.
- Cada vector de incrustación que representa una palabra de entrada se aumenta al sumarlo (por elementos) a un vector de codificación posicional de la misma longitud $ d _ { text {modelo}} $, introduciendo así información posicional en la entrada.
- Los vectores de incrustación aumentados se alimentan al bloque codificador, que consta de las dos subcapas explicadas anteriormente. Dado que el codificador atiende a todas las palabras en la secuencia de entrada, independientemente de si preceden o suceden a la palabra en consideración, entonces el codificador Transformer es bidireccional.
- El decodificador recibe como entrada su propia palabra de salida predicha en el intervalo de tiempo, $ t – 1 $.
- La entrada al decodificador también se aumenta mediante la codificación posicional, de la misma manera que se hace en el lado del codificador.
- La entrada de decodificador aumentada se alimenta a las tres subcapas que comprenden el bloque de decodificador explicado anteriormente. El enmascaramiento se aplica en la primera subcapa para evitar que el decodificador preste atención a las palabras siguientes. En la segunda subcapa, el decodificador también recibe la salida del codificador, que ahora permite que el decodificador atienda todas las palabras en la secuencia de entrada.
- La salida del decodificador finalmente pasa a través de una capa completamente conectada, seguida de una capa softmax, para generar una predicción para la siguiente palabra de la secuencia de salida.
Comparación con capas recurrentes y convolucionales
Vaswani y col. (2017) explican que su motivación para abandonar el uso de recurrencia y convoluciones se basó en varios factores:
- Se descubrió que las capas de auto atención son más rápidas que las capas recurrentes para longitudes de secuencia más cortas, y pueden restringirse para considerar solo una vecindad en la secuencia de entrada para longitudes de secuencia muy largas.
- El número de operaciones secuenciales requeridas por una capa recurrente se basa en la longitud de la secuencia, mientras que este número permanece constante para una capa de atención propia.
- En las redes neuronales convolucionales, el ancho del núcleo afecta directamente las dependencias a largo plazo que se pueden establecer entre pares de posiciones de entrada y salida. El seguimiento de las dependencias a largo plazo requeriría el uso de núcleos grandes o pilas de capas convolucionales que podrían aumentar el costo computacional.
Otras lecturas
Esta sección proporciona más recursos sobre el tema si desea profundizar.
Libros
Documentos
Resumen
En este tutorial, descubrió la arquitectura de red del modelo Transformer.
Específicamente, aprendiste:
- Cómo la arquitectura Transformer implementa una estructura de codificador-decodificador sin recurrencia ni convoluciones.
- Cómo funcionan el codificador y decodificador Transformer.
- Cómo se compara la auto-atención del transformador con las capas recurrentes y convolucionales.
¿Tiene usted alguna pregunta?
Haga sus preguntas en los comentarios a continuación y haré todo lo posible para responder.