Uma linha de código, e todas as consequências que descem dela. A apostila que amarra o curso inteiro.
Chegamos ao ponto que o curso vinha preparando desde a apostila 00. Aqui está, na íntegra, a diferença arquitetural entre o GPT-2 e o RoBERTa:
if causal: att = att.masked_fill(futuro, float("-inf"))
É isso. Tudo o mais é igual ou quase igual: o mesmo bloco Transformer, a mesma equação de atenção, o mesmo algoritmo de tokenização (byte-level BPE), a mesma GELU, o mesmo LayerNorm, tamanhos praticamente idênticos (124 M vs 125 M, ambos com 12 camadas, 768 dimensões e 12 cabeças).
O gpt2 e o roberta-base são gêmeos estruturais que fazem coisas opostas. É o experimento controlado perfeito, e é por isso que estudá-los juntos ensina mais do que estudar qualquer um dos dois sozinho.
Isto não é argumento — é medição. No lab 04 você roda duas frases idênticas até a metade e diferentes no fim, e mede o quanto a representação de cada posição mudou:
A: "The cat sat on the mat and slept peacefully all afternoon"
B: "The cat sat on the mat and screamed furiously all afternoon"
^^^^^^^^^^^^^^^^ so isto muda
GPT-2 (causal) RoBERTa (bidirecional)
pos token |dif| pos token |dif|
0 'The' 0.00e+00 0 '<s>' 3.31e-01
1 'cat' 0.00e+00 1 'The' 3.66e-01
2 'sat' 0.00e+00 2 'cat' 2.88e-01
3 'on' 0.00e+00 3 'sat' 3.91e-01
4 'the' 0.00e+00 4 'on' 3.40e-01
5 'mat' 0.00e+00 5 'the' 3.01e-01
6 'and' 0.00e+00 6 'mat' 2.59e-01
7 'slept' 7.86e+00 <- muda 7 'and' 3.36e-01
8 ... 1.30e+01 8 'slept' 3.97e-01
...
12 '</s>' 3.27e-01
ZERO ate a palavra trocada. TUDO muda, inclusive o <s>.
O passado e intocavel. Uma palavra reescreve a frase.
Não é aproximadamente zero. É exatamente 0,00e+00, bit a bit. O futuro não existe para o passado num modelo causal. E no RoBERTa, trocar uma palavra no fim altera até o token de abertura.
Tudo o que segue desce daquela linha. Acompanhe a cadeia:
O decoder troca compreensão por geração. O encoder troca geração por compreensão. Não existe almoço grátis: é a mesma arquitetura, com um sinal de menos-infinito decidindo para qual lado ela pende.
| Tarefa | Melhor família | Por quê |
|---|---|---|
| Escrever, completar, conversar | decoder | só ele gera |
| Classificar (spam, sentimento, tópico) | encoder | bidirecional é mais preciso; muito mais barato |
| Busca semântica / embeddings | encoder | vetor de frase de qualidade, um passe só |
| Extrair entidades (NER) | encoder | rótulo por token, contexto dos dois lados |
| Resposta extrativa (achar o trecho) | encoder | marcar início e fim no texto |
| Resposta gerativa (redigir a resposta) | decoder | precisa produzir texto novo |
| Tradução, sumarização | encoder-decoder | T5, BART — leem tudo e escrevem tudo |
| Detectar texto de máquina | encoder | é classificação — nossa apostila 12 |
Com o sucesso do ChatGPT, virou senso comum que "decoders venceram". Isso é meia verdade, e a outra metade importa para quem constrói sistemas.
Para classificar, um RoBERTa-base de 125 M continua sendo a escolha certa em produção: ele roda em milissegundos numa CPU, custa quase nada, e frequentemente supera um LLM gigante na tarefa específica para a qual foi fine-tunado. Chamar um modelo de 70 bilhões de parâmetros para decidir se um e-mail é spam é desperdício por várias ordens de grandeza.
E para busca semântica, é comum que sistemas RAG usem um encoder para produzir os embeddings, muitas vezes derivado do BERT ou do RoBERTa. O decoder escreve a resposta; o encoder encontra o que ler.
A divisão prática, hoje: encoders encontram e classificam, decoders escrevem.
Existe um terceiro arranjo, que vale conhecer para completar o mapa. O Transformer original de 2017 era assim, e o T5 e o BART seguem o mesmo desenho:
É o melhor dos dois mundos, ao custo de aproximadamente o dobro do modelo. Ideal quando entrada e saída são objetos distintos — traduzir do português para o inglês, resumir um artigo. Menos útil para diálogo aberto, onde a "entrada" e a "saída" são o mesmo fluxo de conversa contínuo — o que ajuda a explicar por que o mundo dos assistentes convergiu para decoders puros.
Transformer (2017)
encoder + decoder
|
+------------+------------+
| |
so o DECODER so o ENCODER
(com mascara causal) (sem mascara causal)
| |
GPT-1 (2018) BERT (2018)
117M, BooksCorpus MLM + NSP, WordPiece
| |
GPT-2 (2019) RoBERTa (2019)
124M-1.5B, WebText MLM dinamico, sem NSP,
Pre-LN, BPE de byte BPE de byte do GPT-2, 160GB
| |
GPT-3 (2020) +--> roberta-*-openai-detector
175B, few-shot classificador binario
| treinado nas saidas do GPT-2
InstructGPT / ChatGPT ^
fine-tuning + RLHF |
| |
LLMs modernos -------- gera o texto --------+
que o detector julga
Repare no fecho do desenho: os dois galhos, separados em 2018 por uma linha de código, se reencontram no detector. A OpenAI construiu o caçador com a arquitetura oposta à da caça. É a apostila 12.
.venv\Scripts\python.exe lab\04_multihead_mask.py (seção 3 — a prova) .venv\Scripts\python.exe lab\10_roberta_mlm.py (a comparação)
Responda sem consultar. Se travar em alguma, volte à apostila indicada.
roberta-base tem 125 M e o gpt2 tem 124 M. De onde vem essa diferença de 1 milhão? (apostilas 01 e 02)As fontes primárias dos conceitos deste capítulo. Os números do texto foram medidos no laboratório; as ideias vêm daqui.
Os termos técnicos têm aqui o sentido de aprendizado de máquina. O glossário do curso mostra esse sentido ao lado dos outros que as mesmas palavras têm na TI.
A apostila 12 fecha a Parte III com o modelo mais curioso da coleção: o detector.
E ele traz uma resposta desconfortável para a pergunta 3 do Exercício 0.