Sequência para Sequência (Sequence-to-Sequence)

Visão geral

Modelos sequência para sequência (sequence-to-sequence, seq2seq) mapeiam uma sequência de entrada para uma sequência de saída, potencialmente de comprimento diferente. Essa configuração de “transdução de sequência (sequence transduction)” sustenta a tradução automática (inglês → francês), a sumarização abstrativa (documento → resumo), o reconhecimento de fala (quadros de áudio → texto) e muitas outras tarefas de geração condicional.

Um modelo de seq2seq normalmente segue o padrão codificador–decodificador (encoder–decoder):

  • O codificador (encoder) lê a sequência de origem e produz uma representação do seu conteúdo.
  • O decodificador (decoder) gera a sequência-alvo token a token, condicionado à representação do codificador e aos tokens gerados anteriormente.

Historicamente, modelos de seq2seq eram construídos com redes recorrentes (LSTMs/GRUs). Hoje, a maioria dos sistemas de seq2seq de alto desempenho usa arquiteturas codificador–decodificador do Transformer, baseando-se em autoatenção (self-attention) e atenção cruzada (cross-attention) em vez de recorrência. Para fundamentos específicos de Transformer, veja Arquitetura Transformer, Mecânica de Atenção e Codificações Posicionais.

O problema de transdução de sequência

Considere a entrada como uma sequência (x = (x_1, \dots, x_n)) e a saída como (y = (y_1, \dots, y_m)). Um modelo de seq2seq define uma probabilidade condicional:

[ p(y \mid x) = \prod_{t=1}^{m} p(y_t \mid y_{<t}, x) ]

Esta é uma fatoração autorregressiva (autoregressive): para prever o próximo token, o modelo condiciona em toda a entrada (x) e em todos os tokens de saída gerados anteriormente (y_{<t}).

Dois exemplos comuns:

  • Tradução automática (machine translation): (x) é uma frase no idioma de origem, (y) é a frase traduzida.
  • Sumarização (summarization): (x) é um documento longo, (y) é um resumo mais curto.

Arquitetura codificador–decodificador

Codificador

O codificador transforma a sequência de tokens de entrada em uma sequência de estados ocultos:

[ h = (h_1, \dots, h_n) ]

Em Transformers, isso é feito com camadas empilhadas de:

  • Autoatenção multi-cabeças sobre os tokens de entrada
  • Redes feed-forward
  • Conexões residuais + normalização de camada

Como a autoatenção é invariante a permutação, o modelo também requer informação posicional (positional information) (absoluta ou relativa), abordada em Codificações Posicionais.

Decodificador

O decodificador gera tokens de saída um passo por vez. Em codificadores–decodificadores Transformer, cada camada do decodificador normalmente contém:

  1. Autoatenção mascarada (masked self-attention) sobre tokens-alvo já gerados (impede “espiar” tokens futuros)
  2. Atenção cruzada sobre as saídas do codificador (h) (é isso que condiciona a geração na origem)
  3. Rede feed-forward

A atenção cruzada é o mecanismo-chave que permite ao decodificador “olhar” para a sequência de origem enquanto gera cada token.

Por que codificador–decodificador em vez de um único modelo?

Modelos codificador–decodificador são especialmente naturais quando:

  • A entrada e a saída são modalidades ou formatos diferentes (áudio → texto, tabela → texto).
  • A entrada é longa e precisa ser “lida” antes da geração.
  • Você deseja forte condicionamento em toda a entrada (tradução, sumarização, resposta a perguntas).

Em contraste, modelos de linguagem apenas decodificador (decoder-only) também conseguem fazer geração condicional colocando a entrada no prompt, mas codificadores–decodificadores frequentemente permanecem competitivos ou superiores em muitos cenários clássicos de seq2seq, especialmente com entradas longas e separação clara entre origem e alvo.

Atenção como alinhamento (suave)

Os primeiros RNNs de seq2seq tinham dificuldade em comprimir toda a entrada em um único vetor. A atenção (attention) resolveu isso ao permitir que o decodificador compute uma combinação ponderada dos estados do codificador em cada passo de tempo:

  • O decodificador produz uma consulta (o que ele precisa agora).
  • Os estados do codificador fornecem chaves/valores (o que está disponível a partir da origem).
  • Os pesos de atenção fornecem um alinhamento suave entre posições do alvo e posições da origem.

