Skip to content

English · Español

Break — top-p con p=1.0 vs p=0.95 vs p=0.5 sobre el tutor de gramática §A13

🇪🇸 No es un solo break — son tres configuraciones, cada una "rota" de una manera distinta. La práctica es: misma seed, mismo modelo, mismos prompts, tres valores de p. La diversidad colapsa o se desborda según p; observamos la frontera entre creatividad útil y ruido inservible.


Síntoma que verá Borja

Tres ejecuciones de generación con seed, modelo y prompts idénticos (10 prompts de data/eval/probes.jsonl, cada uno pidiendo una continuación). Solo cambia top_p:

  • Ejecución A: top_p = 1.0 (sin truncamiento).
  • Ejecución B: top_p = 0.95 (la recomendada).
  • Ejecución C: top_p = 0.5 (truncamiento agresivo).

Para el prompt She has wri___ (respuesta canónica: written):

Ejecución Muestra 1 Muestra 2 Muestra 3
A (p=1.0) written writes werder (!)
B (p=0.95) written written writes
C (p=0.5) written written written

Para el prompt I want to ___ tomorrow (canónico: cualquier verbo en infinitivo del conjunto; varios válidos):

Ejecución Muestra 1 Muestra 2 Muestra 3
A (p=1.0) play study qzz (!)
B (p=0.95) play work study
C (p=0.5) play play play

El patrón: A admite tokens basura; C no admite diversidad; B enhebra la aguja.

A continuación se evalúa CCR (tasa de corrección de conjugación) sobre las 60 probes de validación:

Ejecución CCR Diversidad (salidas únicas / prompt)
A 76% 8.4 / 10
B 88% 3.7 / 10
C 91% 1.0 / 10

A tiene alta diversidad pero las salidas basura arrastran el CCR hacia abajo. C tiene un colapso perfecto a greedy. B es el punto dulce — CCR ligeramente menor que C, pero la diversidad desbloquea el comportamiento útil de "el tutor puede proponer varias correcciones plausibles" que necesita el agente tutor de gramática (Fase 32).

El break, mecánicamente

En experiments/21-break-top-p/config.yaml:

runs:
  - name: A
    top_p: 1.0
  - name: B
    top_p: 0.95
  - name: C
    top_p: 0.5

O directamente en código, en src/miniinfer/sample.py:

def top_p_filter(logits, p):
    if p >= 1.0:
        return logits   # no filter
    # ... normal top-p ...

El "break" es configuración, no código. Cada valor de p está roto de manera distinta:

  • \(p = 1.0\) está roto porque no filtra nada.
  • \(p = 0.5\) está roto porque filtra demasiado agresivamente.
  • \(p = 0.95\) es correcto.

Por qué esto enseña el concepto

El tutor de gramática (Fase 32) no es solo un modelo de "predice el siguiente token". Debe:

  1. Identificar si una frase tiene un error gramatical.
  2. Si lo tiene, proponer una corrección.
  3. Ser capaz de proponer varias alternativas plausibles cuando la corrección es ambigua (p. ej., "I work yesterday" podría corregirse como "I worked yesterday" o "I was working yesterday").

Para (3), el tutor necesita diversidad. Greedy (o \(p = 0.5\) sobre una distribución segura) da una sola sugerencia, y el tutor no puede ofrecer alternativas. Pero para (1) y (2), el tutor necesita corrección — la sugerencia debe ser una forma legítima del inglés, no un token BPE aleatorio.

La distribución §A13 lo hace concreto. Para She has wri___:

  • Los tokens con mayor probabilidad son: tten, tes, ting, te, t, tt, ...
  • tten completa a written (participio pasado correcto).
  • tes completa a writes (presente 3sg correcto — pero erróneo para este prompt, porque has lo convierte en participio pasado).
  • ting completa a writing (gerundio — erróneo aquí, pero inglés válido).
  • te y por debajo son mayoritariamente ruido.

\(p = 0.95\) conserva los 4 primeros (acumulado 0.9701). El tutor puede proponer written (correcto), writes (cerca pero erróneo), writing (cerca pero erróneo) — y el aprendiz aprende al ver las alternativas.

\(p = 1.0\) admite werder (un fragmento BPE basura) dentro del conjunto candidato. El tutor a veces lo sugiere. Ahora el usuario ve un sinsentido y pierde la confianza.

\(p = 0.5\) conserva solo tten. El tutor propone solo written. Correcto, pero pedagógicamente más pobre.

Escalera diagnóstica que Borja debe recorrer

  1. Primera comprobación: la columna de diversidad. La ejecución A es 8.4, la C es 1.0. La diversidad debería ser una función no decreciente de \(p\).
  2. Segunda comprobación: inspección a nivel de muestra. Lee las terceras muestras de la ejecución A. Los tokens basura (werder, qzz) son obvios. Son completados de tokens de cola que \(p = 1.0\) admitió.
  3. Tercera comprobación: CCR. El CCR de la ejecución A es 76%, menor que el CCR real del modelo en greedy (~91%). Las salidas basura lo están arrastrando.
  4. Diagnóstico: \(p = 1.0\) admite tokens de cola a los que el modelo asigna poca probabilidad (es decir, el modelo "sabe que son improbables") pero que el sampler escoge de vez en cuando. El arreglo es cortar la cola.

Reproductor

just phase-21-generate top_p=1.0  > experiments/21-A/
just phase-21-generate top_p=0.95 > experiments/21-B/
just phase-21-generate top_p=0.5  > experiments/21-C/

# Score
just phase-21-score experiments/21-A experiments/21-B experiments/21-C

Cascada de pistas

  1. (Suave) "Las tres ejecuciones producen cifras de diversidad muy distintas. ¿Cuál es la relación entre p y la diversidad?"
  2. (Media) "La ejecución A produce ocasionalmente tokens que parecen basura. ¿Por qué puede pasar eso aunque el modelo asigne baja probabilidad a esos tokens?"
  3. (Directa) "Top-p con p = 1.0 no filtra nada. La cola de la distribución se muestrea de vez en cuando. ¿Cuál es el arreglo?"

Arreglo

Usa \(p = 0.95\) para la generación en el tutor de gramática §A13. Confirma que el CCR vuelve a subir a ~88% y que la diversidad se mantiene en 3.7 (el medio productivo).

Para tareas donde la diversidad debería ser menor (p. ej., un autocompletado con confianza acotada), usa \(p = 0.7\) o incluso \(p = 0.5\). Para tareas donde la diversidad debería ser mayor (p. ej., escritura creativa, continuación de historias), usa \(p = 0.97\). El tutor de gramática §A13 está en el medio.

Lo que este break NO es

  • No es un bug del modelo — la softmax del modelo es idéntica en todas las ejecuciones.
  • No es un bug del tokenizer — se producen los mismos tokens.
  • No es un bug matemático de probabilidades — el código de top-p es correcto en todas las ejecuciones.

Es un bug de configuración que demuestra el efecto conductual del hiperparámetro de muestreo (sampling). El movimiento pedagógico: cambiar una sola perilla en tres ejecuciones y dejar que el cuadro de mando te enseñe lo que hace la perilla. La Fase 21 es el lugar más limpio del currículo para hacer esto — el modelo está fijo, solo cambia el sampler.

Referencias cruzadas

  • theory/04-top-p-worked-example.md — las matemáticas.
  • theory/02-top-k-and-top-p.md — variante top-k.
  • Fase 32 — uso en producción de estos ajustes.