Como os modelos de linguagem geram texto: temperatura e top-k em Python
Um modelo de linguagem dá uma pontuação (logit) para cada próximo token possível. As configurações de amostragem decidem como essas pontuações viram uma escolha; a temperatura controla a aleatoriedade e o top-k mantém só os melhores candidatos.
O conceito em palavras simples
Um modelo de linguagem dá uma pontuação (logit) para cada próximo token possível. As configurações de amostragem decidem como essas pontuações viram uma escolha; a temperatura controla a aleatoriedade e o top-k mantém só os melhores candidatos.
Veja como um modelo de linguagem escolhe o próximo token: layer normalization, temperatura e amostragem top-k em Python puro.
Ideias principais
- Uma temperatura abaixo de 1 deixa a saída mais previsível; acima de 1, mais criativa.
- A amostragem top-k remove tokens improváveis para o texto não fugir do assunto.
- O texto é gerado um token por vez, e cada token novo volta para a entrada.
- A layer normalization mantém os valores numa faixa estável ao passar por muitas camadas.
Quando usar?
- Entender o que acontece dentro das redes neurais e das bibliotecas de IA.
- Aprender a ideia antes de implementá-la nos desafios correspondentes.
- Se preparar para cursos de aprendizado de máquina, entrevistas e projetos.
Veja na prática
Clique no dado para sortear a próxima palavra. Diminua a temperatura ou o top-k para a escolha ficar mais previsível.
Código de exemplo
import math
import random
# Layer normalization rescales a vector to mean 0 and variance 1.
def layer_norm(x, eps=1e-5):
mean = sum(x) / len(x)
var = sum((v - mean) ** 2 for v in x) / len(x)
return [(v - mean) / math.sqrt(var + eps) for v in x]
print("layer norm:", [round(v, 3) for v in layer_norm([2.0, 4.0, 6.0, 8.0])])
# Next-token scores from a model; temperature and top-k shape the choice.
words = ["cat", "dog", "car", "sky"]
logits = [2.0, 1.5, 0.3, -1.0]
def probabilities(temperature=1.0, top_k=None):
scores = [l / temperature for l in logits]
if top_k: # keep only the k best scores
cutoff = sorted(scores, reverse=True)[top_k - 1]
scores = [s if s >= cutoff else -1e9 for s in scores]
exps = [math.exp(s - max(scores)) for s in scores]
return [e / sum(exps) for e in exps]
for t, k in [(1.0, None), (0.5, None), (1.0, 2)]:
print(f"temperature={t} top_k={k}:", [round(p, 2) for p in probabilities(t, k)])
random.seed(7)
print("sampled:", random.choices(words, weights=probabilities(0.8, 3), k=5))
Saída esperada
layer norm: [-1.342, -0.447, 0.447, 1.342]
temperature=1.0 top_k=None: [0.54, 0.33, 0.1, 0.03]
temperature=0.5 top_k=None: [0.71, 0.26, 0.02, 0.0]
temperature=1.0 top_k=2: [0.62, 0.38, 0.0, 0.0]
sampled: ['cat', 'cat', 'dog', 'cat', 'cat']
Como funciona
layer_norm() reescala um vetor para média 0 e variância 1, como os Transformers fazem dentro de cada bloco. probabilities() divide os logits pela temperatura e aplica softmax, então uma temperatura baixa deixa a melhor palavra mais provável. O top-k coloca quase em −∞ todas as pontuações fora das k melhores antes do softmax.
Altere os valores e execute o programa no compilador Python online CodeUtility sem instalar Python.
Exercícios práticos
Altere as entradas e teste casos de borda antes de usar conjuntos de dados maiores.
- Mude as entradas ou os pesos e preveja a saída antes de executar.
- Imprima os valores intermediários para acompanhar cada passo do cálculo.
- Resolva os desafios indicados abaixo para implementar a ideia você mesmo.
Pratique com um desafio
Use o conteúdo desta lição para resolver um problema real. Cada desafio roda no navegador, com testes instantâneos e uma revisão por IA.
- Normalização de camada Normalize cada linha para média 0 e variância 1 e depois escale e desloque, como todo bloco Transformer faz. Médio
- Amostragem com temperatura e top-k Escolha o próximo token como um modelo de linguagem: mantenha os k maiores logits, aplique a temperatura e amostre. Médio