En este post vamos a hacer una introducción al mecanismo de atención usado en modelos seq2seq de deep learning y concretamente en procesamiento de lenguaje natural. La descripción va a tener el nivel de detalle suficiente para que se entienda la esencia y el concepto de atención.
Los modelos seq2seq (sentence to sentence), utilizados para traducción automática de textos, toman como entrada una secuencia de palabras, que una vez convertidas en embeddings, entran iterativamente en una RNN o LSTM y producen una secuencia de palabras de salida.
Como se ve en la siguiente imagen, consta de dos elementos, el encoder y el decoder. El encoder, que es una LSTM desplegada T iteraciones, convierte la frase de la entrada en un estado interno h(T). El decoder toma como estado de entrada h(T) y predice las palabras. Cuando se usa la modalidad teacher forcing en el entrenamiento, las entradas al decoder son las salidas esperadas del traductor y(t-1) en lugar de la salida generada por el modelo. La primera entrada siempre es una palabra de inicio como GO.
Sin embargo, en el modelo tradicional seq2seq de la figura, aunque las LSTM del encoder combinan la entrada actual con la salida anterior (del encoder), comprimen toda la información de la secuencia de entrada en el estado final h(T). Cuando el decoder va a predecir cada palabra, va a usar este estado h(T), otorgándole el mismo peso a cada palabra de la secuencia de entrada.
Esto es un problema, porque cuando traducimos una frase a otro idioma, cada palabra de la frase traducida puede tener correlación con palabras distintas de la entrada, como vemos en este ejemplo:
- Se ha llegado a un acuerdo.
- An agreement has been reached.
Como se puede ver, el principio de la frase original tiene más influencia en el final de la frase traducida y viceversa. De esta forma, para cada palabra de la frase traducida es necesario tener en cuenta diferentes palabras de la frase de entrada.
La solución a este problema, una vez más, tuvo como fuente de inspiración las neurociencias y el comportamiento humano. El mecanismo de atención permite al cerebro centrarse en una parte de la entrada (imagen, texto, cualquier percepción) y darle menos atención a otras.
En el mecanismo de atención, trasladado al modelo seq2seq, el decoder, para predecir un elemento, asigna diferentes pesos a cada uno de los estados h(1), h(2), ..,h(T) producidos por el encoder en lugar de tener en cuenta solo el h(T).
El decoder en cada instante t tendrá una función de salida s(t)=f(s(t-1),y(t-1),c(t)) donde el vector contexto c(t) es una suma ponderada de los estados h(1), h(2), …, h(T) del encoder. Como se ve en la imagen, la entrada al decoder puede ser una concatenación del vector c(t) y el vector salida anterior y(t-1).
Una pregunta que surge es cómo calcular los coeficientes que ponderan cada estado. Este coeficiente tiene que tener un valor para cada entrada en el instante i y cada salida en el instante t y refleja que peso le damos a cada estado de entrada i para predecir la salida en el instante t:
El coeficiente α tiene que ser un parámetro entrenable del modelo y puede ser parametrizado con una red neuronal de una capa NeuralNet(s(t-1),h(i)) y entrenable con el modelo. Se pueden usar otras funciones para calcular el coeficiente α como el producto escalar, coseno, …, pero la más general es una red neuronal.
El softmax se aplica simplemente para que todos los coeficientes α que ponderan todas las entradas en un instante t sumen 1.
En este enlace se muestra un ejemplo de traducción de frases usando seq2seq con atención en PyTorch.
De esta forma tenemos un modelo que cuando va a hacer una predicción en cada instante t asigna diferentes pesos a los estados h(1), h(2), ..,h(T) y esos pesos cambian en cada instante t, de ahí que sea αti. Un mecanismo de atención sencillo pero eficiente.