Transformers em PLN (parte 1 de 2): mecanismo de atenção

Uma estrutura de rede neural que tem ganhado relevância recentemente no mundo do Processamento de Linguagem Natural (PLN) é o transformer. Ele vem aos poucos substituindo as redes neurais recorrentes (RNNs), mesmo em sua iteração mais eficiente, as redes do tipo long short-term memory (LSTM), em tarefas do tipo sequence-to-sequence (seq2seq), ou seja, aquelas que recebem uma sequência de dados e produzem outra. Exemplos de implementação desta tarefa são traduções, sumarizações e legendamento de imagens.

Nesta e na próxima postagem, vamos analisar o funcionamento do transformer. Mas antes precisamos entender o conceito que faz do transformer tão eficiente: o mecanismo de atenção. Para isso, vamos supor uma tarefa simples, aquela de traduzir o texto em francês Je suis étudiant para o inglês I am a student.

Conheça o curso Processamento de Linguagem Natural com Deep Learning, que você aprende a implementar passo a passo a arquitetura Transformer para tradução de frases em Inglês para frases em Português!

Primeiro, temos que considerar que uma rede do tipo seq2seq possui dois módulos, um encoder e um decoder. O encoder é responsável por processar a sequência de entrada, transformando ela em um contexto; o decoder, por sua vez, usa o contexto para produzir a sequência de saída. É como se, no caso da tradução acima, primeiro a rede transformasse o texto em francês em um “contexto livre de idioma” – de certa forma, na ideia que o texto expressa -, e depois adicionasse a segunda língua a este contexto.

Neste exemplo, vamos demonstrar tanto o encoder quanto o decoder na forma de RNNs. Estas redes são compostas por um módulo reciclável, que, no caso do encoder, processa as palavras da sequência de entrada uma por uma – ou seja, de forma recorrente. Em cada etapa do processamento, a palavra que entra na rede produz uma saída e um estado oculto (hidden state). É esse hidden state que representa o contexto. Enquanto que, via de regra, a saída da rede no encoder é descartada, o hidden state passa para a próxima etapa, sendo usado em conjunto com a palavra seguinte da sequência para produzir mais uma saída e atualizar o contexto, representado por um novo hidden state. O processo continua até a última palavra da sequência de entrada, quando o encoder entrega o contexto final na forma do hidden state final.

Agora, o contexto é recebido pela segunda RNN, o decoder, que recebe também um “vetor genérico” (cujos valores são ajustados durante o treinamento) representando o início da frase de saída. Assim como o encoder, ele usa este vetor e o contexto para produzir uma saída e um contexto atualizado. Na primeira etapa, a saída já representa a primeira palavra traduzida no segundo idioma. O contexto é reutilizado pelo encoder para produzir a segunda palavra, e assim por diante, até que ele entregue a frase inteira traduzida.

O vídeo abaixo mostra o processo inteiro.

Fonte: https://jalammar.github.io/visualizing-neural-machine-translation-mechanics-of-seq2seq-models-with-attention/
Na etapa do decoder, o caminho dos hidden states não está mostrado, para simplificação.

Este processo funciona relativamente bem, mas observe que, neste exemplo, a frase original tem 3 palavras, enquanto que a frase traduzida contém 4. Dependendo da complexidade da frase, e no caso de traduções, dos idiomas de interesse, a tarefa de traduzir não se trata de um alinhamento simples das palavras individuais. Por isso seria interessante se, a cada etapa da tradução, a rede fosse capaz de focar em uma palavra ou um trecho específico. É aí que entra o conceito da atenção.

No caso das RNNs, o mecanismo de atenção é implementado da seguinte forma. No final do encoder, o contexto não é representado apenas pelo hidden state final, mas também por todos os hidden states produzidos após o processamento de cada palavra. Dessa forma, cada hidden state contém o contexto acumulado até aquela palavra. O decoder, então, recebe todos os hidden states. Ele faz a decodificação da mesma forma que a apresentada anteriormente, ou seja, extraindo do hidden state final do decoder as informações necessárias para produzir o próximo hidden state. Mas além disso, ele usa os demais hidden states para calcular um score de atenção, que indica quanto foco aquela etapa da tradução vai dar para esses contextos parciais. O resultado do score é multiplicado por cada hidden state respectivo, e depois eles são todos somados; o resultado é chamado de estado de contexto. Devido às características dessa rede, se espera que este estado de contexto carregue a informação de interesse de forma amplificada, ou seja, este vetor vai indicar ao decoder em qual parte da frase ele deve prestar mais atenção. Agora, o estado de contexto é concatenado com o hidden state produzido nesta etapa da tarefa, e este vetor é processado por uma estrutura de rede adicional do tipo fully connected, produzindo então o vetor que representa a palavra no segundo idioma.

Parece complicado, mas sugiro seguir o texto com o vídeo abaixo para melhor elucidação:

Fonte: https://jalammar.github.io/visualizing-neural-machine-translation-mechanics-of-seq2seq-models-with-attention/
O “vetor genérico” citado no texto está representado pelo token <END>, que indica o fim da frase no idioma original.

É desta forma que uma rede dotada de atenção consegue traduzir uma sequência como European Economic Area para Zone Économique Européenne. Observe que a ordem das palavras é invertida nos dois idiomas, mas o significado é o mesmo. A figura abaixo mostra como a rede é capaz de apreender esta lógica prestando atenção à sequência original com a inversão necessária:

Fonte: BAHDANAU, CHO e BENGIO (2014). Neural Machine Translation by Jointly Learning to Align and Translate [https://arxiv.org/pdf/1409.0473.pdf ]

O mecanismo de atenção permite não só traduções mais precisas, mas melhores resultados para qualquer tarefa que necessite “traduzir” uma sequência em outra, seja por exemplo transformando um texto em seu resumo ou uma imagem em sua legenda.

No próximo post, veremos como o transformer aplica o conceito de atenção, e por que ele tem sido preferido em relação às RNNs.

Conheça o curso Processamento de Linguagem Natural com Deep Learning, que você aprende a implementar passo a passo a arquitetura Transformer para tradução de frases em Inglês para frases em Português!