19

Predecir la siguiente palabra

¿Cómo puede escribir un ensayo algo que solo predice palabras?

11 minRuta ejecutiva

Predecir la siguiente palabra

Con voz. Puedes pausar y saltar a cualquier paso.

Lección completa

Subtítulos

Escribe «el cielo es» y detente. ¿Qué palabra sigue? Seguro pensaste en «azul». Tal vez en «gris».

Voz

Sin voz: la lección avanza sola con subtítulos.

La voz de esta lección está en preparación: por ahora avanza sola con subtítulos.

0:00 / 0:00

Qué lograrás

  • Explicar cómo escribe un modelo de lenguaje: da una probabilidad a cada palabra que puede seguir, elige una, la agrega al contexto y repite.
  • Calcular probabilidades a partir de cuentas y con softmax, y predecir qué hacen la temperatura, top-k y top-p con ellas.
  • Responder con honestidad a «¿cómo escribe un ensayo algo que solo predice?», incluido lo que esa respuesta no garantiza.

Ideas clave

  1. Un modelo de lenguaje da, para un contexto, una probabilidad a cada palabra (o pieza) que puede seguir.
  2. El modelo más simple cuenta: probabilidad = cuenta ÷ total. Las redes neuronales dan puntajes, y softmax los convierte en probabilidades que suman uno.
  3. Escribe en bucle: elige una palabra, la agrega al contexto y vuelve a calcular. Eso es autorregresión.
  4. Elegir siempre la más probable (voraz) cae en repeticiones; sortear da textos distintos en cada corrida. La temperatura afila (baja) o aplana (alta) las probabilidades; top-k y top-p recortan las palabras raras.
  5. Predecir bien exige capturar mucho, pero la meta es lo probable, no lo verdadero. De GPT-1 a GPT-3 el objetivo es el mismo; cambia la escala.

Lo que mucha gente cree

Creencia común Como solo predice la siguiente palabra, un modelo de lenguaje es un autocompletar que copia frases que ya vio.

Lo correcto Calcula una distribución nueva para cada contexto y puede escribir frases que nunca leyó (hasta nuestro modelo de ocho frases lo hace). Acertar a gran escala exige capturar gramática, datos y patrones de razonamiento. Eso sí: optimiza lo probable, no lo verdadero.

Compruébalo

Cuatro preguntas. Sin nota ni cuenta: sirven para ver si la idea quedó.

Concepto¿Qué calcula un modelo de lenguaje en cada paso de la escritura?
ConceptoSi subes mucho la temperatura antes del softmax, ¿qué le pasa a la distribución?
CálculoUna red da dos puntajes: 0.7 y −0.7. Como en la lección, la exponencial los vuelve 2 y 0.5. ¿Qué probabilidad da softmax a la primera palabra?
AplicaciónUn equipo usa un modelo para extraer cifras de contratos y obtiene resultados distintos en cada corrida. ¿Qué conviene revisar primero?

Por dentroPara quien quiere las fórmulas y el código. No hace falta para seguir el curso.

El objetivo: predecir la siguiente pieza

Por la regla de la cadena, la probabilidad de un texto x1,…,xnx_1,\dots,x_n se descompone en predicciones de la siguiente pieza:

P(x1,…,xn)=∏t=1nP(xt∣x1,…,xt−1)P(x_1,\dots,x_n)=\prod_{t=1}^{n}P(x_t\mid x_1,\dots,x_{t-1})

Un modelo de lenguaje es cualquier modelo de P(xt∣x<t)P(x_t\mid x_{<t}). GPT-1 se entrena maximizando ∑tln⁡Pθ(xt∣xt−k,…,xt−1)\sum_t \ln P_\theta(x_t\mid x_{t-k},\dots,x_{t-1}) sobre un corpus, el «objetivo estándar de modelado de lenguaje» (ecuación 1 del artículo), donde kk es el tamaño de la ventana de contexto. Equivale a minimizar la entropía cruzada L=−1n∑tln⁡pθ(xt∣x<t)L=-\tfrac1n\sum_t \ln p_\theta(x_t\mid x_{<t}). Generar es el camino inverso: xt∼P(⋅∣x<t)x_t\sim P(\cdot\mid x_{<t}), una pieza a la vez (autorregresión).

Contar: el modelo de n-gramas

