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

Decodificação:
temperature, top-k e top-p

O modelo devolve uma distribuição. Transformar isso em palavras é decisão sua — e ela muda o resultado mais do que trocar de modelo.

Apostila 07 de 15 Pré-requisito: apostila 06

1 O que o modelo realmente devolve

Existe um mal-entendido muito difundido: o de que "o modelo escolhe a próxima palavra". Ele não escolhe. O modelo devolve uma nota para cada um dos 50 257 tokens do vocabulário — e para por aí. Escolher é trabalho de um algoritmo separado, que roda depois e que você controla.

Essas notas cruas se chamam logits. Elas vão de −∞ a +∞ e não somam nada em especial. Para virarem probabilidades, passam pelo softmax:

P(token i) = exp(zi)Σj=150257 exp(zj) zi é o logit do token i. Depois disso, os 50 257 números são positivos e somam 1.

A partir daqui, tudo é estratégia de decodificação. E a escolha da estratégia é responsável por uma parte enorme da qualidade percebida — trocar de gpt2 para gpt2-xl muitas vezes muda menos o texto do que trocar de greedy para top-p.

2 Greedy: sempre o mais provável

token = argmaxi P(i) Pega o campeão e pronto. Determinístico: mesma entrada, mesma saída, sempre.

Parece a escolha óbvia — se queremos o texto mais provável, escolhemos a palavra mais provável a cada passo, certo?

Errado, e por dois motivos independentes.

Motivo 1: guloso não é ótimo

A palavra mais provável agora pode levar a um beco onde todas as continuações são ruins. Uma palavra ligeiramente menos provável agora poderia abrir uma sequência muito melhor. O greedy nunca descobre isso, porque nunca volta atrás. É o mesmo problema de qualquer algoritmo guloso.

Motivo 2: o texto mais provável é chato — e isso é medível

Este é o motivo profundo, e ele foi demonstrado num artigo importante (Holtzman et al., 2020, "The Curious Case of Neural Text Degeneration"). Os autores mediram a probabilidade que um modelo atribui a texto escrito por humanos, e compararam com o texto que o próprio modelo gera em modo greedy.

Resultado: o texto humano é muito menos provável. Humanos constantemente escolhem palavras surpreendentes. Um texto onde cada palavra é a mais previsível possível não soa humano — soa como um disco riscado.

gpt2, greedy, prompt "The capital of France is":

  "the capital of the French Republic, and the capital of the
   French Republic, and the capital of the French Republic..."

O loop nao e bug. E o comportamento CORRETO do greedy: uma vez
que a sequencia entra num ciclo de alta probabilidade, cada
repeticao torna a proxima ainda mais provavel. Ele se prende.
O paradoxo central da geração de texto

Maximizar a probabilidade produz texto de baixa qualidade. Para soar humano, é preciso deliberadamente não escolher sempre o mais provável. Toda técnica desta apostila é uma forma disciplinada de introduzir surpresa sem introduzir lixo.

3 Amostragem pura, e por que ela também falha

O extremo oposto: sortear o token respeitando a distribuição. Se " Paris" tem 40% e " the" tem 12%, sorteia-se com esses pesos.

Isso resolve a repetição, mas cria um problema novo e traiçoeiro: a cauda longa.

São 50 257 tokens. Suponha que os 50 mil tokens irrelevantes tenham, cada um, uma probabilidade minúscula de 0,001%. Individualmente, nada. Somados: 50% de chance de sair um token completamente aleatório.

Na prática a distribuição é mais concentrada que isso, mas o efeito é real: amostragem pura produz texto que caminha bem e de repente despenca numa palavra sem sentido — e, como o modelo é autoregressivo, ele agora precisa continuar a partir daquela palavra fora de lugar. Um erro contamina todo o resto.

Precisamos cortar a cauda. As duas formas de fazer isso são o top-k e o top-p.

4 Temperature: o botão da ousadia

Antes do softmax, divida todos os logits por um número T:

