Laboratório GPT-2 · RoBERTa · Parte II — A família GPT
08

Pré-treino, loss
e perplexidade

O que exatamente o modelo aprendeu — e como medir isso com um número só, sem depender de anedotas.

Apostila 08 de 15 Pré-requisito: apostila 06

1 A tarefa: prever a próxima palavra. Só isso.

O GPT-2 nunca foi ensinado a responder perguntas, resumir textos, traduzir ou escrever código. Ele foi treinado numa única tarefa, repetida bilhões de vezes:

dado tudo o que veio antes, qual é o próximo token?

Isso se chama modelagem de linguagem causal (CLM). Formalmente, o modelo aprende a probabilidade de uma sequência inteira, decomposta pela regra da cadeia:

P(x1, …, xn) = Πt=1n P(xt | x<t) A probabilidade de um texto é o produto das probabilidades de cada token dado os anteriores. Essa fatoração é exata — não é aproximação. É a razão pela qual a máscara causal (apostila 04) é a peça certa: ela garante que xt só veja x<t.
Por que uma tarefa tão simples produz tanta coisa

Para prever bem a próxima palavra em textos arbitrários da internet, o modelo é obrigado a aprender, como efeito colateral: ortografia, gramática, concordância, fatos sobre o mundo, estrutura de argumentos, formatos de código, e até rudimentos de raciocínio.

Pense em completar "A capital do Japão é ____". Não há atalho estatístico: para acertar, é preciso saber. O objetivo de treino é trivial; a pressão que ele exerce, não. Essa foi a grande aposta do artigo do GPT-2 — e ela venceu.

A eficiência escondida

Cada sequência de n tokens produz n exemplos de treino simultâneos, não um. Um texto de 1024 tokens gera 1024 previsões, todas cobradas de uma vez, num único passe. É por isso que se chama auto-supervisão: os rótulos são o próprio texto, deslocado em uma posição. Nenhum humano anotou nada.

Uma sequencia, muitos exemplos:

entrada  The  capital  of    France  is
alvo     capital  of   France  is    Paris
         ^       ^      ^      ^      ^
         5 previsoes, 5 perdas, 1 passe pelo modelo

Alinhamento no codigo: logits[:, :-1]  contra  labels[:, 1:]
(descarta a ultima previsao, que nao tem alvo, e o primeiro
token, que nao e previsto por ninguem)

2 A loss: entropia cruzada

Como se pune um erro? Com o logaritmo negativo da probabilidade atribuída ao token correto:

ℒ = − 1n Σt=1n log P(xt | x<t) Média, sobre todas as posições, de −log da probabilidade dada à palavra que de fato apareceu. Note: só a probabilidade do token correto entra na conta. As outras 50 256 importam apenas por dividirem a massa no softmax.

Por que o logaritmo

Três razões, e vale entender as três:

3 Perplexidade: a loss em unidade humana

A loss é útil mas pouco intuitiva. A perplexidade é simplesmente sua exponencial:

PPL = exp(ℒ) Se a loss é 3,2 nats, a perplexidade é e3,2 ≈ 24,5.

E ela tem uma leitura direta e muito útil:

Como ler uma perplexidade

Perplexidade é o número efetivo de opções entre as quais o modelo está em dúvida, a cada palavra.

PPL = 1 → certeza absoluta, sempre. PPL = 25 → é como se, a cada palavra, o modelo estivesse escolhendo aleatoriamente entre 25 candidatos igualmente prováveis. PPL = 50 257 → o modelo não aprendeu nada; está chutando uniformemente sobre o vocabulário inteiro.

Menor é melhor. Sempre.

Referências para calibrar sua intuição

Perplexidades típicas em inglês. Cuidado ao comparar números entre fontes — veja o alerta abaixo.
SituaçãoPPL aproximada
Chute uniforme no vocabulário50 257
Modelo de trigramas (anos 90)~150
GPT-2 small, texto em inglês~25–30
GPT-2 XL, texto em inglês~15–18
GPT-3 (175 B)~10
Modelos de fronteira, 2026< 8
Estimativa para um humano~10–12
Perplexidade só é comparável dentro do mesmo tokenizador

