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 É natural perguntar-se se o problema da tradução poderia, concebivelmente, ser tratado como um problema de criptografia. Quando olho para um artigo em russo, digo: 'Isto está na verdade escrito em inglês, mas foi codificado nalguns símbolos estranhos. Vou agora proceder à decodificação.

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, e é mais notável por ter desenvolvido o word2vec.

Arquitetura A referência principal para esta seção é.

Codificador

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

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

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

x

1 : n

{\displaystyle x_{1:n}}

e uma sequência de saída

y

1 : m

{\displaystyle y_{1:m}}

. O codificador processaria a entrada

x

1 : n

{\displaystyle x_{1:n}}

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

y ^

1

{\displaystyle {\hat {y}}_{1}}

. 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

y ^

1

y

1

{\displaystyle {\hat {y}}_{1}\neq y_{1}}

, a próxima entrada para o decodificador continua a ser

y

1

{\displaystyle y_{1}}

, e assim por diante. Durante o tempo de previsão, o "professor"

y

1 : m

{\displaystyle y_{1:m}}

estaria indisponível. Portanto, a entrada para o decodificador deve ser

y ^

1

{\displaystyle {\hat {y}}_{1}}

, depois

y ^

2

{\displaystyle {\hat {y}}_{2}}

, 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.

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.

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

x

0

,

x

1

, ...

{\displaystyle x_{0},x_{1},\dots }

é 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

h

0

,

h

1

, ...

{\displaystyle h_{0},h_{1},\dots }

, onde

h

{\displaystyle h}

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

y

0

,

y

1

, ...

{\displaystyle y_{0},y_{1},\dots }

, 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:

