El decoder funciona de manera similar al encoder, y al igual que el encoder también está compuesto de bloques que puede ser apilados, la estructura general es la siguiente:

Se puede apreciar que el encoder esta compuesto de:
- Capa de Masked multi-head attention
- Capa de multi-head attention
- Una capa de red neuronal feed-forward
- Capa lineal
- Capa de softmax
ahora te explico como funcionan:
Embedding de datos y matriz de posiciones:
Estas capas funcionan exactamente como en el encoder por lo que no nos detendremos aquí, puedes revisar el post sobre el encoder si lo necesitas.
Capa de Masked Multi-head Attention:
Para empezar el decoder recibe una secuencia de texto el cual se le añade tokens especiales <sos> y <eos>. y ¿para que se le añade el <sos>? pues ya que el decoder tiene que predecir la próxima palabra en una secuencia, este es la manera de indicar el inicio de un secuencia (sos significa start of sequence y eos significa end of sequence )
Esta capa, como su nombre lo indica se encarga de enmascarar (tapar) la palabra siguiente, de manera que el decoder pueda predecir sin conocer cuál es el resto de la secuencia de entrada.
ilustremos con un caso de uso del decoder, suponga que usted desea crear un modelo de traducción automática, esto es, usted le da al modelo una oración en español y el modelo traducirá al inglés:

Como se ve es necesario agregar 2 tokens especiales que indican el inicio y el fin de una oración, es decir cuando empieza y termina la oración, estos token son <sos> y <eos>.
El encoder toma el <sos> y va prediciendo la próxima palabra hasta que encuentra un token de <eos> que indica el fin de la oración.
El mecanismo de auto-atención con máscara del decoder está pensado para que el transformer solo preste atención a las palabras que ya ha predicho.
Ok, pero ¿cómo funciona la masked auto-atención en el encoder?
- Similar al encoder, la masked auto-atención también tiene matrices Q, K y V, que funcionan de la misma manera, aplicando operaciones matriciales que ya hemos visto en el encoder.
- A la matriz de entrada, calculamos el Q.K’t
- Luego dividimos por la dimensión del vector, y se obtendrá una matriz como la siguiente :

notese que los números que se colocan son aleatorios para propósitos de aprendizaje
4. Antes de aplicar el softmax, debemos enmascarar las palabras que siguen, para que no estén disponibles para el modelo, es decir obtendremos una matriz enmascarada como la siguiente:

Como se puede observar se va enmascarando con el valor infinito negativo, el cual le indicará a la matriz de auto-atención que no le preste atención a la palabra siguiente, por ejemplo para el token <sos> no esta disponibles ninguna palabra ya que se enmascaran todas las palabras, para el token “I” se enmascaran las palabras “speak” e “inglés”, por lo que el modelo solo puede ver “<sos> I” y deberá aprender que palabra puede venir a continuación mediante la auto-atención, y así con el resto de la secuencia.
Por último esta matrix es la que introduciremos en la próxima capa: la capa de multi-head attention.
Capa de multi-head attention
Esta capa recibe como entrada 2 matrices: la matriz con los valores enmascaradas (masked self-atention) y la otra entrada es la salida que proviene del encoder, como se muestra en la figura 2.
Al igual que en las otras capas de atención, para esta capa es necesario crear 3 matrices Q, K y V.
La diferencia es que para esta capa la matriz Q, se crea de la multiplicación de la matriz de peso Wq y la matriz de atención enmascarada, y las matrices K y V se crean de la multiplicación de las matrices Wk y Wv por la salida de encoder (la representación numérica que proviene del encoder). tal como se muestra en la figura 5:

Recuerda que las matrices Wq, Wk y Wv son aleatoriamente inicializadas y sus valores son ajustados durante el entrenamiento (durante el backpropagation).
De esta manera la matriz Q contendrá la información de la secuencia que queremos obtener (I speak english), y las matrices K y V contendrán la información de la secuencia de entrada (yo hablo ingles).
Luego de generadas estas matrices, se sigue el proceso visto en el encoder, es decir:
. Calcular la matriz de scores mediante la multiplicación de Q.K’t (Q por la traspuesta de K),
. Escalar el resultado dividendo entre la raiz de 64.
. Obtener el softmax, esta matriz resultante es de la forma:

obtenemos una matriz de scores que indica cómo están relacionadas las palabras entre si, es decir que tan similar es la palabra “I” con la palabra “yo” por ejemplo.
. Ahora obtenemos la matriz de atención, que nos indica a qué palabras debo prestar atención para realizar la predicción:

. Esta matriz de atencion Z, al igual que en el encoder, cada fila contendrá el vector de auto-atención de cada palabra, por ejemplo para la palabra “I”, el vector asociado tomando la matrices de ejemplo de la figura 7,

¿Como se interpreta? pues en este caso el modelo consigue que la palabra “I” en inglés contiene un 95% del vector de la palabra “yo”, un %2 de la palabra “hablo” y un 3% de la palabra “inglés”, con esto el modelo al ver la palabra “yo” como entrada la podría traducir como “I” que es su traducción en inglés.
Capa Feed-forward y de normalización:
El funcionamiento de estas es exactamente el mismo que el visto en el encoder y sirve para lograr un entrenamiento eficiente del modelo.
Capa Lineal y softmax
La capa lineal genera un vector del tamaño del vocabulario usado, es decir si solo entrenamos el modelo con 3 palabras el tamaño del vocabulario es 3, y la capa de softmax transforma este vector en probabilidades a fin de seleccionar las palabras más probables como predicción.
Palabras finales:
Esta arquitectura transformer encoder-decoder es entrenada utilizando cross entropía como función de pérdida.
Muchas veces se utilizan arquitecturas mixtas encoder-decoder, esto es usan BERT como encoder y otro tipo de arquitectura como decoder, como un GPT-2.
Ahora ya tienes una idea de como funciona el decoder, arquitecturas como GPT-2, GPT-3 toman una idea similar para entrenar sus encoders.
En este repositorio de github puedes conseguir el notebook con la implementación desde cero de un transformer.
En subsiguientes post aprenderemos como implementar modelos transformer en la práctica para distintos usos.
Suscribete para que te lleguen las notificaciones sobre nuevos post.
One thought on “Transformers: Arquitectura del Decoder”