¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Muestreo, temperatura y top-k

Después de esta lección: Puedo elegir el token siguiente con decodificación voraz, temperatura y top-k.

Lección de 55 min1 comandoLaboratorio JupyterLab de ciencia de datos: pandas, Matplotlib y scikit-learn en el navegador

Por qué la misma pregunta recibe otra respuesta

El muestreo es la forma en que un modelo de lenguaje elige su token siguiente a partir de sus probabilidades. La temperatura y el top-k son los ajustes que dan forma a esa elección. Por eso la misma instrucción puede dar un texto distinto cada vez.

Los números del modelo no cambian entre dos respuestas. Solo cambia la elección.

Al final de esta lección

Nota

Puedo elegir el token siguiente con decodificación voraz, temperatura y top-k.

Palabras clave

PalabraQué significaEjemplo
Decodificación voraztomar siempre el token más probable (greedy en inglés)
Muestreosortear un token según su probabilidad
Temperaturaun número que divide las puntuaciones antes del softmax0.5
Top-kquedarse solo con los k tokens más probablesk = 2
Semillaun número de partida que hace repetir los sorteos
Instrucciónel texto que el modelo continúa (prompt en inglés)

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

La decodificación voraz toma siempre el más probable

Tras «el autobús está», nuestro modelo inventado da puntuaciones a cuatro palabras siguientes. El softmax las convierte en probabilidades.

La decodificación voraz toma siempre el token más probable, aquí lleno. Da el mismo texto cada vez. En un texto largo, a menudo se atasca repitiéndose, porque el paso más probable puede volver al mismo sitio.

Ejemplo resuelto: de puntuaciones a probabilidades

Palabra siguientePuntuacióne elevado a la puntuaciónProbabilidad
lleno320,090,644
parado27,390,237
cerca12,720,087
azul01,000,032

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

La temperatura endurece o aplana la elección

El muestreo sortea un token al azar, cada uno según su probabilidad. Así, lleno sale unas 64 veces de cada 100, y azul unas 3 veces.

La temperatura cambia antes esas posibilidades. Cada puntuación se divide por ella y luego se aplica el softmax. Por debajo de 1, el primer token se vuelve aún más probable. Por encima de 1, las posibilidades se igualan y las palabras raras salen más a menudo.

Ejemplo resuelto: tres temperaturas

Palabra siguienteTemperatura 0,5Temperatura 1Temperatura 2
lleno0,8650,6440,455
parado0,1170,2370,276
cerca0,0160,0870,167
azul0,0020,0320,102

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Mil sorteos con dos temperaturas

Comando
docker exec jupyter python3 -c "import numpy as np; s = np.array([3, 2, 1, 0]); print([np.bincount(np.random.default_rng(7).choice(4, size=1000, p=np.exp(s / t) / np.exp(s / t).sum()), minlength=4).tolist() for t in (1.0, 0.5)])"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

El top-k y la semilla

El top-k se queda solo con los k tokens más probables y reparte otra vez sus posibilidades para que sumen 1. Con k = 2, cerca y azul no pueden salir nunca.

Un sorteo al azar parte de una semilla. La misma semilla da los mismos sorteos, y una semilla nueva da otros. Por eso una instrucción puede dar textos distintos, y por eso una semilla fija hace repetible una prueba.

Ejemplo resuelto: top 2 con temperatura 1

Palabra siguienteProbabilidad¿Se queda?Repartida otra vez
lleno0,644sí0,644 / 0,881 = 0,731
parado0,237sí0,237 / 0,881 = 0,269
cerca0,087no0
azul0,032no0

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Muestrear con una temperatura y una semilla

Código: python
import math
import random

words = ["lleno", "parado", "cerca", "azul"]
scores = [3, 2, 1, 0]      # las puntuaciones del modelo tras «el autobús está»
temperature = 1.0
seed = 1

powers = []
for s in scores:
    powers.append(math.exp(s / temperature))
total = sum(powers)
probs = []
for p in powers:
    probs.append(p / total)
print("probabilidades:", [round(p, 3) for p in probs])

random.seed(seed)
draws = random.choices(words, weights=probs, k=8)
print("ocho sorteos:", draws)
# Pon seed a 2 y pulsa Ejecutar: otros sorteos, las mismas probabilidades.
# Luego pon temperature a 0.3. ¿Qué pasa con los sorteos?

Un error frecuente

Advertencia

Mucha gente piensa que un modelo da otra respuesta porque ha cambiado de opinión o ha aprendido de ti. Sus números son los mismos. La diferencia viene del sorteo al azar, así que una semilla fija y los mismos ajustes dan el mismo texto.

Sobre este laboratorio y su código: Laboratorio JupyterLab de ciencia de datos: pandas, Matplotlib y scikit-learn en el navegador

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.