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
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Decodificación voraz | tomar siempre el token más probable (greedy en inglés) | |
| Muestreo | sortear un token según su probabilidad | |
| Temperatura | un número que divide las puntuaciones antes del softmax | 0.5 |
| Top-k | quedarse solo con los k tokens más probables | k = 2 |
| Semilla | un número de partida que hace repetir los sorteos | |
| Instrucción | el 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 siguiente | Puntuación | e elevado a la puntuación | Probabilidad |
|---|---|---|---|
| lleno | 3 | 20,09 | 0,644 |
| parado | 2 | 7,39 | 0,237 |
| cerca | 1 | 2,72 | 0,087 |
| azul | 0 | 1,00 | 0,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 siguiente | Temperatura 0,5 | Temperatura 1 | Temperatura 2 |
|---|---|---|---|
| lleno | 0,865 | 0,644 | 0,455 |
| parado | 0,117 | 0,237 | 0,276 |
| cerca | 0,016 | 0,087 | 0,167 |
| azul | 0,002 | 0,032 | 0,102 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Mil sorteos con dos temperaturas
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 siguiente | Probabilidad | ¿Se queda? | Repartida otra vez |
|---|---|---|---|
| lleno | 0,644 | sí | 0,644 / 0,881 = 0,731 |
| parado | 0,237 | sí | 0,237 / 0,881 = 0,269 |
| cerca | 0,087 | no | 0 |
| azul | 0,032 | no | 0 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Muestrear con una temperatura y una semilla
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.