Isso é particularmente interpretável em tradução: ao gerar uma palavra-alvo, o modelo tende a prestar atenção nas palavras de origem correspondentes (embora Transformers modernos possam usar padrões mais complexos do que um simples alinhamento palavra a palavra).

Para a mecânica de consultas/chaves/valores, veja Mecânica de Atenção.

Treinamento de modelos seq2seq

Tokenização e tokens especiais

Modelos seq2seq geralmente operam sobre tokens de subpalavras (BPE, SentencePiece). Convenções típicas:

  • A entrada pode ser prefixada com uma tag de tarefa (por exemplo, "translate en->de: ..." no estilo de treinamento do T5).
  • O decodificador usa tokens especiais como:
    • <bos> (beginning of sequence)
    • <eos> (end of sequence)
    • <pad> (padding for batching)

Teacher forcing e máxima verossimilhança

A maioria dos sistemas seq2seq é treinada com forçamento do professor (teacher forcing): em tempo de treinamento, o decodificador recebe o token anterior gold (y_{t-1}), e não sua própria previsão amostrada.

O objetivo padrão é máxima verossimilhança (maximum likelihood) (entropia cruzada):

[ \mathcal{L} = -\sum_{t=1}^{m} \log p(y_t \mid y_{<t}, x) ]

O treinamento usa Retropropagação e um otimizador como Adam (uma variante adaptativa de Descida do Gradiente). Estabilizadores comuns incluem:

  • Dropout
  • Suavização de rótulos (label smoothing) (ajuda calibração e generalização em tradução)
  • Agendas de taxa de aprendizado (por exemplo, warmup + decaimento)
  • Clipping de gradiente (historicamente importante para RNNs; ainda às vezes usado)

Viés de exposição

Um problema conhecido: durante o treinamento o modelo condiciona em tokens anteriores verdadeiros; durante a inferência ele condiciona em suas próprias previsões. Essa discrepância é chamada de viés de exposição (exposure bias) e pode acumular erros durante a geração.

Mitigações incluem:

  • Amostragem programada (scheduled sampling) (abordagem mais antiga, difícil de ajustar)
  • Estratégias melhores de decodificação (busca em feixe, decodificação com restrições)
  • Treinamento em nível de sequência (por exemplo, objetivos de aprendizado por reforço), menos comum em pipelines modernos de Transformer do que em trabalhos anteriores de sumarização

Inferência: estratégias de decodificação

Em tempo de inferência, você gera tokens até <eos> ou um comprimento máximo.

Decodificação gulosa

Escolha o token mais provável em cada passo:

[ y_t = \arg\max p(y_t \mid y_{<t}, x) ]

Rápida, mas pode ser míope.

Busca em feixe

Mantém as (k) melhores hipóteses parciais (o “feixe”). Muitas vezes melhora a qualidade de tradução.

Detalhes comuns da busca em feixe:

  • Normalização de comprimento (length normalization) para evitar preferir saídas curtas.
  • Penalidades de cobertura (coverage penalties) (modelos de atenção mais antigos) para reduzir subtradução.
  • Bloqueio de n-gramas (n-gram blocking) em sumarização para reduzir frases repetitivas.

Amostragem (mais comum em geração criativa)

Para tarefas como diálogo ou reescrita criativa, você pode amostrar:

  • Amostragem top-(k)
  • Amostragem de núcleo (top-(p)) (nucleus)
  • Escalonamento de temperatura

Para tradução e sumarização, a decodificação determinística (feixe/gulosa) ainda é comum, mas a amostragem pode ser útil quando você deseja saídas diversas.

Arquiteturas seq2seq clássicas e modernas

Seq2seq baseado em RNN (fundação histórica)

Os primeiros modelos seq2seq usavam:

  • Um codificador RNN produzindo um estado final (ou sequência de estados)
  • Um decodificador RNN gerando tokens
  • Atenção (Bahdanau/Luong) para lidar com gargalos de informação