P(i) = exp(zi / T)Σj exp(zj / T) O nome vem da física estatística: na distribuição de Boltzmann, a temperatura controla o quanto um sistema explora estados de alta energia. É exatamente a mesma equação.

Repare que é a mesma operação do √dk da atenção (apostila 03). Dividir antes do softmax controla o quanto a distribuição é concentrada.

Efeito da temperature sobre um exemplo com logits [4,0 · 2,0 · 1,0].
TEfeitoDistribuição resultanteQuando usar
0,1quase greedy0,999 · 0,000 · 0,000respostas factuais, código
0,7conservador0,822 · 0,061 · 0,015o padrão sensato
1,0distribuição crua0,665 · 0,090 · 0,033neutro
1,5criativo0,506 · 0,131 · 0,067ficção, brainstorm
3,0caótico0,332 · 0,171 · 0,122quase nunca
Um detalhe que confunde muita gente

temperature=0 é uma divisão por zero e, matematicamente, indefinido. As bibliotecas tratam isso como um caso especial: T=0 vira greedy puro. No transformers, o jeito correto é do_sample=False. Passar temperature=0 com do_sample=True ou dá erro ou é silenciosamente ignorado, dependendo da versão.

5 Top-k: corte fixo

Mantenha apenas os k tokens mais prováveis, zere todo o resto, renormalize, e sorteie entre os sobreviventes.

k = 5, prompt "The capital of France is":

  mantidos:  ' the' 0.28 | ' Paris' 0.19 | ' a' 0.09 |
             ' now' 0.06 | ' one' 0.04
  descartados: os outros 50 252 tokens
  renormaliza para somar 1 e sorteia.

Simples e eficaz. Mas tem uma falha conceitual: k é fixo e a distribuição não é.

6 Top-p (nucleus sampling): corte adaptativo

A solução elegante, disponível como parâmetro nas principais bibliotecas e APIs de geração. Em vez de fixar quantos tokens manter, fixe quanta probabilidade acumulada manter:

  1. Ordene os tokens do mais provável para o menos.
  2. Vá somando as probabilidades.
  3. Pare assim que a soma passar de p (tipicamente 0,9 ou 0,95).
  4. Descarte todo o resto, renormalize, sorteie.
V(p) = menor conjunto tal que   Σx ∈ V(p) P(x) ≥ p O "núcleo" (nucleus) da distribuição. Seu tamanho muda a cada passo, automaticamente.

A medição real, no gpt2 desta máquina

Todos com o mesmo p = 0,9. O tamanho do núcleo varia por um fator de cinco mil.
Contexto1º tokenP(1º)Núcleo p=0,9
"The United States of"" America"0,9661
"It was the best of"" times"0,59745
"The capital of France is"" the"0,0851 503
"He opened the door and saw"" a"0,1611 648
"Yesterday I went to the"" store"0,0235 548

Leia a primeira e a última linha juntas. Em "The United States of" o modelo tem 96,6% de certeza — o núcleo é um único token, e não deveria mesmo haver o que sortear. Em "Yesterday I went to the" ele não faz ideia (o favorito tem 2,3%) — e o núcleo abre para 5 548 tokens, porque qualquer coisa é plausível ali.

Um top_k=50 fixo trataria as duas situações igual: deixaria 49 candidatos ruins na primeira e amputaria a variedade na segunda. O top-p resolve as duas com o mesmo parâmetro, sem ajuste manual. Essa é a sacada inteira.

Um achado lateral que confirma a apostila 06

Repare que "The capital of France is" aparece na faixa de dúvida, com 1 503 tokens de núcleo e o favorito valendo só 8,5%. O gpt2 small genuinamente não é confiante nessa pergunta — o que confirma, por um caminho completamente diferente, o que o logit lens (apostila 05) e o teste de escala (apostila 06) já tinham mostrado. Três medições independentes, a mesma conclusão. É assim que se ganha confiança num resultado.

