Phase 07 - Lesson 08

T5, BART — Modelos Encoder-Decoder

This lesson includes a graded coding exercise that runs in your browser, unlocked with lifetime access.

Encoders entendem. Decoders geram. Junte-os novamente e você terá um modelo construído para tarefas de entrada → saída: traduzir, resumir, reescrever, transcrever.

Type: Learn Languages: Python Prerequisites: Phase 7 · 05 (Full Transformer), Phase 7 · 06 (BERT), Phase 7 · 07 (GPT) Time: ~45 minutes

O Problema

O GPT (apenas decoder) e o BERT (apenas encoder) simplificaram a arquitetura de 2017 para objetivos diferentes. Mas muitas tarefas são naturalmente de entrada-saída:

  • Tradução: Inglês → Francês.
  • Sumarização: artigo de 5.000 tokens → resumo de 200 tokens.
  • Reconhecimento de fala: tokens de áudio → tokens de texto.
  • Extração estruturada: prosa → JSON.

Para essas tarefas, o encoder-decoder é o ajuste mais limpo. O encoder produz uma representação densa da origem. O decoder gera a saída, realizando atenção cruzada (cross-attention) com essa representação a cada etapa. O treinamento é feito com deslocamento de uma posição (shift-by-one) no lado da saída. A mesma perda (loss) do GPT, apenas condicionada na saída do encoder.

Dois artigos definiram o manual moderno:

  1. T5 (Raffel et al. 2019). "Text-to-Text Transfer Transformer." Cada tarefa de PLN (Processamento de Linguagem Natural) reformulada como texto de entrada, texto de saída. Arquitetura única, vocabulário único, perda única. Pré-treinado em predição de trechos mascarados (span corruption - corromper trechos na entrada e decodificá-los na saída).
  2. BART (Lewis et al. 2019). "Bidirectional and Auto-Regressive Transformer." Autoencoder de eliminação de ruído (denoising autoencoder): corrompe a entrada de múltiplas maneiras (embaralhar, mascarar, deletar, rotacionar) e pede para o decoder reconstruir o original.

Em 2026, o formato encoder-decoder sobrevive onde a estrutura de entrada é importante:

  • Whisper (fala → texto).
  • A pilha de tradução do Google.
  • Alguns modelos de completamento/correção de código que possuem estruturas distintas de contexto e edição.
  • Flan-T5 e variantes para tarefas de raciocínio estruturado.

Os modelos apenas decoder ganharam os holofotes, mas os modelos encoder-decoder nunca desapareceram.

O Conceito

Encoder-decoder com cross-attention

O loop de execução direta (forward loop)

source tokens ─▶ encoder ─▶ (N_src, d_model)  ──┐
                                                 │
target tokens ─▶ decoder block                   │
                 ├─▶ masked self-attention       │
                 ├─▶ cross-attention ◀───────────┘
                 └─▶ FFN
                ↓
              next-token logits

Crucialmente, o encoder roda uma vez por entrada. O decoder roda autoregressivamente, mas realiza atenção cruzada (cross-attention) para a mesma saída do encoder a cada etapa. Fazer o cache da saída do encoder é um ganho de velocidade gratuito para entradas longas.

Pré-treinamento do T5 — corrupção de trechos (span corruption)

Escolha trechos aleatórios da entrada (comprimento médio de 3 tokens, 15% do total). Substitua cada trecho por uma sentinela única: <extra_id_0>, <extra_id_1>, etc. O decoder gera apenas os trechos corrompidos com seu prefixo de sentinela:

source: The quick <extra_id_0> fox jumps <extra_id_1> dog
target: <extra_id_0> brown <extra_id_1> over the lazy

Sinal mais barato do que prever a sequência inteira. Competitivo com MLM (BERT) e prefix-LM (UniLM) na ablação do artigo do T5.

Pré-treinamento do BART — eliminação de ruído multirruído (multi-noise denoising)

O BART testa cinco funções de ruído:

  1. Mascaramento de tokens (token masking).
  2. Deleção de tokens (token deletion).
  3. Preenchimento de texto (text infilling - mascara um trecho, o decoder insere o tamanho correto).
  4. Permutação de sentenças (sentence permutation).
  5. Rotação de documentos (document rotation).

A combinação de preenchimento de texto + permutação de sentenças produziu os melhores números downstream. O decoder sempre reconstrói o original. A saída do BART é a sequência completa, não apenas os trechos corrompidos — portanto, a computação do pré-treinamento é maior do que no T5.

Inferência

Mesma geração autoregressiva do GPT. Amostragem gulosa (greedy), busca em feixe (beam search) ou top-p se aplicam. A busca em feixe (largura 4-5) é o padrão para tradução e sumarização porque a distribuição de saída é mais estreita do que no chat.

Quando escolher cada variante em 2026

Tarefa Encoder-decoder? Por quê
Tradução Sim, geralmente Sequência de origem clara; distribuição de saída fixa; busca em feixe funciona
Fala para texto Sim (Whisper) A modalidade de entrada difere da saída; o encoder molda os recursos de áudio
Chat / raciocínio Não, apenas decoder Sem "entrada" persistente — a conversa é a sequência
Completamento de código Geralmente não Modelos apenas decoder com contexto longo vencem; modelos de código como Qwen 2.5 Coder são apenas decoder
Sumarização Qualquer um funciona BART e PEGASUS superaram as linhas de base anteriores de apenas decoder; LLMs modernos de apenas decoder se equivalem a eles
Extração estruturada Qualquer um T5 é limpo porque "texto → texto" absorve qualquer formato de saída

