Transformers: Arquitectura del Encoder

El Transformer es una arquitectura de Deep learning usada principalmente para tareas de procesamiento de lenguaje natural (NLP), se ha posicionado como el estándar por excelencia para tareas de clasificación de textos, extracción de información, modelos de traducción automática de textos, incluso para tareas de computer vision; En este post describiré cómo funciona esta arquitectura.

Primero un poco de contexto, antes del advenimiento del transformer, existían otras arquitecturas como RNN o LSTM que se usaban para problemas de NLP de carácter secuencial como por ejemplo un modelo de generación de texto (como un chatbot).

Sin embargo estas arquitecturas carecían de robustez cuando debían capturar (“o recordar”) información de largo plazo; entonces el transformer viene a solventar un poco ese problema mediante su mecanismo de auto-atención (self-attention), y además esta arquitectura puede ser entrenada en paralelo usando varias GPU, a diferencia de los modelos secuenciales.

Transformer en si consta de 2 “bloques” de funcionamiento el encoder y el decoder, uno codifica y el otro decodifica (no hay misterios). La arquitectura general es mostrada en la siguiente figura:

Fig 1: Arquitectura Transformer

En este post, que será muy teórico, solo se describirá el encoder, en posts subsiguientes hablaremos del decoder.

El Encoder:

Es el encargado de extraer una representación vectorial de texto (es decir convertir el texto a valor numéricos), el encoder a su vez esta compuesto internamente por múltiples bloques estos bloques se pueden apilar como bloques de lego, como se muestra en la figura 2:

Fig 2: Encoders apilados

Cada encoder interno se compone de varias subcapas, las más importantes: la capa de auto-atención (Multi-head attention) y una red neuronal (feed-forward), tal como se muestra:

Fig 3: ENCODER

Ahora te describiré en qué consisten las capas del encoder.

El embedding de entrada:

En esta capa el texto de entrada dividido en tokens, se transforma en un vector numérico (generalmente de dimensión 512, es el valor usado en el transformer original y en BERT), esta capa se puede pensar como una tabla de valores donde el modelo “busca” cual es el vector asociado a un determinado token, ¿de donde saca los valores?: se ajustarán durante el proceso de entrenamiento del transformer. Sin embargo un vector de embedding es algo parecido a:

Fig 4: Matriz de embeddings de ejemplo

Como se puede ver a cada palabra le corresponde un vector numérico de longitud 512.

Matriz de posiciones (capa positional encoding):

Sabemos que en una red RNN o LSTM la información posicional es basada en la recurrencia, pero en el transformer no tenemos recurrencia por lo que se debe encontrar otro mecanismo para conservar la información de la posición de la palabras, este mecanismo se llama positional encoding.

El positional encoding no es más que otra matriz que indica la posición de cada palabra en la oración.

¿Como se calcula? mediante las fórmulas:

ecuación 1 para la matriz de posiciones
ecuación 2 para la matriz de posiciones

Eso significa que para el vector de entrada de longitud 512, se aplicará la ecuación 1 para los posiciones pares y la ecuación 2 para las posiciones impares, siendo pos la posición y dmodel= 512 (la dimensión de vector de entrada).

Por ejemplo, la matriz de posiciones es de la forma :

Fig 5: Matriz de posiciones

y al sustituir los valores de la posición de cada palabra (pos), queda de la forma:

Fig 6: Matriz de posiciones con valores

Luego de calcular dicha matriz simplemente se suma a la matriz de datos de entrada

Por último debemos aclarar que para que al sumar la matriz de posiciones al vector de embedding, la matriz de posiciones no domine al vector de entrada debido a sus más altos valores, se hace un escalado al vector de embedding multiplicandolo por un valor arbitrario (generalmente la raíz cuadrada de 512).

Multi Head Attention (capa de auto-atención):

Esta capa se basa en el mecanismo de auto-atención, ¿Qué es el mecanismo de auto-atención? ¿Con que se come eso?

Con auto-atención el modelo extrae o aprende la representación numérica de cada palabra, mientras hace esto, también encuentra como se relaciona cada palabra con las palabras restantes (como lo mostrado en la figura 7) a fin de obtener una mejor información basada en el contexto, es decir la auto-atención encuentra como una palabra se relaciona con las demás en una determinada secuencia.

Para ilustrar con un ejemplo suponga que tiene la siguiente expresión:

yo hablo ingles

Fig 7: relación de palabras

En la figura 7 se muestra las palabras de una oración y cómo están relacionadas, el grosor de la línea indica que tan fuerte es la relación, solo se muestra a manera de ejemplo las relaciones de la palabra “yo”, esto es lo que se consigue con la auto-atención.

