Cómo generan texto los modelos de lenguaje: temperatura y top-k en Python
Un modelo de lenguaje da una puntuación (logit) a cada posible token siguiente. Los ajustes de muestreo deciden cómo esas puntuaciones se convierten en una elección; la temperatura controla el azar y top-k solo conserva los mejores candidatos.
El concepto en palabras sencillas
Un modelo de lenguaje da una puntuación (logit) a cada posible token siguiente. Los ajustes de muestreo deciden cómo esas puntuaciones se convierten en una elección; la temperatura controla el azar y top-k solo conserva los mejores candidatos.
Mira cómo elige un modelo de lenguaje el siguiente token: layer normalization, temperatura y muestreo top-k en Python puro.
Ideas clave
- Una temperatura menor que 1 hace la salida más predecible; mayor que 1, más creativa.
- El muestreo top-k elimina los tokens poco probables para que el texto no se salga del tema.
- El texto se genera token a token, y cada token nuevo vuelve a la entrada.
- La layer normalization mantiene los valores en un rango estable al atravesar muchas capas.
¿Cuándo se utiliza?
- Entender qué pasa dentro de las redes neuronales y las bibliotecas de IA.
- Aprender la idea antes de implementarla en los retos correspondientes.
- Prepararte para cursos de aprendizaje automático, entrevistas y proyectos.
Pruébalo en acción
Pulsa el dado para elegir la siguiente palabra. Baja la temperatura o top-k para que la elección sea más predecible.
Código de ejemplo
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))
Resultado esperado
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']
Cómo funciona
layer_norm() reescala un vector a media 0 y varianza 1, como hacen los Transformers dentro de cada bloque. probabilities() divide los logits entre la temperatura y aplica softmax, así que una temperatura baja hace más probable la mejor palabra. Top-k pone casi en −∞ todas las puntuaciones fuera de las k mejores antes del softmax.
Cambia los valores y ejecuta el programa en el compilador Python online de CodeUtility sin instalar Python.
Ejercicios prácticos
Modifica las entradas y prueba casos límite antes de usar conjuntos de datos mayores.
- Cambia las entradas o los pesos y predice la salida antes de ejecutar.
- Imprime los valores intermedios para seguir cada paso del cálculo.
- Resuelve los retos enlazados abajo para implementar la idea por tu cuenta.
Practica con un reto
Usa lo que cubre esta lección para resolver un problema real. Cada reto se ejecuta en el navegador, con pruebas al instante y una revisión de IA.
- Normalización de capa Normaliza cada fila a media 0 y varianza 1, y luego escala y desplaza, como hace cada bloque Transformer. Intermedio
- Muestreo con temperatura y top-k Elige el siguiente token como un modelo de lenguaje: conserva los k logits más altos, aplica la temperatura y muestrea. Intermedio