Generation
Passo 7 de 7. Entra: os 12 logits da última linha (passo 6). Sai: um token, anexado à entrada; depois o caminho inteiro roda de novo, até o modelo escrever <|endoftext|>. No fim os ids voltam a ser texto: "o gato subiu no telhado." ← A saída · próximo: O que mudou desde 2017 →
Escolhendo o próximo token: temperatura, top-k, top-p
O trabalho do modelo termina nos logits \(z\), um por token do vocabulário. Transformá-los em texto é uma decisão separada, com controles próprios: é a parte em que quem usa um modelo de fato mexe.
- A temperatura \(T\) divide os logits antes do softmax. Com logits \([2, 1, 0]\), \(T = 1\) dá \([0{,}67;\ 0{,}24;\ 0{,}09]\) e \(T = 0{,}5\) dá \([0{,}87;\ 0{,}12;\ 0{,}02]\): uma temperatura menor aumenta as distâncias. \(T \to 0\) é a decodificação gulosa (sempre o token do topo); \(T \to \infty\) é a distribuição uniforme.
- O top-k1 mantém os \(k\) tokens mais prováveis, renormaliza e sorteia entre eles.
- O top-p2 (nucleus) mantém o menor conjunto cujas probabilidades somam \(p\). Ao contrário do top-k, o tamanho dele acompanha a confiança do modelo: no GPT-2, depois de "…the 44th President of the United" o top-p 0,9 mantém 1 token (
States, 0,998); depois de "Once upon a time, there was a" mantém 3651.
A decodificação gulosa não é o padrão seguro que parece: ela tende a entrar em laço, repetindo uma frase que foi provável uma vez e por isso volta a ser provável2. No outro extremo, uma temperatura alta sem filtro dá à cauda longa de 50.257 tokens massa suficiente para vencer — o GPT-2 com \(T = 2\) produz ruído. Os ajustes de produção ficam no meio (temperatura abaixo de 1 e um corte de top-p ou top-k) e o laboratório mede todos eles no mesmo prompt.
Verifique você mesmo — a temperatura muda qual token é o mais provável?
Não. Dividir todos os logits pelo mesmo \(T\) positivo mantém a ordem, então o argmax — e a decodificação gulosa — é o mesmo em qualquer temperatura. O que muda é quanta massa os outros tokens recebem e, portanto, com que frequência a amostragem os escolhe.
No exemplo
Os logits da última linha, \(z\), estão na página da saída. Dividindo-os por \(T\) antes do softmax:
| \(T\) | ␣telhado | ␣muro | ␣sofá | ␣chão | ␣gato |
|---|---|---|---|---|---|
| 0,5 | 0,761 | 0,097 | 0,039 | 0,036 | 0,019 |
| 1 | 0,395 | 0,141 | 0,089 | 0,086 | 0,062 |
| 2 | 0,208 | 0,124 | 0,098 | 0,097 | 0,082 |
- O guloso (\(T \to 0\)) escreve
␣telhado, sempre. - O top-k = 2 fica com
␣telhadoe␣muroe divide pelo que os dois somam: \(0{,}395 / (0{,}395 + 0{,}141) = 0{,}737\) e \(0{,}263\). - O top-p = 0,9 com \(T = 1\): as somas acumuladas são 0,395; 0,537; 0,626; 0,712; 0,774; 0,832; 0,881; 0,931. O menor conjunto que chega a 0,9 tem 8 dos 12 tokens — a distribuição do brinquedo é achatada e até
␣noeiuficam. - \(T = 0{,}7\) com top-p 0,9, um ajuste comum em produção (o laboratório de LLMs amostra com ele): ficam 6 tokens, renormalizados para
␣telhado0,626,␣muro0,144,␣sofá0,074,␣chão0,071,␣gato0,044,␣cão0,040. Para sortear um, tome um número aleatório uniforme \(u\) e percorra a soma acumulada (0,626; 0,770; 0,845; 0,916; 0,960; 1): \(u = 0{,}5\) cai em␣telhado, \(u = 0{,}8\) em␣sofá— "o gato subiu no sofá", uma frase perfeitamente boa que o modelo também considerou.
Anexar e rodar de novo
Digamos que o sorteio deu ␣telhado, id 6. A entrada vira [0, 2, 4, 5, 1, 6] e o caminho inteiro roda de novo, agora com seis tokens. A máscara causal faz as linhas 1 a 5 saírem exatamente como antes (os tokens antigos nunca olham para o novo); por isso um modelo não as recalcula: guarda as chaves e os valores delas (o cache de KV) e calcula só a linha nova:
- \(x_6 = E[6] + P_6 = [0; -0{,}5; 1; -0{,}5] + [0{,}5; 0; 0; -0{,}5] = [0{,}5; -0{,}5; 1; -1]\) e \(u_6 = [0{,}632; -0{,}632; 1{,}265; -1{,}265]\);
- a query dela, \(q_6 = [u_4, u_2 \mid u_4, u_1] = [-1{,}265; -0{,}632 \mid -1{,}265; 0{,}632]\), contra as seis chaves (cinco do cache, uma nova): a cabeça 1 põe 0,40 no próprio
␣telhadoe 0,28 em␣gato; a cabeça 2 se espalha poro,iue␣no; - passando pelo bloco e pela camada de saída, a nova última linha prevê
.com 0,538 (depois␣sub0,168).
Anexe . (id 10) e rode mais uma vez: <|endoftext|> vem primeiro, com 0,401. É o jeito de o modelo dizer que o texto acabou; a geração para aí, ou num comprimento máximo, o que vier antes.
| passo | ids de entrada | mais provável a seguir | \(p\) |
|---|---|---|---|
| 1 | [0, 2, 4, 5, 1] | ␣telhado (6) | 0,395 |
| 2 | [0, 2, 4, 5, 1, 6] | . (10) | 0,538 |
| 3 | [0, 2, 4, 5, 1, 6, 10] | <|endoftext|> (11) | 0,401 |
Cada passo custa uma linha de trabalho em vez de uma passagem inteira: no brinquedo o cache guarda 8 números por token (2 para K e V × 1 camada × 2 cabeças × 2), no GPT-2 small 18.432.
De volta ao texto
Destokenizar é uma consulta e uma concatenação: cada id vira o seu pedaço, os pedaços são colados e o token especial é descartado.
[0, 2, 4, 5, 1, 6, 10] → o ␣gato ␣sub iu ␣no ␣telhado . → "o gato subiu no telhado."
No GPT-2 os pedaços são bytes e um caractere fora do ASCII pode ficar dividido entre dois tokens ("ã" são dois bytes e um token pode guardar só o primeiro); o decodificador junta os bytes primeiro e só os transforma em caracteres quando um caractere está completo. É por isso que uma interface de chat às vezes segura um token antes de mostrá-lo.
O painel roda o passo inteiro, linha a linha: temperatura, top-k, top-p, o sorteio, o anexar e a rodada seguinte, com a previsão da linha nova. Teste os casos e depois mexa em \(u\) para ver qual token vence.
Verifique você mesmo — com T = 0,7 e top-p = 0,9, quais valores de u dão ␣sofá?
A soma acumulada vale 0,626 depois de ␣telhado, 0,770 depois de ␣muro e 0,845 depois de ␣sofá. Qualquer \(u\) de 0,770 até 0,845 (sem incluir) cai em ␣sofá: uma probabilidade de 0,074, a probabilidade renormalizada de ␣sofá — que é exatamente a ideia do sorteio.
← A saída · próximo: O que mudou desde 2017 →
-
Fan, A., Lewis, M., & Dauphin, Y. (2018). Hierarchical Neural Story Generation — ACL. Amostragem top-k. ↩
-
Holtzman, A., Buys, J., Du, L., Forbes, M., & Choi, Y. (2020). The Curious Case of Neural Text Degeneration — ICLR. Por que a decodificação gulosa entra em laço e a amostragem top-p (nucleus). ↩↩