Esta é a armadilha mais comum, e ela invalida muita comparação publicada. A perplexidade é medida por token. Se o modelo A usa um tokenizador que quebra o texto em 100 tokens e o modelo B usa um que quebra em 150, o modelo B parece melhor só por estar prevendo pedaços menores e mais fáceis.

Toda a família GPT-2 compartilha o mesmo tokenizador, então a comparação entre eles é legítima. Comparar a PPL de um GPT-2 com a de um Llama é comparar coisas diferentes — a menos que se normalize por caractere ou por byte (as métricas bits-per-character ou bits-per-byte existem exatamente para isso).

Isso também explica por que a PPL do GPT-2 em português vai parecer alta: além de o modelo não conhecer bem o idioma, cada palavra está sendo quebrada em mais tokens.

4 Como o GPT-2 foi treinado, na prática

ItemDetalhe
CorpusWebText: ~8 milhões de páginas, ~40 GB de texto. Construído raspando todos os links externos postados no Reddit que tivessem ao menos 3 karma — um filtro de qualidade barato e engenhoso, usando curadoria humana já existente.
FiltragemWikipédia foi removida de propósito, para não contaminar avaliações. Duplicatas removidas.
ObjetivoCLM puro. Sem instruções, sem RLHF, sem chat. O GPT-2 não é um assistente — ele é um completador de texto.
Contexto1024 tokens. Documentos separados por <|endoftext|>.
OtimizadorAdam, com warmup na taxa de aprendizado e decaimento por cosseno.
ÉpocasAproximadamente 1. O modelo viu cada texto essencialmente uma vez.
"O GPT-2 não é um assistente" — leve isso a sério

Se você escrever "Qual é a capital da França?", o GPT-2 não vai responder. Ele vai continuar o texto, e a continuação mais provável de uma pergunta na internet é… outra pergunta. Ele pode devolver "Qual é a capital da Alemanha? Qual é a capital da Itália?".

Isso não é falha do modelo — é o modelo funcionando exatamente como treinado. A distância entre o GPT-2 e o ChatGPT não é principalmente tamanho: é o fine-tuning de instruções e o RLHF, que vieram depois e que ensinam o modelo a tratar o texto como um pedido a ser atendido em vez de um trecho a ser continuado.

Consequência prática: com o GPT-2, escreva prompts em forma de começo de texto, não de pergunta. "A capital da França é" funciona; "Qual é a capital da França?" não.

5 O código

# perplexidade de um texto, do jeito correto
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM

tok = AutoTokenizer.from_pretrained("openai-community/gpt2")
mod = AutoModelForCausalLM.from_pretrained("openai-community/gpt2").eval()

def perplexidade(texto):
    ids = tok(texto, return_tensors="pt", truncation=True, max_length=1024)
    # passando labels=input_ids, o transformers já faz o deslocamento
    # de 1 posição e calcula a entropia cruzada média.
    with torch.no_grad():
        perda = mod(**ids, labels=ids["input_ids"]).loss
    return torch.exp(perda).item()

print(perplexidade("The capital of France is Paris."))     # baixa
print(perplexidade("Colorless green ideas sleep furiously.")) # alta

6 No laboratório

.venv\Scripts\python.exe lab\08_perplexity.py
  1. Mede a perplexidade de vários tipos de texto — inglês natural, português, texto embaralhado, texto aleatório, código, e a frase famosa de Chomsky. A ordem dos resultados diz muito sobre o que o modelo aprendeu.
  2. Compara os cinco modelos no mesmo texto. Aqui a escala aparece limpa e monotônica, ao contrário da anedota da apostila 06. Esta é a medição honesta.
  3. Mostra a surpresa token a token, destacando onde o modelo se espantou. É a visão mais direta do que o modelo "sabe".
  4. Demonstra que o GPT-2 não é assistente, comparando um prompt em forma de pergunta com um em forma de começo de texto.
  5. Mede a perplexidade em português e separa os dois efeitos que a inflam: desconhecimento do idioma e fragmentação do tokenizador.

7 Dois resultados do laboratório que valem a apostila inteira

Primeiro: a escala se comporta quando medida direito

