English · Español
Break 00 — Olvidar aplicar la máscara causal en el attention del mini-GPT¶
🇪🇸 Quitamos la máscara causal del bloque de atención. El modelo ahora ve el futuro durante el entrenamiento: para predecir el token
t, mira los tokenst+1, t+2, .... Predicción: la pérdida cae a casi 0 en 5 pasos. Validación-cross-entropy también baja (el split val tiene la misma fuga). Al inferir token-por-token (sin futuro disponible), el modelo está perdido — predice basura, colapsa al token BoS. Es uno de los errores más recurrentes de transformers en el mundo real.Anchors:
LYNX_CORTEX.md§4 / PHASE 17; theory §01 transformer block; Phase 15 §04 masking;.claude/commands/break.md.
El break¶
En src/minimodel/nn/transformer_block.py:
class TransformerBlock(Module):
def forward(self, x: Tensor, causal_mask: Tensor) -> Tensor:
h = self.norm1(x)
# BUG: passing None instead of the causal_mask.
attn_out = self.attention(h, h, h, mask=None) # was: mask=causal_mask
x = x + attn_out
x = x + self.ffn(self.norm2(x))
return x
Edición de una sola línea. La máscara se construye (todavía se pasa al bloque), pero el módulo de attention no la aplica.
Predice, luego ejecuta¶
Qué ocurre durante el entrenamiento¶
El enmascarado causal evita que el token t preste atención a los tokens t+1, ..., T-1. Sin él:
- En la posición
t, el modelo presta atención a la secuencia entera, incluida la respuesta. - Para un modelo de lenguaje, la respuesta en la posición
tES el siguiente token (t+1). Así que la posicióntpuede literalmente atender al embedding de la posiciónt+1. - La pérdida de entrenamiento cae a casi 0 en <10 pasos.
Qué ocurre en inferencia¶
En inferencia sólo puedes mostrar al modelo los tokens que ya ha generado. El modelo ha aprendido un "truco" — "mira al vecino de la derecha" — que no aplica cuando no hay vecino a la derecha (el futuro aún no se ha generado).
El modelo colapsa. En concreto:
- Suele predecir el token de inicio de secuencia (BoS) en cada posición, porque en entrenamiento, cuando el modelo no podía espiar (es decir, en los primeros tokens), BoS era una respuesta frecuente. La Fase 30 llama a esto "BoS collapse".
- O produce galimatías (tokens aleatorios) — el attention no está haciendo nada útil.
Predicciones¶
- Pérdida de entrenamiento: cae a ~
1e-4en <10 pasos. (Parece demasiado bueno para ser cierto — ese es el diagnóstico.) - Pérdida de validación (calculada en modo train, con el futuro visible): también cae a casi 0.
- Pérdida de validación (calculada en modo de inferencia autoregresiva real): se queda en
log(V) ≈ 6.24o peor. - Salida del muestreo: el mismo token repetido, o BoS-collapse.
Escribe las predicciones en learners/borja/phase-17/notes/breaks.md antes de ejecutar.
Observa¶
just exp 17-train-mini --tag broken-no-mask
just exp 17-sample --tag broken-no-mask # autoregressive sampling
Diagnósticos:
- Grafica la pérdida de entrenamiento — si cae por debajo del suelo de entropía irreducible
H(corpus)(que la Fase 5 §02 deriva), sospecha de fuga de datos / problemas de máscara inmediatamente. - En inferencia, genera 10 frases. Deberían ser conjugaciones coherentes del §A13; serán basura.
- Visualiza las matrices de attention del modelo entrenado: cada fila debe tener ceros en la triangular superior (causal). Si ves attention hacia posiciones futuras, falta la máscara.
Síntoma que verá Borja¶
- Pérdida de entrenamiento < 1e-3 (sospechosamente baja — por debajo de la entropía irreducible).
- El muestreo produce
<BoS> <BoS> <BoS> ...o galimatías aleatorios. - La matriz de attention en cualquier capa está llena (no tiene ceros en la triangular superior).
Causa oculta (una frase)¶
El TransformerBlock.forward pasa mask=None al attention en lugar de mask=causal_mask, por lo que cada posición puede prestar atención a todas las demás (incluidas las futuras).
Cascada de pistas¶
- Imprime la matriz de attention
attnde la capa 0 sobre una entrada fija. ¿Qué patrón de dispersión tiene? ¿Debería ser triangular superior? - La pérdida de entrenamiento es sospechosamente baja. ¿Cuál es la entropía irreducible del corpus del §A13 (la Fase 5 §02 la deriva)? ¿Está el modelo rindiendo mejor que ese límite?
- Genera texto con
model.sample(prompt="I will"). Si saca BoS repetidamente, el modelo está colapsando — señal común de desajuste de distribución entrenamiento-vs-inferencia.
Diff de la corrección¶
Por qué esto enseña el concepto¶
La máscara causal es la característica distintiva de los transformers decoder-only como GPT — sin ella, tienes BERT (encoder-only, bidireccional). Olvidar la máscara es el bug más común de tipo "parece funcionar en entrenamiento pero se rompe en producción" en ingeniería de transformers. El break es intencionadamente sutil en los diagnósticos de modo train (la pérdida es sólo demasiado baja) pero flagrante en modo sample (el modelo produce basura). Este es exactamente el tipo de bug que el panel "el entrenamiento parece ir bien" de la Fase 19 está pensado para detectar — y el arnés de evaluación de la Fase 20 debe comprobar la generación autoregresiva, no sólo la pérdida con teacher-forcing. Este break conecta la Fase 17 con las Fases 19–20.
Serie completa: ejercicios de break Fase 09 → Fase 17.