Skip to content

English · Español

Lab 03 — Diversidad vs precisión

🇪🇸 El compromiso central del muestreo: subir τ aumenta diversidad pero degrada corrección. Mide ambos sobre el corpus de conjugaciones de §A13 y dibuja la curva. La forma de "L" o "rodilla" es la firma del trade-off.

Objetivo

Para un conjunto fijo de prompts del corpus de verbos §A13, medir cómo se compensan diversidad de salida y corrección gramatical al variar el parámetro del sampler. Producir la curva "diversidad vs corrección" que motiva la elección de un sampler en producción.

Setup

  • Los cuatro samplers de los labs 00-02: Greedy, Temperature, TopK, TopP.
  • La tabla de verdad de conjugaciones §A13: un dict que mapea (verb, tense, person) → forma inglesa esperada. (Lo construiste en la Fase 12. Si todavía no es un recurso programático, escríbelo como data/verb_corpus_truth.json para este lab.)
  • Una lista de 10 prompts de test, uno por combinación (tense × person). Ejemplos:
  • "Yesterday I" → esperado: cualquier forma en pasado de un verbo de nuestro set de 20.
  • "Tomorrow she" → esperado: cualquier forma en futuro (will / going to), tercera persona del singular.
  • "He" → esperado: cualquier forma de presente en tercera persona del singular (con -s).

Tareas

  1. Define el scorer de gramaticalidad.
def is_grammatical(prompt: str, completion: str, truth: dict) -> bool:
    """Returns True iff (prompt + completion) matches a valid §A13 conjugation."""
    # ...

La comprobación: divide (prompt + completion) en (sujeto, forma-verbal); verifica que el tiempo de la forma-verbal coincide con el tiempo esperado del prompt y que la persona coincide. Usa la tabla de verdad.

Para prompts ambiguos donde varios tiempos son válidos (p. ej., "He" pelado), acepta cualquier forma válida en presente, tercera persona del singular.

  1. Define la métrica de diversidad.
def diversity(completions: list[str]) -> float:
    """Fraction of unique completions: |unique| / |total|."""
    return len(set(completions)) / len(completions)
  1. Barre Temperature(τ). Para cada τ ∈ {0.1, 0.3, 0.5, 0.7, 1.0, 1.5, 2.0, 3.0}:
  2. Para cada uno de los 10 prompts:
    • Genera 50 completados, uno por seed.
    • Calcula la diversidad (por prompt) y la tasa de gramaticalidad (por prompt).
  3. Promedia sobre los prompts → (diversity[τ], grammaticality[τ]).
  4. Grafica un único punto en el espacio (diversidad, gramaticalidad).

  5. Barre TopP(p) con τ = 1.0 fijo. Para cada p ∈ {0.5, 0.7, 0.9, 0.95, 0.99, 1.0}:

  6. Mismo procedimiento que en la tarea 3.
  7. Grafica.

  8. La composición. Prueba Temperature(τ) ∘ TopP(p) en una rejilla pequeña (p. ej., τ ∈ {0.7, 1.0}, p ∈ {0.9, 0.95}). Esta es la receta que usan la mayoría de samplers de producción.

  9. Encuentra la rodilla. Grafica todos los puntos sobre unos mismos ejes (diversidad, gramaticalidad). La "rodilla de la curva" — donde la gramaticalidad empieza a caer bruscamente — es la configuración del sampler que enviarías a producción. Para el Mini-GPT entrenado sobre el corpus §A13, se espera la rodilla en torno a τ ≈ 1.0 a 1.5 con p = 0.9. Anota dónde la ves.

Mediciones

Guarda en experiments/<date>-phase-21-diversity/:

  • diversity_vs_accuracy.png — el scatter plot, con cada configuración del sampler como punto etiquetado.
  • temperature_curve.png — el corte a lo largo de Temperature(τ).
  • topp_curve.png — el corte a lo largo de TopP(p).
  • completions_sample.json — para cada configuración del sampler, guarda 5 completados de ejemplo por prompt (para spot-checking).
  • manifest.json — seeds, prompts, hash del checkpoint del modelo, rejilla exacta del barrido.

Aceptación

  • El barrido de Temperature produce una curva de gramaticalidad monótonamente no-creciente al crecer τ (más frío = más correcto).
  • El barrido de Temperature produce una curva de diversidad monótonamente no-decreciente al crecer τ.
  • Greedy se sitúa en la esquina (diversity ≈ 0, grammaticality ≈ max) del scatter plot. (Si no, tu greedy decoding está roto — vuelve al lab 00.)
  • Temperature(τ=2.0) es visiblemente peor en gramaticalidad que Temperature(τ=0.7). Si no lo es, el modelo está tan confiado que la temperatura apenas importa — investígalo.
  • El PR / report incluye una frase eligiendo una configuración del sampler como el "default de producción" para el tutor de la Fase 32, con una justificación anclada en el plot.

Trampas

  • La diversidad sobre-cuenta variación trivial. "He works." vs "He works ." (espacio extra) no son realmente distintos. Normaliza el whitespace antes de calcular el conjunto único.
  • Puntuar la gramaticalidad es difícil. El corpus §A13 es suficientemente pequeño como para que puedas enumerar todas las formas válidas — usa la tabla de verdad, no heurísticas. Las heurísticas aceptarán silenciosamente "He worked yesterday" (que es inglés gramatical pero no coincide con la expectativa de tiempo del prompt).
  • Tamaño de muestra. 50 completados por (prompt, sampler) es justo lo justo — la estimación de diversidad tiene varianza alta para τ bajo. Si un resultado parece ruidoso, sube a 100 o 200.
  • Leer mal la curva. Más diversidad Y más gramaticalidad a la vez no es posible — están en ejes distintos. La rodilla es el punto del compromiso. Cualquier cosa más cerca de la esquina superior derecha es mejor, pero la esquina superior derecha en sí es inalcanzable para un modelo de capacidad finita.
  • No sobreajustes el sampler a este lab. La curva del trade-off es dependiente del prompt. Elige el sampler que gane en líneas generales, no solo en "Tomorrow she".

Stretch

  • Grafica la misma curva para nucleus + temperature combinados. ¿Mueve la composición la rodilla?
  • Desglose por tiempo. ¿Es peor el trade-off para el pasado (más formas irregulares) que para el presente (sobre todo -s regular)?

Siguiente: Escribe el PHASE_21_REPORT.md atando estos resultados. Luego, a la Fase 22 (KV cache).