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:
- 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).
- 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
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:
- Mascaramento de tokens (token masking).
- Deleção de tokens (token deletion).
- Preenchimento de texto (text infilling - mascara um trecho, o decoder insere o tamanho correto).
- Permutação de sentenças (sentence permutation).
- 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
- 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. - Médio. Implemente o ruído
text_infilldo 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. - Difícil. Ajuste fino do
flan-t5-smallem 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 doLlama-3.2-1Bnos 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
- Raffel et al. (2019). Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer — T5.
- Lewis et al. (2019). BART: Denoising Sequence-to-Sequence Pre-training for Natural Language Generation, Translation, and Comprehension — BART.
- Chung et al. (2022). Scaling Instruction-Finetuned Language Models — Flan-T5.
- Radford et al. (2022). Robust Speech Recognition via Large-Scale Weak Supervision — Whisper, o encoder-decoder canônico de 2026.
- HuggingFace
modeling_t5.py— implementação de referência.