English · Español
Break 00 — Barajar etiquetas objetivo con los prompts¶
🇪🇸 Rompemos la asociación entre cada ejemplo y su etiqueta: para cada par
(prompt, label), mantenemospromptigual y barajamoslabel. La pérdida debería bajar mucho más despacio (o no bajar). Es un test fundamental — si tu pérdida es similar con etiquetas aleatorias y reales, tu modelo no está aprendiendo nada de la entrada.Referencias:
LYNX_CORTEX.md§4 / PHASE 12; teoría §04 tamaño del corpus y memorización;.claude/commands/break.md.
El break¶
En src/dataset/grammar_loader.py:
def load_train(seed: int = 0) -> list[tuple[str, int]]:
pairs = _load_canonical_pairs()
rng = np.random.default_rng(seed)
# BUG: shuffle the labels independently of the prompts.
labels = [p[1] for p in pairs]
rng.shuffle(labels)
return [(p[0], labels[i]) for i, p in enumerate(pairs)]
La forma del corpus se preserva (los mismos 240 ejemplos, los mismos 5 tiempos, el mismo balance). Solo el mapeo (prompt, label) se aleatoriza. El modelo ve datos que parecen correctos; lo que cambió es el paisaje de pérdida.
Predice, luego ejecuta¶
Esperado: baseline de etiquetas aleatorias¶
Con K = 5 tiempos, la predicción de etiqueta aleatoria alcanza loss ≈ log(5) ≈ 1.609. La Fase 5 §02 deriva esto — es la entropía de la distribución uniforme.
Un modelo alimentado con etiquetas barajadas puede:
- Memorizar las etiquetas barajadas si tiene capacidad. Con 50K params y 240 ejemplos × 4 bits cada uno = 960 bits requeridos, el modelo tiene mucha capacidad. Así que memorizar-y-sobreajustar es el resultado probable.
- Pero las etiquetas de validación están también barajadas desde una extracción RNG diferente, así que la pérdida en val se queda en
log(5).
Predicciones¶
- Pérdida en train con etiquetas barajadas: empieza en ~1.6, baja a casi 0 hacia el epoch 100 (memorizado).
- Pérdida en val con etiquetas barajadas: se queda en ~1.6 durante todo (sin señal real que aprender).
- Pérdida en train con etiquetas correctas: baja a ~0.05 hacia el epoch 30 (aprendizaje real, generalización).
- Pérdida en val con etiquetas correctas: baja a ~0.10 hacia el epoch 30 (generalización real).
La brecha train vs val es el diagnóstico. Con etiquetas barajadas, la brecha es enorme; con etiquetas correctas, las curvas se siguen.
Escribe predicciones en learners/borja/phase-12/notes/breaks.md antes de ejecutar.
Observa¶
Diagnósticos:
- Superpón las curvas de pérdida en train: etiquetas-correctas vs etiquetas-barajadas.
- Superpón las curvas de pérdida en val: las barajadas se mantienen planas en
log(5). - Mira la brecha train/val. Con etiquetas barajadas: enorme.
Síntoma que Borja verá¶
- La pérdida en train cae, la pérdida de validación se queda en la entropía del baseline aleatorio
log(5) ≈ 1.61. - La accuracy en train se acerca al 100%, la accuracy en val se queda en 20%.
- La instrumentación de "brecha train/val" de la Fase 19 se enciende al máximo.
Causa oculta (una frase)¶
load_train baraja etiquetas independientemente de los prompts, por lo que cada par (prompt, label) es una asociación sin sentido que el modelo se ve forzado a memorizar.
Cascada de pistas¶
- Compara las curvas de pérdida de train y val. ¿Qué tiene de especial la asíntota de la pérdida en val? (Es
log(K) = log(5) ≈ 1.61. ¿Qué significa eso?) - Imprime 5 ejemplos del dataset. ¿Coincide la etiqueta con el prompt? (Para la versión con bug: no — son independientes.)
- Mira
load_train. ¿De dónde viene la etiqueta tras la llamada arng.shuffle?
Diff de arreglo¶
def load_train(seed: int = 0) -> list[tuple[str, int]]:
return _load_canonical_pairs() # restored: no shuffling at all
(O pasa seed solo al orden de batch, no a los pares.)
Por qué esto enseña el concepto¶
Zhang et al. (2017) ("Understanding deep learning requires rethinking generalization") usaron exactamente este experimento — etiquetas aleatorias — para mostrar que las redes neuronales modernas pueden memorizar etiquetas arbitrarias pero solo generalizan cuando las etiquetas portan señal. El test de la brecha train/val es el experimento único más diagnóstico para distinguir memorización de generalización. El lab de la Fase 12 te pone fluido con él antes de que la Fase 18 (loop de entrenamiento) te pida interpretarlo en ejecuciones reales.
Siguiente: El /break de la Fase 13 sobre desajuste de forma en embedding tied.