miniaturadaimagem|Animação do seq2seq com RNN e mecanismo de atenção Seq2seq é uma família de abordagens de aprendizado de máquina usadas para o processamento de linguagem natural. Originalmente desenvolvido por Lê Viết Quốc, um cientista da computação vietnamita e pioneiro do aprendizado de máquina no Google Brain, este framework tornou-se fundamental em muitos sistemas modernos de IA. As aplicações incluem tradução de idiomas, legendagem de imagens, modelos conversacionais, reconhecimento de fala, e resumo de textos. O Seq2seq utiliza a transformação de sequências: ele transforma uma sequência noutra sequência.
História
direita|miniaturadaimagem|343x343px|Diagrama de Shannon de um sistema de comunicações geral, mostrando o processo pelo qual uma mensagem enviada se torna a mensagem recebida (possivelmente corrompida por ruído) O seq2seq é uma abordagem à tradução automática (ou, mais genericamente, à transdução de sequências) com raízes na teoria da informação, onde a comunicação é entendida como um processo de codificação-transmissão-decodificação, e a tradução automática pode ser estudada como um caso especial de comunicação. Este ponto de vista foi elaborado, por exemplo, no modelo de canal ruidoso da tradução automática.
Na prática, o seq2seq mapeia uma sequência de entrada num vetor numérico real usando uma rede neural (o codificador), e depois mapeia-o de volta para uma sequência de saída usando outra rede neural (o decodificador).
A ideia de transdução de sequência codificador-decodificador foi desenvolvida no início da década de 2010. Os artigos mais comumente citados como os criadores que produziram o seq2seq são dois artigos de 2014.
No seq2seq conforme proposto por eles, tanto o codificador quanto o decodificador eram LSTMs. Isso apresentava o problema de "estrangulamento" (bottleneck), visto que o vetor de codificação tem um tamanho fixo, então para sequências de entrada longas, a informação tenderia a ser perdida, já que é difícil encaixá-la no vetor de codificação de comprimento fixo. O mecanismo de atenção, proposto em 2014, resolveu o problema do estrangulamento. Eles chamaram ao seu modelo RNNsearch, pois ele "emula a pesquisa por uma frase de origem durante a decodificação de uma tradução".
Um problema com os modelos seq2seq neste ponto era que as redes neurais recorrentes são difíceis de paralelizar. A publicação dos Transformers em 2017 resolveu o problema substituindo a RNN de codificação por blocos Transformer de autoatenção ("blocos codificadores"), e a RNN de decodificação por blocos Transformer com máscara causal de atenção cruzada ("blocos decodificadores").
Disputa de prioridade Um dos artigos citados como o originador do seq2seq é (Sutskever et al 2014), publicado na Google Brain enquanto trabalhavam no projeto de tradução automática do Google. A pesquisa permitiu que a Google reformulasse o Google Tradutor para a Tradução Automática Neural do Google em 2016. Tomáš Mikolov afirma ter desenvolvido a ideia (antes de se juntar à Google Brain) de usar um "modelo de linguagem neural em pares de frases... e então [gerar] a tradução depois de ver a primeira frase" — o que ele equipara à tradução automática seq2seq, e ter mencionado a ideia a Ilya Sutskever e Quoc Le (enquanto estava na Google Brain), que falharam em dar-lhe crédito no seu artigo. Mikolov tinha trabalhado no RNNLM (usando RNN para modelagem de linguagem) para a sua tese de doutoramento,Mikolov, Tomáš. "Statistical language models based on neural networks." (2012). e é mais notável por ter desenvolvido o word2vec.
Arquitetura A referência principal para esta seção é.
Codificador miniaturadaimagem|Codificador RNN O codificador é responsável por processar a sequência de entrada e capturar as suas informações essenciais, que são armazenadas como o estado oculto da rede e, num modelo com mecanismo de atenção, um vetor de contexto. O vetor de contexto é a soma ponderada dos estados ocultos de entrada e é gerado para cada instante de tempo nas sequências de saída.
Decodificador miniaturadaimagem|Decodificador RNN O decodificador pega no vetor de contexto e nos estados ocultos do codificador e gera a sequência de saída final. O decodificador opera de maneira autorregressiva, produzindo um elemento da sequência de saída de cada vez. Em cada passo, ele considera os elementos gerados anteriormente, o vetor de contexto e as informações da sequência de entrada para fazer previsões para o próximo elemento na sequência de saída. Especificamente, num modelo com mecanismo de atenção, o vetor de contexto e o estado oculto são concatenados juntos para formar um vetor oculto de atenção, que é usado como entrada para o decodificador.
O método seq2seq desenvolvido no início da década de 2010 usa duas redes neurais: uma rede codificadora converte uma frase de entrada em vetores numéricos, e uma rede decodificadora converte esses vetores em frases no idioma de destino. O mecanismo de Atenção foi enxertado nesta estrutura em 2014 e é mostrado abaixo. Mais tarde, foi refinado na arquitetura codificador-decodificador Transformer de 2017.
Treinamento vs previsão miniaturadaimagem|Treinamento de um modelo seq2seq via teacher forcing miniaturadaimagem|Prevendo uma sequência usando um modelo seq2seq Existe uma diferença subtil entre o treinamento e a previsão. Durante o tempo de treinamento, tanto as sequências de entrada como as de saída são conhecidas. Durante o tempo de previsão, apenas a sequência de entrada é conhecida, e a sequência de saída deve ser decodificada pela própria rede.
Especificamente, considere uma sequência de entrada e uma sequência de saída . O codificador processaria a entrada passo a passo. Depois disso, o decodificador pegaria na saída do codificador, bem como no token <bos> como entrada, e produziria uma previsão . Agora, a pergunta é: o que deve ser inserido no decodificador no passo seguinte?
Um método padrão para o treinamento é o "teacher forcing". No teacher forcing, não importa o que seja gerado pelo decodificador, a próxima entrada para o decodificador é sempre a referência correta. Ou seja, mesmo que , a próxima entrada para o decodificador continua a ser , e assim por diante.
Durante o tempo de previsão, o "professor" estaria indisponível. Portanto, a entrada para o decodificador deve ser , depois , e assim por diante.
Descobriu-se que, se um modelo for treinado puramente por teacher forcing, o seu desempenho degradaria durante o tempo de previsão, uma vez que a geração baseada na própria saída do modelo é diferente da geração baseada na saída do professor. A isto chama-se viés de exposição (exposure bias) ou mudança de distribuição de treino/teste (distribution shift). Um artigo de 2015 recomenda que, durante o treinamento, se alterne aleatoriamente entre o uso do teacher forcing e o não uso do teacher forcing.
Atenção para seq2seq O mecanismo de atenção é uma melhoria introduzida por Bahdanau et al. em 2014 para abordar as limitações na arquitetura Seq2Seq básica, onde uma sequência de entrada mais longa faz com que a saída do estado oculto do codificador se torne irrelevante para o decodificador. Ele permite que o modelo se foque seletivamente em diferentes partes da sequência de entrada durante o processo de decodificação. Em cada passo do decodificador, um modelo de alinhamento calcula a pontuação de atenção usando o estado atual do decodificador e todos os vetores ocultos de atenção como entrada. Um modelo de alinhamento é outro modelo de rede neural que é treinado em conjunto com o modelo seq2seq usado para calcular o quão bem uma entrada, representada pelo estado oculto, corresponde à saída anterior, representada pelo estado oculto de atenção. Uma função softmax é então aplicada à pontuação de atenção para obter o peso da atenção. miniaturadaimagem|Codificador-decodificador RNN seq2seq com mecanismo de atenção, onde a construção detalhada do mecanismo de atenção é exposta. Veja a página do mecanismo de atenção para mais detalhes. Em alguns modelos, os estados do codificador são alimentados diretamente numa função de ativação, eliminando a necessidade de um modelo de alinhamento. Uma função de ativação recebe um estado do decodificador e um estado do codificador e retorna um valor escalar da sua relevância. miniaturadaimagem|Animação do seq2seq com RNN e mecanismo de atenção Considere a tarefa seq2seq de tradução do inglês para o francês. Para sermos concretos, vamos considerar a tradução de "the zone of international control <end>", que deve traduzir para "la zone de contrôle international <end>". Aqui, usamos o token especial <end> como um caractere de controle para delimitar o fim da entrada tanto para o codificador como para o decodificador.
Uma sequência de entrada de texto é processada por uma rede neural (que pode ser uma LSTM, um codificador Transformer, ou alguma outra rede) numa sequência de vetores de valor real , onde significa "vetor oculto".
Depois de o codificador ter terminado o processamento, o decodificador começa a operar sobre os vetores ocultos, para produzir uma sequência de saída , de forma autorregressiva. Ou seja, ele sempre recebe como entrada tanto os vetores ocultos produzidos pelo codificador, como aquilo que o próprio decodificador produziu antes, para produzir a palavra de saída seguinte:
(, "<start>") → "la" (, "<start> la") → "la zone" (, "<start> la zone") → "la zone de" ... (, "<start> la zone de contrôle international") → "la zone de contrôle international <end>"
Aqui, usamos o token especial <start> como um caractere de controle para delimitar o início da entrada para o decodificador. A decodificação termina assim que o "<end>" aparece na saída do decodificador.
Pesos de atenção miniaturadaimagem|Mecanismo de atenção com pesos de atenção, visão geral Como a elaboração manual de pesos anula o propósito do aprendizado de máquina, o modelo deve calcular os pesos de atenção por si mesmo. Fazendo uma analogia com a linguagem das consultas de base de dados, fazemos o modelo construir um trio de vetores: chave (key), consulta (query) e valor (value). A ideia geral é que temos uma "base de dados" na forma de uma lista de pares chave-valor. O decodificador envia uma consulta, e obtém uma resposta na forma de uma soma ponderada dos valores, onde o peso é proporcional à semelhança da consulta com cada chave.
O decodificador primeiro processa a entrada "<start>" parcialmente, para obter um vetor intermediário , o 0º vetor oculto do decodificador. Em seguida, o vetor intermediário é transformado por um mapa linear num vetor de consulta . Enquanto isso, os vetores ocultos emitidos pelo codificador são transformados por outro mapa linear em vetores de chave . Os mapas lineares são úteis para fornecer ao modelo liberdade suficiente para encontrar a melhor forma de representar os dados.
Agora, a consulta e as chaves são comparadas através da obtenção de produtos escalares: . Idealmente, o modelo deveria ter aprendido a calcular as chaves e os valores, de modo a que seja grande, seja pequeno, e o resto seja muito pequeno. Isto pode ser interpretado como dizendo que o peso de atenção deve ser aplicado maioritariamente ao 0º vetor oculto do codificador, um pouco ao 1º, e essencialmente nenhum ao resto.
De forma a fazer uma soma devidamente ponderada, precisamos de transformar esta lista de produtos escalares numa distribuição de probabilidade sobre . Isto pode ser conseguido através da função softmax, dando-nos assim os pesos de atenção: Isto é então usado para calcular o vetor de contexto:
onde são os vetores de valor, transformados linearmente por outra matriz para fornecer ao modelo a liberdade de encontrar a melhor forma de representar os valores. Sem as matrizes , o modelo seria forçado a usar o mesmo vetor oculto tanto para a chave como para o valor, o que poderia não ser apropriado, já que estas duas tarefas não são as mesmas.