7 Penalidade de repetição, e as receitas prontas

O repetition_penalty divide o logit de qualquer token já usado, desencorajando repetições. Valores entre 1,1 e 1,2 ajudam bastante em modelos pequenos. Acima de 1,3, o texto fica estranho — o modelo passa a evitar palavras que precisam se repetir, como artigos e preposições.

Receitas que funcionam. Comece por elas antes de inventar.
ObjetivoConfiguraçãoPor quê
Factual / códigodo_sample=Falsedeterminístico e reproduzível; a repetição é um preço aceitável
Uso geraltemperature=0.7, top_p=0.9uma combinação comum; equilibra coerência e naturalidade
Criativotemperature=1.0, top_p=0.95mais variedade sem abrir a cauda longa
GPT-2 pequenotemperature=0.8, top_p=0.9,
repetition_penalty=1.15
o small repete muito; a penalidade compensa
Reproduzir um resultadoqualquer + seed fixoamostragem com semente fixa é determinística
Erro comum: combinar top-k e top-p sem pensar

Bibliotecas costumam aplicar os dois em sequência (primeiro top-k, depois top-p). Se você deixar top_k=50 ligado junto com top_p=0.95, o top-k já cortou em 50 antes de o top-p ter chance de decidir. Nos contextos abertos, onde o núcleo precisaria de 200 tokens, você nunca chega lá. Se você quer top-p de verdade, desligue o top-k (top_k=0).

8 Beam search — e por que não se usa aqui

O beam search mantém b sequências candidatas em paralelo e no fim escolhe a de maior probabilidade total. Ele resolve o problema 1 do greedy (a miopia gulosa), mas piora o problema 2: ao buscar de forma ainda mais eficaz a sequência mais provável, ele produz texto ainda mais previsível e repetitivo.

Por isso beam search é excelente em tradução e sumarização — tarefas onde existe uma resposta certa e você quer encontrá-la — e ruim em geração aberta, onde o objetivo é soar natural. Não use para conversar com o GPT-2.

9 No laboratório

.venv\Scripts\python.exe lab\07_decoding.py
  1. Mostra a distribuição crua do próximo token para um prompt, com os 15 candidatos mais prováveis e suas probabilidades. É a "matéria-prima" que todas as estratégias manipulam.
  2. Aplica cada temperature na mesma distribuição e mostra o achatamento acontecendo, com a entropia medida.
  3. Mede o tamanho do núcleo top-p em contextos certeiros e abertos — a demonstração da adaptatividade.
  4. Gera o mesmo prompt com 6 configurações diferentes, no mesmo modelo, com semente fixa. A diferença entre as saídas é maior do que entre modelos diferentes.
  5. Mede a taxa de repetição (fração de 4-gramas repetidos) de cada estratégia. O greedy vai ficar acima de 50%.

Exercício 7 — preveja antes de rodar

  1. Com logits [4,0 · 2,0 · 1,0], calcule à mão as probabilidades com T=1 e T=2. (Dica: e²≈7,39, e¹≈2,72.) Confirme com o script.
  2. Se p=1,0 no top-p, o que acontece? E se p=0,01?
  3. Por que temperature alta e top_p baixo é uma combinação estranha? O que uma faz que a outra desfaz?
  4. Difícil: a temperature é aplicada nos logits antes do top-p. Isso importa? Considere um caso onde mudar a ordem mudaria o conjunto de tokens sobreviventes.
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. Holtzman, A., Buys, J., Du, L., Fang, M. e Choi, Y. (2020). The Curious Case of Neural Text Degeneration. ICLR 2020. arXiv:1904.09751
  2. Fan, A., Lewis, M. e Dauphin, Y. (2018). Hierarchical Neural Story Generation. ACL 2018. arXiv:1805.04833

Já sabemos como o modelo prevê e como escolhemos entre as previsões.
A apostila 08 volta uma etapa: o que exatamente ele aprendeu, e como se mede isso com um número só.