El mecanismo de auto atención funciona de la siguiente manera:

  1. Ya hemos visto que para cada palabra obtenemos su representación numérica y de posición, ahora luego de sumar la matriz de posiciones, en la auto-atención se crean 3 matrices llamadas Q, K y V. ¿Cómo se calculan estas matrices? pues utilizando la matriz de datos de entrada y matrices de peso que son aleatoriamente inicializadas, que se llaman Wq, Wk, Wv el valor de estas matrices son reajustados durante el entrenamiento.
  1. Calculamos las matrices Q, K, V, tal como se muestra:
Fig 8: creación de matrices Q, K y V

Es decir las matrices Q, K y V se obtienen multiplicando el vector de entrada por una matriz de peso Wq, Wk, y Wv respectivamente.

  1. Seguidamente multiplicamos la matriz Q por la matriz K, esto nos permite obtener qué tan similar es una palabra con todas las demás tal como se observa:
Fig 9: Ejemplo Q.K traspuesta

El resultado es algo similar a la siguiente matriz (nótese que los números son solo referenciales, para propósitos de aprendizaje)

Fig 10: Ejemplo de matriz de scores

Se nota que la palabra “yo” está más relacionada con ella misma. El resultado de este producto se puede entender como una matriz de scores que nos indica el grado de similitud, entre una palabra y las palabras restantes en una secuencia.

  1. El resultado lo dividimos entre la raíz cuadra de la longitud del vector (la raíz cuadrada de 64), esto solo para tener gradiente más estables en el entrenamiento.
  1. Y normalizamos mediante la aplicación del softmax, para obtener solo valores entre 0 y 1, y que la suma de todos los valores de cada fila sea 1

Luego de aplicar el softmax se obtiene un resultado como el siguiente:

como se observa se obtiene una matriz de similaridades, donde cada fila suma 1, y cada valor puede ser entendido como el valor de similitud entre cada palabra en la secuencia.

  1. Este resultado lo multiplicamos por la matriz V de esta forma obtenemos la matriz de auto-atención Z.

La multiplicación se ilustra a continuación (una operación matmult) :

Fig 11: Creación matriz de auto-atención

La obtención de la matriz Z, es una operación matmul, donde cada fila representa el vector de auto-atención para cada palabra, la operación para obtener el vector de auto-atención de la palabra “yo” del ejemplo, se muestra a continuación:

Fig 12: ejemplo de calculo de vector de una fila de auto-atención

Visto de otra manera, se calcula así:

¿Cómo se interpreta este resultado?, pues que para la palabra “yo”, el vector de auto-atención contiene 90% (0.9) de la información del vector valor de la palabra “yo”, 5%(0.05) de información del vector valor de la palabra “hablo” y 5% del vector valor de la palabra “inglés”.

de la misma manera para las otras palabras se calcula el correspondiente vector de auto-atención:

De esta forma en el proceso de entrenamiento el transformer va consiguiendo como se relaciona cada palabra con sus vecinos y que peso tiene cada una.

Así que ya sabemos como funciona la auto-atención, pero y ¿qué es el Multi head attention? pues son varias matrices de auto-atención, se añaden varias para crear robustez y poder reconocer ambigüedades en el texto.

El multihead atención no es más que todas las matrices de auto-atención concatenadas (en bert base hay 12 matrices de auto-atención, bert-large tiene 16) multiplicadas por una matriz de peso

Red Neuronal (FeedForward)

Port último tenemos a la red neuronal (FeedForward): consiste de 2 capas densas con RELU como función de activación.

Al final cada bloque del encoder queda, como ya hemos visto en la figura 3.

Se agrega una conexión residual que pasa el vector de entrada sin modificar, esto para no perder información, y se añade una capa de normalización para que el entrenamiento sea más eficiente y rápido.

Palabras finales:

Recuerda se puede agregar tantos encoders como se desee, donde la entrada del próximo encoder es la salida del encoder anterior, tal como se muestra en la figura 2.

Otra cosa importante es que al no tener recurrencia y su funcionamiento estar basado solo en operaciones de matrices, el entrenamiento del transformer puede ser paralelizable con varias GPU.

Es todo, ya tienes una idea más clara de cómo funciona el encoder un una arquitectura transformer, la implementación práctica del transformer la puedes encontrar en el siguiente notebook.

Si deseas saber como funciona el encoder acá en este post te lo explico.

Si te gustó el post, suscribete, todas las semanas un post nuevo relacionando a transformer y NLP.

close

Recibe post semanales!

We don’t spam! Read our privacy policy for more info.

Leave a Reply

Your email address will not be published.

Related Posts

Begin typing your search term above and press enter to search. Press ESC to cancel.

Back To Top