English · Español
02 — Métricas del dashboard: la matemática detrás de cada panel¶
Toda métrica del dashboard tiene una fórmula corta y un significado físico. Esta página es la referencia: derivada, no aproximada, con coste computacional explícito.
Este archivo es la hoja de fórmulas. Cada número de un panel se calcula con una de las fórmulas de abajo. Cada fórmula tiene un coste (en operaciones por paso de entrenamiento) y un objetivo de precisión (Welford-estable, log-estable, etc.).
Estadísticas en streaming de Welford (la base)¶
La manera ingenua de calcular la media y la desviación típica de un stream es mantener \(\sum x\) y \(\sum x^2\) y combinarlos al final. Eso pierde precisión en streams grandes.
El update de Welford mantiene una \((\mu, \sigma^2)\) en streaming numéricamente estable:
Para cada nueva muestra \(x_n\):
Almacenamiento: 3 escalares por estadístico (\(n, \mu, M\)). Update: 3 FLOPs por muestra.
Para los dashboards: cada magnitud de activación por capa, cada norma de gradiente, cada estadístico de peso usa Welford. Los hooks recogen muestras; Welford agrega; en el momento del log, el dashboard lee \((n, \mu, \sigma)\) y grafica.
Panel 3: norma del gradiente¶
Norma \(\ell_2\) global del gradiente sobre todos los parámetros:
Coste: lineal en el conteo de parámetros. Para MiniGPT (~103k params), barato (microsegundos).
Se almacena como valor por paso (no agregado por Welford) porque queremos ver las spikes individuales, no resúmenes. 2000 pasos × 8 bytes = 16 KB de estado por ejecución. Trivial.
Panel 4: magnitudes de activación por capa¶
Para cada capa \(\ell\) con tensor de salida \(A_\ell\) de forma \((B, L, d)\), captura:
Esta es la activación media absoluta. Usamos la media-absoluta, no la norma L2, porque es más fácil de interpretar entre capas de diferentes tamaños.
Coste: una reducción sobre el tensor — \(O(B L d)\) FLOPs, < 0.1 ms por capa.
Welford a lo largo de los pasos de entrenamiento. En el momento del plot, dibuja la trayectoria media y (opcionalmente) una banda de ±1σ.
Panel 5: norma espectral de los pesos vía power iteration¶
La norma espectral \(\sigma_1(W)\) es el mayor valor singular de \(W\). Calcularla vía SVD es \(O(d^3)\), caro para llamadas repetidas. Power iteration la aproxima:
Inicializa \(v_0\) a un vector unitario aleatorio. Para \(k\) iteraciones:
Tras \(k\) iteraciones:
Convergencia: exponencial con ratio \(\sigma_2 / \sigma_1\). Para matrices de pesos típicas de redes neuronales, \(\sigma_2 / \sigma_1 \in [0.5, 0.9]\), por lo que \(k = 10\) iteraciones dan ~3 dígitos de precisión. Suficientemente bueno para un dashboard.
Coste: \(k \cdot 2 \cdot \text{numel}(W)\) FLOPs. Para una matriz (d, d) con \(d = 64\), son \(10 \cdot 2 \cdot 4096 = 82\,000\) FLOPs por llamada. Sub-microsegundo.
Warm-starting: conserva \(v\) del paso previo. Los pesos cambian despacio entre pasos, así que el autovector del paso anterior es una excelente conjetura inicial para este. Reduce \(k\) de 10 a ~3.
Panel 6: detector de neuronas muertas¶
Para una activación oculta de un FFN \(H \in \mathbb{R}^{B \times L \times d_{ff}}\), define:
Cuenta \(\sum_j \text{dead}_j\).
default \(\epsilon = 10^{-3}\) (en el espacio de activación). Ajusta por corpus si la escala natural del FFN es muy distinta.
Coste: un conteo con umbral por llamada, \(O(B L d_{ff})\). Calcula cada \(K\) pasos (cada 50 pasos basta), no en cada paso.
Cabeza de atención muerta¶
Para los pesos de atención de una cabeza \(\alpha \in \mathbb{R}^{B \times L \times L}\) (tras el softmax), entropía por query:
Una distribución de query concentrada en una sola key tiene \(H \approx 0\); uniforme tiene \(H = \log L\).
Define la cabeza como "muerta" si \(\Pr_{b, l}\left( H_q < \log 2 \right) > 0.99\) — es decir, casi toda query atiende efectivamente a una sola key.
Coste: \(O(B L^2)\) por cabeza. Calcula cada 50 pasos.
Panel 1: pérdida media por token¶
Reducción estándar de cross-entropy de la Fase 18:
Pérdida de train: escalar por paso. Pérdida de val: escalar por paso-val (sobre el val set entero).
Coste: una reducción por batch (ya calculada para el paso del optimizador).
Paso de divergencia train/val¶
El paso a partir del cual la brecha se ensancha de manera consistente — "inicio del overfitting". Calculado a posteriori del historial de pérdida; no es una métrica en streaming.
Panel 7: descomposición de la pérdida por clase¶
El panel específico de §A13. El corpus particiona los verbos en:
- \(R = \{\)
work, play, walk, talk, listen, watch, study, finish, start, look, want, like\(\}\) (12 regulares) - \(I = \{\)
be, have, do, go, come, see, eat, write\(\}\) (8 irregulares)
Para cada batch de entrenamiento, particiona los ejemplos según la clase de su verbo. Calcula:
donde \(B_R\) es el subconjunto del batch con ejemplos de verbos regulares (análogamente \(B_I\)).
Cuando el batch tiene cero ejemplos de una clase (puede pasar en batches pequeños), no actualices el estadístico de esa clase en este paso.
Agrega con Welford a lo largo de las ventanas de logging. En el momento del plot, dibuja dos líneas.
Coste: por batch, \(O(B)\) para particionar y reducir dos veces. Trivial.
El impuesto del verbo irregular¶
Define:
Un \(\tau\) positivo significa que los irregulares son más difíciles. Un \(\tau\) cercano a cero en la convergencia significa que el modelo ha memorizado; un \(\tau\) no nulo en la convergencia significa que hay una brecha real de dificultad (lo cual es el resultado correcto en un modelo pequeño con capacidad limitada para los irregulares).
Sigue \(\tau_t\) a lo largo de la ejecución. La curva esperada: \(\tau\) empieza cerca de 0 (modelo aleatorio pierde por igual en ambos), crece a ~0.5-1.0 nats hacia el paso 500 (el modelo aprende rápido la regla regular, los irregulares se quedan atrás), luego se estrecha a ~0.2-0.5 nats al final.
Detector de spikes de pérdida¶
Para una ventana de \(W\) pérdidas recientes, la mediana y la desviación absoluta mediana:
Bandera de spike en el paso \(t\):
Usamos mediana + MAD en lugar de media + std porque los primeros pasos tienen una varianza salvaje que inflaría std y suprimiría spikes reales más tarde.
Suprime el detector durante el warmup (t < W). \(W = 50\) es un default razonable.
Coste: \(O(W \log W)\) por paso. Para \(W = 50\), trivial.
Ratio grad-a-peso por capa (diagnóstico, no siempre graficado)¶
Para la matriz de pesos de cada capa \(W_\ell\) y su gradiente \(G_\ell\):
Sano: \(\rho_\ell \in [10^{-4}, 10^{-1}]\). Por debajo de \(10^{-4}\) significa que la capa apenas entrena (gradiente desvaneciente). Por encima de \(10^{-1}\) significa que el tamaño de update es peligrosamente grande relativo a la escala de los parámetros (inestabilidad).
Almacenado como escalar por-paso-por-capa; graficado ocasionalmente, no por default en los Paneles 4-5.
Juntándolo todo: presupuesto de coste¶
Por paso de entrenamiento, el overhead de diagnóstico es:
| Métrica | Coste por paso |
|---|---|
| Updates Welford (todas las estadísticas) | ~50 μs |
| Norma global del gradiente | ~100 μs |
| Media de activación por capa | ~200 μs |
| Power iteration (norma espectral × 4 matrices, warm-started) | ~80 μs |
| Detección de neuronas muertas (cada 50 pasos, amortizado) | ~20 μs amortizados |
| Descomposición de pérdida por clase | ~10 μs |
| Total por paso | ~460 μs |
Un paso de entrenamiento de la Fase 18 en el i5-8250U es ~30 ms (en su mayoría overhead de Python/NumPy). El overhead de diagnóstico es 460/30000 ≈ 1.5%. Cómodamente por debajo del presupuesto del 30%.
Si la medición real del laboratorio muestra >30%, la implementación tiene un bug de hot-loop — lo más habitual, llamar a Welford en un bucle de Python sobre los elementos del batch en lugar de hacer una reducción vectorizada.
Problemas de práctica¶
- La activación media en
block_1_outes 12.0 en el paso 0, creciendo a 18.0 en el paso 100. ¿Sano? - La norma espectral de la matriz QKV de atención en la capa 2 crece de 1.2 al init a 14.0 en el paso 500. ¿Nivel de preocupación?
loss_regularen el paso 500 es 1.8;loss_irregulares 3.4. ¿Cuál es \(\tau\)? ¿Es un valor preocupante, un valor esperado o un valor objetivo?- El update de Welford de \((\mu, M)\) requiere tres FLOPs. Muestra tu trabajo para la fórmula \(\mu_n = \mu_{n-1} + (x_n - \mu_{n-1}) / n\) — ¿qué problema numérico evita frente al ingenuo \(\mu_n = (\sum_{i=1}^n x_i) / n\)?
Resumen en un párrafo¶
Cada métrica del dashboard se calcula con una fórmula simple y con coste explícito. El algoritmo de Welford gestiona toda la acumulación de media/std en streaming. La norma espectral usa power iteration warm-started con 3-10 pasos, sub-milisegundo. La detección de neuronas muertas es una reducción con umbral cada 50 pasos. La pérdida por clase específica de §A13 descompone el batch en subconjuntos regular e irregular y sigue el impuesto del verbo irregular \(\tau = \mathcal{L}^{\text{irr}} - \mathcal{L}^{\text{reg}}\) a lo largo del entrenamiento. El overhead total de diagnóstico es ~460 μs/paso, ~1.5% del paso de entrenamiento en este hardware — cómodamente dentro del presupuesto del 30%.
Lo que esta sección NO cubre¶
- La derivación completa de Welford (cubierta en la Fase 2 o 6 — TAOCP de Knuth).
- Condicionamiento numérico de power iteration cuando \(\sigma_1 \approx \sigma_2\) (raro para pesos de NN).
- Alternativas bayesianas a la descomposición de pérdida por clase (fuera de alcance).
Siguiente: theory/03-three-failure-modes.md.