Esses modelos estabeleceram a receita básica de codificador–decodificador, mas são mais lentos para treinar (sequenciais) e menos escaláveis do que Transformers.

Transformer codificador–decodificador (padrão moderno)

Modelos seq2seq com Transformer removem recorrência, permitindo:

  • Codificação paralela (todos os tokens de uma vez)
  • Melhor captura de dependências de longo alcance via atenção
  • Escalonamento eficiente em hardware moderno

Exemplos canônicos:

  • T5 (Text-to-Text Transfer Transformer): unifica tarefas como texto-para-texto.
  • BART: pré-treinamento por remoção de ruído, forte para sumarização.
  • MarianMT e outras variantes focadas em tradução.
  • mT5 / modelos codificador–decodificador multilíngues para muitos idiomas.

Exemplo prático: pipeline de tradução

Um conjunto de dados de tradução contém sequências pareadas ((x, y)). O fluxo de trabalho geral:

  1. Tokenizar texto de origem e alvo com um tokenizador compartilhado ou separado.
  2. Alimentar os tokens de origem ao codificador.
  3. Treinar o decodificador para prever tokens-alvo com forçamento do professor.
  4. Decodificar com busca em feixe na inferência.

Aqui está um exemplo mínimo usando Hugging Face Transformers (conceitual; nomes exatos de modelos podem variar):

from transformers import AutoTokenizer, AutoModelForSeq2SeqLM

model_name = "Helsinki-NLP/opus-mt-en-de"
tok = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSeq2SeqLM.from_pretrained(model_name)

src = "The encoder reads the input, and the decoder generates the output."
inputs = tok(src, return_tensors="pt")

# Beam search decoding
out_ids = model.generate(
    **inputs,
    num_beams=5,
    max_new_tokens=60,
    length_penalty=1.0,
    early_stopping=True,
)
print(tok.decode(out_ids[0], skip_special_tokens=True))

Dicas práticas:

  • Use busca em feixe para tradução; ajuste num_beams (frequentemente 4–8).
  • Observe incompatibilidade de domínio: faça ajuste fino (fine-tune) em dados paralelos do domínio, se possível.
  • Avalie com BLEU, chrF ou COMET (métricas aprendidas cada vez mais correlacionam melhor com julgamentos humanos do que BLEU).

Exemplo prático: pipeline de sumarização

A sumarização vem em dois tipos principais:

  • Extrativa (extractive): seleciona frases da fonte.
  • Abstrativa (abstractive): gera texto novo (seq2seq é tipicamente usado aqui).

Para sumarização abstrativa:

  • Entradas podem ser longas (artigos, relatórios).
  • Saídas devem ser mais curtas e fiéis.

Um modelo comum é do tipo BART ou do tipo T5:

from transformers import AutoTokenizer, AutoModelForSeq2SeqLM

model_name = "facebook/bart-large-cnn"
tok = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSeq2SeqLM.from_pretrained(model_name)

doc = """Sequence-to-sequence models map an input sequence to an output sequence.
They are used in translation and summarization..."""

inputs = tok(doc, return_tensors="pt", truncation=True, max_length=1024)

summary_ids = model.generate(
    **inputs,
    num_beams=4,
    max_new_tokens=120,
    min_length=30,
    no_repeat_ngram_size=3,
)
print(tok.decode(summary_ids[0], skip_special_tokens=True))

Dicas práticas para sumarização:

  • Use no_repeat_ngram_size para reduzir repetição.
  • Tenha cuidado com truncation: cortar a entrada pode remover fatos-chave.
  • Avalie com ROUGE, mas também use checagens humanas de fidelidade (faithfulness) (alucinações são um risco conhecido).

Melhorias comuns para tarefas seq2seq

Mecanismos de cópia e pointer-generators

Em sumarização, data-to-text e QA, a saída frequentemente precisa reproduzir nomes raros, números ou entidades a partir da entrada. Geração pura pode ter dificuldade com isso.

Mecanismos de ponteiro/cópia (pointer/copy mechanisms) permitem que o decodificador:

  • Gere um token a partir do vocabulário, ou
  • Copie um token diretamente da fonte