A tendência desde ~2022: os modelos apenas decoder assumem tarefas que antes eram de modelos encoder-decoder porque (a) LLMs apenas decoder ajustados por instrução generalizam para qualquer coisa via prompting, (b) uma única arquitetura escala mais facilmente do que duas, (c) o RLHF assume um decoder. O encoder-decoder se mantém onde a modalidade de entrada difere (fala, imagens) ou onde a qualidade da busca em feixe é importante.

Construa

Consulte code/main.py. Nós implementamos a corrupção de trechos no estilo T5 para um corpus de brinquedo — a parte isolada mais útil desta lição, pois ela aparece em todas as receitas de pré-treinamento de encoder-decoder desde então.

Passo 1: corrupção de trechos (span corruption)

def corrupt_spans(tokens, mask_rate=0.15, mean_span=3.0, rng=None):
    """Pick spans summing to ~mask_rate of tokens. Return (corrupted_input, target)."""
    n = len(tokens)
    n_mask = max(1, int(n * mask_rate))
    n_spans = max(1, int(round(n_mask / mean_span)))
    ...

O formato de destino é a convenção do T5: <sent0> span0 <sent1> span1 .... A entrada corrompida intercala tokens não alterados com os tokens sentinela nos locais dos trechos.

Passo 2: verificar a ida e volta (round-trip)

Dada a entrada corrompida e o alvo, reconstrua a sentença original. Se a sua corrupção for reversível, a passagem direta está bem definida. Este é um teste de sanidade — o treinamento real nunca faz isso, mas o teste é barato e detecta erros de contagem de deslocamento por um (off-by-one) no controle de posição dos trechos.

Passo 3: inserção de ruído do BART

Cinco funções: token_mask, token_delete, text_infill, sentence_permute, document_rotate. Componha duas delas e mostre o resultado.

Use

Referência do HuggingFace:

from transformers import T5ForConditionalGeneration, T5Tokenizer
tok = T5Tokenizer.from_pretrained("google/flan-t5-base")
model = T5ForConditionalGeneration.from_pretrained("google/flan-t5-base")

inputs = tok("translate English to French: Attention is all you need.", return_tensors="pt")
out = model.generate(**inputs, max_new_tokens=32)
print(tok.decode(out[0], skip_special_tokens=True))

O truque do T5: o nome da tarefa vai no texto de entrada. O mesmo modelo lida com dezenas de tarefas porque cada tarefa é texto de entrada, texto de saída. Em 2026, esse padrão foi generalizado por modelos apenas decoder ajustados por instrução, mas o T5 o codificou primeiro.

Envie

Consulte outputs/skill-seq2seq-picker.md. A habilidade escolhe entre encoder-decoder e apenas decoder para uma nova tarefa, considerando a estrutura de entrada-saída, latência e metas de qualidade.

Exercícios

  1. Fácil. Execute code/main.py, aplique a corrupção de trechos a uma sentença de 30 tokens, verifique se a concatenação dos tokens de origem não sentinelas com os trechos de destino decodificados reproduz o original.
  2. Médio. Implemente o ruído text_infill do BART: substitua trechos aleatórios por um único token <mask_token>, e o decoder deve inferir o comprimento correto do trecho e o conteúdo. Mostre um exemplo.
  3. Difícil. Ajuste fino do flan-t5-small em um corpus minúsculo de Inglês → Pig Latin (200 pares). Meça o BLEU em um conjunto de teste separado de 50 pares. Compare com o ajuste fino do Llama-3.2-1B nos mesmos dados com a mesma computação.

Termos-Chave

Termo O que as pessoas dizem O que realmente significa
Encoder-decoder "Transformer Seq2seq" Duas pilhas: encoder bidirecional para entrada, decoder causal com atenção cruzada (cross-attention) para saída.
Cross-attention "Onde a origem fala com o destino" Q do decoder × K/V do encoder. O único lugar onde as informações do encoder entram no decoder.
Span corruption "O truque de pré-treinamento do T5" Substituir trechos aleatórios por tokens sentinela; o decoder gera os trechos.
Denoising objective "O jogo do BART" Aplicar uma função de ruído à entrada, treinar o decoder para reconstruir a sequência limpa.
Sentinel token "O marcador <extra_id_N>" Tokens especiais que marcam trechos corrompidos na origem e os remarcam no destino.
Flan "T5 ajustado por instrução" T5 ajustado em mais de 1.800 tarefas; tornou o encoder-decoder competitivo no seguimento de instruções.
Beam search "Estratégia de decodificação" Manter as top-k sequências parciais a cada etapa; padrão para tradução/sumarização.
Teacher forcing "Entrada em tempo de treinamento" Durante o treinamento, alimentar o token de acesso anterior real no decoder, não o token amostrado.

Leitura Adicional

0 lifetime access. Curriculum based on AI Engineering from Scratch by Rohit Ghumare (MIT, used under attribution).