Con una ventana de n−1n-1 piezas, la estimación de máxima verosimilitud es la frecuencia relativa:

P(w∣c)=N(c,w)N(c)P(w\mid c)=\frac{N(c,w)}{N(c)}

donde N(c,w)N(c,w) cuenta cuántas veces ww siguió al contexto cc. En la lección (n=2n=2, bigramas), «es» aparece N=8N=8 veces y N(es,azul)=4N(\text{es},\text{azul})=4, así que P=4/8=0.5P=4/8=0.5. Shannon (1948) ya generaba texto así: su «aproximación de segundo orden por palabras» elige cada palabra según las frecuencias de transición desde la anterior. El límite es la dispersión: con un vocabulario de tamaño VV hay hasta V n−1V^{\,n-1} contextos, casi todos raros o nunca vistos, y la tabla no generaliza. Bengio et al. (2003) propusieron cambiarla por una red que aprende un vector por palabra: si «perro» y «gato» tienen vectores parecidos, lo aprendido de una frase se extiende a la otra.

Softmax y temperatura

Una red produce un puntaje ziz_i (en inglés, logit) por cada pieza ii del vocabulario. La probabilidad es

pi=ezi/T∑jezj/Tp_i=\frac{e^{z_i/T}}{\sum_j e^{z_j/T}}

Con T=1T=1 es el softmax de siempre. Sumar la misma constante a todos los puntajes no cambia nada; por eso los puntajes de la lección, zi=ln⁡ci−ln⁡2z_i=\ln c_i-\ln 2 (cuentas 4,2,1,14,2,1,1; en pantalla, redondeados: 0.7, 0, −0.7, −0.70.7,\,0,\,-0.7,\,-0.7), dan exactamente cuenta ÷ total. En general, con zi=ln⁡ciz_i=\ln c_i queda pi=ci1/T/∑jcj1/Tp_i=c_i^{1/T}/\sum_j c_j^{1/T}: con T=0.5T=0.5, azul vale 16/22≈0.72716/22\approx0.727; con T=2T=2, 2/(2+2+1+1)≈0.3692/(2+\sqrt2+1+1)\approx0.369; con T=0.25T=0.25, 256/274≈0.934256/274\approx0.934. Si T→0T\to0 toda la masa va a la pieza de mayor puntaje (voraz); si T→∞T\to\infty la distribución tiende a la uniforme. El nombre viene de la física estadística: la distribución de Boltzmann tiene esta misma forma, con la temperatura dividiendo. Con este papel aparece, por ejemplo, en la destilación de conocimiento (Hinton et al., 2015).

Top-k y top-p

Tras el softmax se puede recortar. Top-k (Fan et al., 2018, que muestrean entre las k=10k=10 más probables) conserva las kk piezas más probables. Top-p, o muestreo de núcleo (Holtzman et al., 2020), conserva el conjunto más pequeño V(p)V^{(p)} cuya probabilidad suma al menos pp:

∑x∈V(p)P(x∣x<t)≥p\sum_{x\in V^{(p)}}P(x\mid x_{<t})\ge p

Luego se reparte de nuevo, qi=pi/∑j∈V(p)pjq_i=p_i/\sum_{j\in V^{(p)}}p_j, y se sortea con qq. Holtzman et al. observaron que los métodos que maximizan la probabilidad al generar producen texto «soso, incoherente o atrapado en ciclos repetitivos» (el ciclo voraz de la lección), y que recortar la cola poco fiable, sin llegar a lo voraz, da texto más parecido al humano.

En código

El modelo de la lección: contar pares, softmax con temperatura, top-p y escritura voraz, con la salida que imprime:

import math
from collections import Counter, defaultdict

texto = ("el cielo es azul . el mar es azul . el cielo es gris . el sol es grande . "
         "de noche el cielo es oscuro . el cielo es azul y el sol brilla . "
         "el mar es gris . hoy el cielo es azul .")
piezas = texto.split()

# 1. Contar qué pieza sigue a cada pieza (un modelo de bigramas)
tabla = defaultdict(Counter)
for a, b in zip(piezas, piezas[1:]):
    tabla[a][b] += 1

def softmax(puntajes, T=1.0):
    z = [s / T for s in puntajes]
    m = max(z)
    e = [math.exp(v - m) for v in z]    # restar el máximo no cambia el resultado
    return [v / sum(e) for v in e]

