Conceptos de IA en Python

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

Ejecutar código →
main.py
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.

  1. Cambia las entradas o los pesos y predice la salida antes de ejecutar.
  2. Imprime los valores intermedios para seguir cada paso del cálculo.
  3. Resuelve los retos enlazados abajo para implementar la idea por tu cuenta.
Ejecutar en el IDE de Python →

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.

Todos los retos