Perplexidade sobre o mesmo parágrafo em inglês, medida nesta máquina.
ModeloParâmetrosPPLComparado ao anterior
openai-gpt117 M46,07—
gpt2124 M21,70melhorou
gpt2-medium355 M16,04melhorou
gpt2-large774 M14,30melhorou
gpt2-xl1558 M12,93melhorou

Monotônica em todos os degraus. Nenhuma inversão, nenhuma surpresa. Compare com a apostila 06, onde o large "errou" uma pergunta que o medium "acertou".

Os modelos são os mesmos nos dois experimentos. O que mudou foi a métrica. Uma amostra única mede ruído; a perplexidade mede a distribuição. Guarde esse par de resultados — é a melhor lição de metodologia deste curso.

Repare também no salto GPT-1 → GPT-2: de 46 para 21,7 com praticamente o mesmo número de parâmetros (117 M vs 124 M). Isso não foi escala. Foi o corpus melhor, o tokenizador melhor e o Pre-LN. É o assunto da próxima apostila.

Segundo: lixo aleatório é mais fácil que uma frase gramatical sem sentido

PPL do gpt2 em textos de naturezas diferentes. Leia a ordem com atenção.
TextoPPL
Clichê famoso: "It was the best of times…"5,8
Código Python8,6
Inglês natural21,7
Português natural413,1
Caracteres aleatórios469,4
Inglês com palavras embaralhadas3 874,0
Chomsky: "Colorless green ideas sleep furiously"6 413,3

Ruído puro sai oito vezes mais barato que o inglês embaralhado, e treze vezes mais barato que a frase do Chomsky. Isso parece estranho até você entender o que a perplexidade realmente mede.

Perplexidade mede expectativa frustrada, não desordem

Depois dos primeiros caracteres aleatórios, o modelo entra num regime de "isto aqui é ruído" e passa a esperar mais ruído — o que ele faz razoavelmente bem. A distribuição fica achatada, mas correta.

Já o texto embaralhado ativa todas as expectativas gramaticais do modelo e depois as viola, uma por uma. Cada violação é cara. A frase do Chomsky faz o mesmo no nível semântico: sintaxe impecável, significado impossível.

Corolário útil: perplexidade não é uma medida de qualidade de texto. Um texto pode ter PPL baixíssima por ser genérico e decorado (veja o clichê, em 5,8). Usar PPL como proxy de "qualidade" é um erro comum.

Ressalva metodológica: a frase do Chomsky tem apenas 7 tokens. Médias sobre amostras minúsculas são instáveis, e um único token improvável domina o resultado. Trate esse número como ilustrativo. Regra geral: desconfie de perplexidade calculada sobre textos curtos.

Exercício 8 — preveja antes de rodar

  1. Ordene do menor para o maior PPL, antes de rodar: (a) um parágrafo da Wikipédia em inglês; (b) o mesmo parágrafo com as palavras embaralhadas; (c) código Python; (d) um parágrafo em português; (e) caracteres aleatórios.
  2. Se um modelo tem PPL 20 e outro tem 10, o segundo é "duas vezes melhor"? O que a relação entre eles significa de fato? (Dica: pense em bits.)
  3. Por que a Wikipédia foi removida do WebText? O que aconteceria com as avaliações se não tivesse sido?
  4. Difícil: a loss média por token esconde variação enorme. Um texto pode ter PPL 25 com todos os tokens em ~25, ou com metade em 2 e metade em 300. Como você distinguiria os dois casos, e por que isso importaria?
Referências

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.

  1. Radford, A., Narasimhan, K., Salimans, T. e Sutskever, I. (2018). Improving Language Understanding by Generative Pre-Training. Relatório técnico, OpenAI. cdn.openai.com
  2. Radford, A., Wu, J., Child, R., Luan, D., Amodei, D. e Sutskever, I. (2019). Language Models are Unsupervised Multitask Learners. Relatório técnico, OpenAI. cdn.openai.com
  3. Ouyang, L. et al. (2022). Training Language Models to Follow Instructions with Human Feedback. NeurIPS 2022. arXiv:2203.02155

Fim da Parte II. Você entende a família GPT inteira: como ela é montada, como escolhe palavras, e como se mede.
A Parte III cruza para o outro galho da árvore — e a apostila 09 primeiro fecha a conta com o GPT-1.