def distribucion(contexto, T=1.0, top_p=1.0):
    palabras = [w for w, _ in tabla[contexto].most_common()]
    puntajes = [math.log(c) for _, c in tabla[contexto].most_common()]   # puntaje = ln(cuenta)
    p = softmax(puntajes, T)
    nucleo, acum = [], 0.0               # top-p: las más probables hasta juntar top_p
    for w, q in zip(palabras, p):
        nucleo.append((w, q)); acum += q
        if acum >= top_p - 1e-9: break
    total = sum(q for _, q in nucleo)
    return [(w, round(q / total, 3)) for w, q in nucleo]   # repartir de nuevo

print(dict(tabla["es"]))
for T in (1.0, 0.5, 2.0):
    print(T, distribucion("es", T))
print(distribucion("es", top_p=0.7))

# 2. Escribir: tomar siempre la más probable (voraz) y repetir
escrito = ["el", "cielo", "es"]
for _ in range(9):
    escrito.append(tabla[escrito[-1]].most_common(1)[0][0])
print(" ".join(escrito))
# {'azul': 4, 'gris': 2, 'grande': 1, 'oscuro': 1}
# 1.0 [('azul', 0.5), ('gris', 0.25), ('grande', 0.125), ('oscuro', 0.125)]
# 0.5 [('azul', 0.727), ('gris', 0.182), ('grande', 0.045), ('oscuro', 0.045)]
# 2.0 [('azul', 0.369), ('gris', 0.261), ('grande', 0.185), ('oscuro', 0.185)]
# [('azul', 0.667), ('gris', 0.333)]
# el cielo es azul . el cielo es azul . el cielo

El texto es propio de la lección y sus versiones en español e inglés son paralelas palabra por palabra, así que las cuentas coinciden en los dos idiomas. La escena usa este mismo modelo (lm.ts) y lo comprueba verify-data.ts, ambos en la carpeta de la lección.

Escala: GPT-1, GPT-2 y GPT-3

Los tres son transformers de solo decodificador entrenados con el objetivo de arriba. GPT-1 (2018) leyó BooksCorpus, más de 7 000 libros inéditos; su tamaño, 117 millones de parámetros, figura en la tabla 2 del artículo de GPT-2 («el modelo más pequeño equivale al GPT original»). GPT-2 (2019) llegó a 1 542 millones y leyó WebText, algo más de 8 millones de documentos (40 GB de texto). GPT-3 (2020) tiene 175 000 millones. Un dato curioso: el artículo de GPT-3 cuenta 125 millones para un modelo con la misma forma que GPT-1 (12 capas de 768). La diferencia cuadra con la tabla de embeddings, que crece con el vocabulario: GPT-1 usó 40 000 fusiones de BPE y GPT-2 amplió el vocabulario a 50 257 piezas.

Lo que viene

Dijimos «palabras», pero el modelo trabaja con piezas: los tokens (lección 20). La probabilidad la calcula una red que mira todo el contexto con atención (lecciones 21 y 22), y qué significa entrenarla con casi todo internet se ve en la lección 23.

Lente de decisión

Qué significa esta idea si tu trabajo es decidir, no programar.

  • La salida es probabilística: la misma pregunta puede dar respuestas distintas. Para tareas con una respuesta correcta (extraer datos, clasificar) busca poca variación; para ideas y borradores, la variación ayuda.
  • Bajar la temperatura vuelve la respuesta más repetible, no más veraz: un error probable sigue siendo probable. Ningún parámetro sustituye verificar contra las fuentes.
  • Pregunta qué parámetros de muestreo (temperatura, top-p) usa tu aplicación y si puedes fijarlos; no todos los productos los muestran.
  • Una prueba con una sola corrida no es evidencia. Repite cada caso varias veces con la configuración real y mide cuánto varía antes de decidir.

Términos de la lección

Transcripción completa
ComentariosConversación pública de esta lección: dudas, datos por revisar, ideas.

Los comentarios viven en GitHub Discussions, en el repositorio público del curso; para escribir se necesita una cuenta de GitHub. Se cargan desde giscus.app al abrir esta sección. Las personas que revisan el curso los leen, y si un cambio se acepta, se aplica en los dos idiomas. Abrir el hilo en GitHub

Fuentes