Sistemas modernos com Transformer às vezes aproximam esse comportamento via boa tokenização em subpalavras e atenção, mas mecanismos explícitos de cópia ainda podem ajudar em cenários especializados.

Decodificação com restrições

Às vezes as saídas devem satisfazer regras:

  • Devem conter certas entidades
  • Devem seguir um esquema (por exemplo, JSON)
  • Devem evitar conteúdo inseguro

A decodificação com restrições pode impor conjuntos permitidos de tokens em cada passo, ou usar restrições de estado finito. Isso é comum em geração estruturada e sistemas orientados a ferramentas.

Lidando com entradas longas

Transformers codificador–decodificador têm custos de atenção que escalam aproximadamente com o comprimento da sequência (quadrático para atenção completa). Para sumarização de documentos longos, estratégias práticas incluem:

  • Variantes de codificador com contexto longo (atenção esparsa, chunking, codificação hierárquica)
  • Recuperação + sumarização (sumarizar passagens recuperadas)
  • Codificação em janela deslizante (sliding-window) com agregação cuidadosa

Avaliação: o que significa “bom” depende da tarefa

Tradução

  • BLEU: sobreposição de n-gramas orientada a precisão; amplamente usada, mas imperfeita.
  • chrF: F-score de n-gramas de caracteres; muitas vezes melhor em idiomas morfologicamente ricos.
  • COMET / BLEURT: métricas aprendidas que correlacionam melhor com julgamentos humanos.

A avaliação humana frequentemente verifica:

  • Adequação (significado preservado)
  • Fluência (gramaticalidade/naturalidade)
  • Consistência terminológica (específica do domínio)

Sumarização

  • ROUGE: sobreposição orientada a revocação; fácil de computar, limitada para paráfrases abstrativas.
  • Factualidade/fidelidade: cada vez mais medida com avaliadores aprendidos e checagens humanas.

Um modo de falha comum é a alucinação (hallucination): saída fluente que não é sustentada pela fonte.

Onde seq2seq se encaixa dentro da família Transformer

Sistemas baseados em Transformer frequentemente são agrupados em:

  • Apenas codificador (encoder-only) (por exemplo, estilo BERT): melhor para compreensão/classificação.
  • Apenas decodificador (decoder-only) (estilo GPT): melhor para geração de propósito geral via prompting.
  • Codificador–decodificador (encoder–decoder) (Transformers seq2seq): melhor para geração condicional com forte condicionamento na entrada.

Modelos seq2seq são a escolha canônica quando a tarefa é naturalmente “ler a entrada → escrever a saída”, especialmente quando os papéis de entrada e saída devem permanecer distintos.

Aplicações além de tradução e sumarização

Seq2seq é um modelo geral para geração condicional, incluindo:

  • Reconhecimento de fala (características de áudio → texto)
  • Legendagem de imagens (embeddings de imagem → texto)
  • Correção gramatical e transferência de estilo
  • Data-to-text (tabelas/registros → linguagem natural)
  • Geração de código ou tradução de código (código-fonte → código-alvo)
  • Resposta a perguntas (contexto + pergunta → resposta)

Muitas dessas tarefas agora são abordadas com modelos multimodais ou ajustados por instruções (instruction-tuned), mas a espinha dorsal conceitual continua sendo a transdução seq2seq.

Principais conclusões

  • Modelos seq2seq aprendem (p(y \mid x)) para sequências de entrada/saída de comprimento variável.
  • O desenho codificador–decodificador separa de forma limpa “entender a entrada” de “gerar a saída”.
  • Atenção e atenção cruzada permitem alinhamento dinâmico entre origem e alvo, crucial para tradução e sumarização.
  • O treinamento tipicamente usa forçamento do professor com entropia cruzada; a inferência depende de estratégias de decodificação (decoding strategies) como busca em feixe.
  • Sistemas seq2seq modernos geralmente são Transformers codificador–decodificador, intimamente ligados a Mecânica de Atenção e Codificações Posicionais dentro da mais ampla Arquitetura Transformer.