(

h

0

,

h

1

, ...

{\displaystyle h_{0},h_{1},\dots }

, "<start>") → "la" (

h

0

,

h

1

, ...

{\displaystyle h_{0},h_{1},\dots }

, "<start> la") → "la zone" (

h

0

,

h

1

, ...

{\displaystyle h_{0},h_{1},\dots }

, "<start> la zone") → "la zone de" ... (

h

0

,

h

1

, ...

{\displaystyle h_{0},h_{1},\dots }

, "<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

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

h

0

d

{\displaystyle h_{0}^{d}}

, o 0o vetor oculto do decodificador. Em seguida, o vetor intermediário é transformado por um mapa linear

W

Q

{\displaystyle W^{Q}}

num vetor de consulta

q

0

=

h

0

d

W

Q

{\displaystyle q_{0}=h_{0}^{d}W^{Q}}

. Enquanto isso, os vetores ocultos emitidos pelo codificador são transformados por outro mapa linear

W

K

{\displaystyle W^{K}}

em vetores de chave

k

0

=

h

0

W

K

,

k

1

=

h

1

W

K

, ...

{\displaystyle k_{0}=h_{0}W^{K},k_{1}=h_{1}W^{K},\dots }

. 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:

q

0

k

0

T

,

q

0

k

1

T

, ...

{\displaystyle q_{0}k_{0}^{T},q_{0}k_{1}^{T},\dots }

. Idealmente, o modelo deveria ter aprendido a calcular as chaves e os valores, de modo a que

q

0

k

0

T

{\displaystyle q_{0}k_{0}^{T}}

seja grande,

q

0

k

1

T

{\displaystyle q_{0}k_{1}^{T}}

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 0o vetor oculto do codificador, um pouco ao 1o, 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

0 , 1 , ...

{\displaystyle 0,1,\dots }

. Isto pode ser conseguido através da função softmax, dando-nos assim os pesos de atenção:

(

w

00

,

w

01

, ... ) =

s o f t m a x

(

q

0

k

0

T

,

q

0

k

1

T

, ... )

{\displaystyle (w_{00},w_{01},\dots )=\mathrm {softmax} (q_{0}k_{0}^{T},q_{0}k_{1}^{T},\dots )}

Isto é então usado para calcular o vetor de contexto:

c

0

=

w

00

v

0

+

w

01

v

1

+ ⋯

{\displaystyle c_{0}=w_{00}v_{0}+w_{01}v_{1}+\cdots }

onde

v

0

=

h

0

W

V

,

v

1

=

h

1

W

V

, ...

{\displaystyle v_{0}=h_{0}W^{V},v_{1}=h_{1}W^{V},\dots }

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

W

Q

,

W

K

,

W

V

{\displaystyle W^{Q},W^{K},W^{V}}

, 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.

Este é o mecanismo de atenção de produto escalar (dot-attention). A versão particular descrita nesta secção é a "atenção cruzada do decodificador" (decoder cross-attention), uma vez que o vetor de contexto de saída é usado pelo decodificador, e as chaves e valores de entrada vêm do codificador, mas a consulta vem do decodificador, daí "atenção cruzada". Mais sucintamente, podemos escrevê-lo como:

c

0

=

A t t e n t i o n

(

h

0

d

W

Q

, H

W

K

, H

W

V

) =

s o f t m a x

( (

h

0

d

W

Q

)

( H

W

K

)

T

) ( H

W

V

)

{\displaystyle c_{0}=\mathrm {Attention} (h_{0}^{d}W^{Q},HW^{K},HW^{V})=\mathrm {softmax} ((h_{0}^{d}W^{Q})\;(HW^{K})^{T})(HW^{V})}

onde a matriz

H

{\displaystyle H}

é a matriz cujas linhas são

h

0

,

h

1

, ...

{\displaystyle h_{0},h_{1},\dots }

. Note-se que o vetor de consulta,

h

0

d

{\displaystyle h_{0}^{d}}

, não é necessariamente o mesmo que o vetor chave-valor

h

0

{\displaystyle h_{0}}

. De facto, é teoricamente possível que os vetores de consulta, chave e valor sejam todos diferentes, embora isso raramente seja feito na prática.

Outras aplicações Em 2019, o Facebook anunciou a sua utilização na integração simbólica e na resolução de equações diferenciais. A empresa afirmou que o modelo poderia resolver equações complexas mais rapidamente e com maior precisão do que soluções comerciais como Mathematica, MATLAB e Maple. Primeiro, a equação é analisada (parsed) numa estrutura de árvore para evitar idiossincrasias notacionais. Em seguida, uma rede neural LSTM aplica as suas capacidades padrão de reconhecimento de padrões para processar a árvore. Em 2020, o Google lançou o Meena, um chatbot baseado em seq2seq com 2,6 bilhões de parâmetros, treinado num conjunto de dados de 341 GB. O Google afirmou que o chatbot tem uma capacidade de modelo 1,7 vezes maior que a do GPT-2 da OpenAI. Em 2022, a Amazon introduziu o AlexaTM 20B, um modelo de linguagem seq2seq de tamanho moderado (20 bilhões de parâmetros). Ele usa um codificador-decodificador para realizar o aprendizado few-shot. O codificador produz uma representação da entrada que o decodificador usa como entrada para executar uma tarefa específica, como traduzir a entrada para outro idioma. O modelo supera o muito maior GPT-3 em tradução de idiomas e resumo. O treinamento mistura a remoção de ruído (denoising) (inserindo apropriadamente texto em falta em cadeias) e a modelagem causal de linguagem (estendendo significativamente um texto de entrada). Permite adicionar recursos em diferentes idiomas sem fluxos de trabalho de treinamento massivos. O AlexaTM 20B alcançou um desempenho no estado da arte em tarefas de aprendizado few-shot em todos os pares de idiomas Flores-101, superando o GPT-3 em várias tarefas.

Ver também Rede neural artificial Transfomer Atenção

Referências

Ligações externas Voita, Lena. «Sequence to Sequence (seq2seq) and Attention» (em inglês). Consultado em 20 de dezembro de 2023 «A ten-minute introduction to sequence-to-sequence learning in Keras». blog.keras.io. Consultado em 19 de dezembro de 2019