Skip to content

English · Español

Lab 01 — Barrido de temperatura

🇪🇸 La temperatura aplana o agudiza la softmax. Aquí lo medimos: para una distribución de logits del Mini-GPT, barre τ y grafica la entropía. Debe ser monotónicamente no-decreciente. Si no lo es, hay un bug.

Objetivo

Implementar la estrategia de muestreo (sampling) Temperature(τ) y producir una verificación empírica de la propiedad de monotonicidad de la entropía derivada en theory/01-temperature.md.

Setup

  • Greedy del lab 00.
  • Checkpoint del Mini-GPT entrenado.
  • Un prompt de referencia: "Tomorrow she" (tercera persona del singular, futuro — interesante porque el modelo tiene varias continuaciones plausibles).

Tareas

  1. Implementa Temperature(tau) en src/minimodel/sampling.py:
@dataclass(frozen=True)
class Temperature:
    tau: float

    def __call__(self, logits, rng):
        assert self.tau > 0, "temperature must be positive"
        scaled = logits / self.tau
        probs = softmax(scaled)         # use log-sum-exp from Phase 05
        return int(rng.choice(len(probs), p=probs))

Usa la softmax numéricamente estable (np.exp(z - z.max()) / sum) de la Fase 05.

  1. Caso borde: tau → 0. Decide cómo manejarlo. Opciones:
  2. Lanzar excepción (prohibir).
  3. Tratar como greedy (tau == 0 → argmax, sin rng).
  4. Limitar a un epsilon pequeño (p. ej., tau = max(tau, 1e-6)).

Documenta tu elección en el docstring. El lab usa tau ∈ {0.5, 0.7, 1.0, 1.5, 2.0} — ninguno toca cero.

  1. Barre τ sobre un vector de logits. No uses el Mini-GPT todavía — usa un vector sintético de 8 logits z = [3.0, 2.0, 1.0, 0.5, 0.0, -0.5, -1.0, -2.0]. Para cada τ ∈ {0.1, 0.3, 0.5, 0.7, 1.0, 1.5, 2.0, 5.0, 10.0}:
  2. Calcula q = softmax(z / τ).
  3. Calcula H(q) = -Σ q_i log q_i (usa log2 para entropía en bits).
  4. Grafica (τ, H(q)).

Comprueba: la curva resultante es monótona no-decreciente en τ (usa np.all(np.diff(H) >= -1e-9); el -1e-9 da cuenta del ruido de punto flotante).

  1. Ahora usa el Mini-GPT. Para el prompt "Tomorrow she":
  2. Obtén los logits del primer paso (un forward).
  3. Repite el barrido sobre esos logits.
  4. Grafica.
  5. Compara con el caso sintético. La curva del modelo real empezará más baja (los logits reales suelen tener un pico agudo) y subirá de forma suave.

  6. Verificación empírica de diversidad. Para cada τ ∈ {0.5, 1.0, 2.0}, extrae 100 muestras (con seeds distintas) de longitud 1 de la distribución del primer paso del Mini-GPT. Cuenta el número de tokens únicos:

  7. τ = 0.5: se esperan 1-3 tokens únicos.
  8. τ = 1.0: se esperan 5-15 tokens únicos.
  9. τ = 2.0: se esperan 20+ tokens únicos.

Grafica (τ, num_unique_tokens) como diagrama de barras.

Mediciones

Guarda en experiments/<date>-phase-21-temp-sweep/:

  • entropy_curve_synthetic.png(τ, H) sobre los logits sintéticos.
  • entropy_curve_model.png(τ, H) sobre los logits del primer paso del Mini-GPT.
  • unique_tokens_by_tau.png — diagrama de barras de la tarea 5.
  • manifest.json — seeds, versiones, valores exactos de τ.

Aceptación

  • Temperature(tau) es determinístico bajo seed fija (rng.choice consume el estado del rng de forma predecible).
  • Las curvas de entropía son monótonas no-decrecientes con tolerancia 1e-9.
  • El recuento de tokens únicos crece estrictamente con τ en este prompt (o débilmente, con como mucho una igualdad).

Trampas

  • Calcular softmax(z) ** (1/τ) en lugar de softmax(z / τ). Son distribuciones distintas; la teoría del archivo 01 tiene la prueba. Que el lab pase silenciosamente mientras se calcula lo incorrecto es exactamente el bug que queremos atrapar — añade un unit test explícito que compruebe que tu implementación coincide con softmax(z / τ) (no con la forma de potenciación post-softmax).
  • Castear (o no) la salida de rng.choice a int. rng.choice(n, p=p) devuelve un numpy.int64; si tu código de tokenizer espera un int de Python, castéalo.
  • Log de cero. Si q_i = 0 exactamente, q_i log q_i es 0 · -inf = nan en IEEE. Usa np.where(q > 0, q * np.log2(q), 0.0) para la entropía.
  • Elegir el prompt de referencia equivocado. Si eliges un prompt donde el Mini-GPT está extremadamente confiado (p. ej., el modelo ha sobreajustado y da q_{top} = 0.999), todas las temperaturas se parecerán hasta que τ > 5. Elige un prompt donde el modelo tenga incertidumbre visible.

Siguiente: 02-top-k-and-top-p.md