Setup. Una cadena de retail tipo Inditex quiere predecir unidades vendidas (miles) en función del precio (10–40€) de un artículo. La relación verdadera (línea discontinua) es suave: las ventas caen con el precio con una pequeña ondulación estacional. Tienes 18 observaciones de train (puntos tinta) y 12 de test (puntos grises), ambas con ruido de demanda. Arriba: el ajuste polinómico de grado d por ecuaciones normales. Abajo: el error de train y de test para TODOS los grados de 1 a 12, con tu grado marcado.
Juega. El slider de grado es el dial de "capacidad" del modelo. Con d pequeño, sesgo: la recta no puede representar la ondulación. Con d grande, varianza: el polinomio persigue el ruido. La zona útil (d ≈ 3–5) es estrecha, y nada en el train te avisa de cuándo la abandonas.
Lee así. El lector numérico da los dos errores y su cociente. Un cociente test/train que crece sin parar es la firma del overfitting: es exactamente lo que le pasó al modelo de fraude de BBVA del deck del día (98% en train, 72% en producción).
Mensaje. El overfitting no es un concepto abstracto: es la brecha entre estas dos curvas, y cuesta dinero real cuando el modelo sale a producción. Todo el resto del día (weight decay, dropout, early stopping) son formas distintas de cerrar esa brecha.
Términos. train/test: datos usados para ajustar vs datos reservados para evaluar. capacidad: cuántas formas distintas puede representar el modelo (aquí, el grado d). MSE: error cuadrático medio. infra/sobreajuste: errores altos en ambos / brecha grande entre ambos.
weight_decay=1e-4.Setup. Mismos datos de ventas vs precio que la slide anterior, pero el grado queda fijo en d = 10 (un modelo deliberadamente sobredimensionado, como casi todas las redes que entrenarás) y el dial pasa a ser λ, en escala logarítmica. Arriba: el ajuste ridge (dorado) frente al ajuste sin regularizar (gris discontinuo) y la verdad (tinta discontinua). Abajo: error de train, error de test y la norma ‖w‖2 en función de λ, con tu valor marcado.
Juega. El recorrido completo del slider cuenta la historia entera de la regularización: con λ ≈ 0 dominan los datos (varianza); con λ enorme domina la penalización (sesgo); en medio hay un valle donde el test es mínimo. Fíjate en que la curva de ‖w‖ cae de forma monótona: ese es el mecanismo, no el objetivo. El objetivo es el valle del test.
Lee así. El lector da ‖w‖2 y los dos errores. Compara mentalmente con la slide anterior: allí cambiabas la capacidad a saltos discretos (grado); aquí la encoges de forma continua. Por eso weight decay es el regularizador universal: funciona en cualquier modelo con pesos.
Mensaje. En PyTorch toda esta slide es un argumento:
AdamW(params, lr=1e-3, weight_decay=1e-4). Detrás de ese argumento está
exactamente esta geometría: sumar λ a la diagonal, encoger los pesos,
cambiar un poco de train por mucho de test.
Términos. λ: coeficiente de la penalización, típicamente 10−5–10−3 en redes. ‖w‖2: norma euclídea de los pesos, el termómetro de complejidad efectiva. ridge: nombre clásico de la regresión con penalización L2. AdamW: Adam con el decay aplicado fuera del gradiente.
Setup. Una red pequeña ya entrenada para un scoring de churn telco: 1 entrada (gasto mensual normalizado), H = 8 neuronas ocultas tanh, 1 salida (propensión a la baja, en unidades de score). Arriba: la red dibujada; las neuronas vivas de la máscara actual van en dorado y las apagadas en gris tachado; el grosor de cada conexión es proporcional a |peso|. Abajo: la predicción de la red completa (tinta), la de la sub-red de la máscara actual re-escalada por 1/(1−p) (dorado), la media Monte Carlo sobre 300 máscaras (discontinua) y la banda ±1 desviación típica del ensemble (sombreado).
Juega. Todo lo que ves es el forward pass real: el JS calcula hj = tanh(wjx + bj), aplica la máscara con su re-escalado y suma la capa de salida; las 300 máscaras del ensemble se muestrean con mulberry32, así que el experimento es reproducible. El slider p controla la Bernoulli; el botón sortea la máscara del "minibatch actual".
Lee así. La banda dorada es la varianza del ensemble: mide cuánto discrepan las sub-redes. Que la media del ensemble clave la curva tinta mientras la banda se ensancha es el resumen completo de dropout: en media no distorsiona, en varianza obliga a la red a no depender de ninguna neurona concreta (representaciones redundantes, menos co-adaptación).
Mensaje. Dropout es estudiar tapándose apuntes al azar: si ninguna neurona puede "cargar" sola con la señal del churn, el conocimiento queda repartido y robusto. Valores típicos: p = 0.2 en MLP, p = 0.1 en CNN; en inferencia, siempre apagado.
Términos. m: máscara binaria, una nueva por minibatch. p: probabilidad de apagar (0.1–0.5 en la práctica). ⊙: producto elemento a elemento. co-adaptación: neuronas que solo funcionan en presencia de otras concretas; dropout la rompe.
Setup. Estás dentro de una capa oculta del modelo de fraude de BBVA. Las pre-activaciones ai de esa capa llegan con media ≈ 3 y desviación ≈ 1.8 (histograma gris): descentradas y anchas, como casi siempre tras unas cuantas capas. BatchNorm toma el minibatch de B valores, calcula μB y σB2 de ese minibatch, normaliza y aplica (γ, β). Arriba: histograma antes (gris) y después (dorado), con μB y β marcadas. Abajo: la media μB estimada por 40 minibatches independientes del tamaño B elegido, contra la media verdadera y su banda teórica ±1.96σ/√B.
Juega. Los números del lector son cálculos reales sobre el minibatch: comprueba que media(â) = 0.000 y var(â) = 1.000 exactos (es una identidad algebraica, no una aproximación), y que media(y) ≈ β y sd(y) ≈ γ. Después juega con B: el panel inferior es el compromiso central de BatchNorm, estadísticas por minibatch = ruido ∝ 1/√B.
Lee así. BatchNorm estabiliza la distribución que ve cada capa: permite lr más alto, acelera y suaviza la pérdida. Su talón de Aquiles es exactamente el panel inferior: con B pequeño las estadísticas son ruido, y por eso en Transformers (y siempre que B ≤ 4) se usa LayerNorm, que normaliza sobre la dimensión de features y no depende del batch.
Mensaje. Por defecto: BatchNorm en CNN y MLP densos, LayerNorm en Transformers. Y recuerda que (γ, β) se aprenden: BatchNorm no impone una distribución, ofrece una re-parametrización estable.
Términos. μB, σB2: estadísticas del minibatch. ε: 10−5, estabilidad numérica. γ, β: escala y desplazamiento aprendibles, uno por canal. LayerNorm: normaliza sobre features, no sobre el batch; estándar en Transformers.
Setup. Entrenamos de verdad (descenso por gradiente, 600 épocas, lr = 0.4) un modelo polinómico de grado 11 sobre 12 observaciones ruidosas de la curva de demanda, con 60 puntos de validación apartados. Es el modelo de churn/demanda de juguete del día: sobredimensionado a propósito, como tu primer MLP. Arriba: pérdida de train (tinta) y de validación (dorado) por época, en escala logarítmica; la vertical discontinua marca el mínimo de validación, el punto dorado tu época de parada t, y el rombo el t★ que dispararía la regla de patience. Abajo: el ajuste que tendrías si te quedas con el checkpoint de la época t.
Juega. El slider t es tu dedo sobre el botón de parar; el badge se pone verde si tu V(t) está a menos de un 5% del mínimo alcanzable y rojo si paraste demasiado pronto o seguiste de largo. El slider P controla la regla automática de la Ec. 4: comprueba que para P razonable, el checkpoint que devuelve coincide con (o queda muy cerca de) tu mejor parada manual.
Lee así. El gap creciente entre train y val a la derecha del mínimo es el overfitting de la slide 1, ahora desplegado en el tiempo de entrenamiento. Early stopping es el regularizador de coste cero: no toca el modelo ni la pérdida, solo elige el instante de la trayectoria donde la generalización era máxima.
Mensaje. En la práctica: patience=10 sobre la
pérdida de validación, guardando el mejor checkpoint. Cuesta cero, previene la
mitad del overfitting, y es la quinta línea de la receta exprés del día.
Términos. V(t): pérdida de validación en la época t. patience P: épocas seguidas sin mejorar que se toleran antes de parar. checkpoint: copia de los pesos guardada en una época concreta. t★: época en la que la regla decide parar.
CosineAnnealingLR(opt, T_max=epochs).Setup. Para aislar el efecto del schedule, optimizamos un problema donde todo lo demás es conocido: una cuadrática mal condicionada (curvatura 1 en una dirección, 8 en la otra: la "hondonada alargada" típica de las pérdidas reales) con gradiente ruidoso, como el que produce un minibatch en el forecast de demanda de Inditex. Arriba: η(t) para los cuatro schedules del día, calculados con sus fórmulas exactas: constante (gris), step decay (tinta), cosine (dorado) y warmup+cosine (dorado oscuro). Abajo: la pérdida que consigue cada uno optimizando la MISMA cuadrática con el MISMO ruido (misma semilla), en escala logarítmica.
Juega. Los tres sliders son los tres números que fijarás en PyTorch: ηmax (el lr del optimizador), T (T_max del scheduler) y el warmup. El botón cambia la semilla del ruido: comprueba que el orden de los schedules apenas cambia (la comparación es justa porque comparten ruido).
Lee así. El lector da la pérdida final de cada schedule. En este juguete convexo el warmup apenas mejora (no hay BatchNorm ni momentos de Adam que estabilizar): su papel aparece en redes grandes, donde los primeros pasos con lr alto pueden romper el entrenamiento. Lo que sí es general es la meseta de la constante: suelo de ruido ∝ η.
Mensaje. Si te bloqueas con el lr: cosine. Cinco líneas de
PyTorch (CosineAnnealingLR + sched.step() por época) que
en la práctica del curso suben la AUC de validación un 2–5% sin tocar el
modelo.
Términos. ηmax, ηmin: lr inicial y final de la trayectoria (aquí ηmin = 0). T: horizonte total en iteraciones o épocas. Tw: duración del warmup. suelo de ruido: pérdida residual ∝ η al optimizar con gradiente ruidoso y lr fijo.
Setup. El recomendador de Netflix no calcula el gradiente sobre los millones de interacciones de su dataset: muestrea un minibatch de B y usa su media. Aquí simulamos exactamente ese proceso sobre la cuadrática mal condicionada de la slide anterior: en cada paso, el JS calcula el gradiente verdadero Aθ y le suma ruido gaussiano de desviación σ/√B por componente (σ = 3, el "ruido de un ejemplo"). Arriba: las curvas de nivel de la pérdida y tres trayectorias con semillas distintas partiendo del mismo punto. Abajo: la pérdida de cada trayectoria por iteración (log) y su media (dorado grueso).
Juega. El slider de B recorre potencias de 2 de 1 a 256: el rango real que manejarás (8–128 en tabular, 32–256 en imágenes). Observa que el efecto sobre el ruido es √B, no B: de 1 a 4 se nota muchísimo, de 64 a 256 casi nada — los retornos del batch grande son decrecientes mientras su coste crece lineal.
Lee así. El lector da el ruido por paso σ/√B, la pérdida final media y el total de ejemplos procesados (B×T): la métrica honesta de coste. Compara configuraciones a ejemplos iguales, no a pasos iguales.
Mensaje. El batch fija el punto de la balanza ruido-coste: pequeño = barato por paso, ruidoso, regularizante; grande = limpio, caro, y con riesgo de generalizar peor. Defecto razonable del curso: 32–64, y si lo subes mucho, sube también el lr y añade warmup.
Términos. gB: gradiente medio del minibatch. σ2: varianza del gradiente de un ejemplo individual. ξt: ruido gaussiano estándar. mínimos planos vs afilados: cuencas anchas/estrechas de la pérdida; las anchas suelen generalizar mejor.
sched.step() no se está ejecutando: ese typo silencioso se caza
aquí y solo aquí.Setup. El dashboard de un run real, como lo verías en W&B o TensorBoard monitorizando el modelo de demanda: el JS entrena por descenso de gradiente (400 épocas, schedule cosine, weight decay 10−4) el modelo polinómico del día sobre los datos ruidosos de ventas, y registra en cada época las cuatro series de la nota técnica. Panel 1: Ltrain y Lval (log). Panel 2: ‖gt‖2 antes del clipping (log), con el tope c marcado. Panel 3: R2 de validación. Panel 4: ηt, el lr efectivo.
Juega. Esta slide es un simulador de averías: el slider de lr te deja cruzar la frontera de estabilidad y ver cómo se manifiesta la avería en cada panel (el gradiente la anuncia, la pérdida la confirma, la métrica la paga, el lr la explica). El clipping es la reparación de urgencia; bajar ηmax es la de fondo.
Lee así. El badge resume el run (sano/roto) y el lector da la mejor época de val, el máximo de ‖g‖, el % de épocas recortadas y el R2 final. Si los cuatro paneles no están registrados, nada de esto se puede reconstruir: el experimento es irreproducible, que es la palabra exacta de la nota técnica del día.
Mensaje. No se entrena sin dashboard. Cuatro series, coste de logging cero, y la diferencia entre "creo que el modelo va bien" y "puedo enseñarte exactamente qué pasó en la época 173".
Términos. ‖g‖2: norma euclídea del gradiente; su explosión es el síntoma más temprano de un lr excesivo. c: tope de clipping (0.5–5 típico). R2: varianza explicada en validación. lr efectivo: el ηt que de verdad usó cada paso, no el que crees haber configurado.
Setup. Eres el equipo de datos de una telco con un modelo de churn, y esta slide es tu W&B / MLflow de bolsillo. Cada vez que pulsas "lanzar run", el JS entrena DE VERDAD una regresión logística con minibatch SGD (6 épocas, deliberadamente pocas para que el efecto de la inicialización y del orden de los datos sea visible) sobre 250 clientes sintéticos y evalúa en 150 de validación; la fila que se añade a la tabla registra exactamente lo que registraría un tracker: config completo (η, λ, B, semilla) y resultados (val-loss, accuracy). La mejor fila queda resaltada en dorado. Arriba: los clientes de validación (dorado = churn, tinta = se queda) con la frontera de decisión del último run (continua) y la del mejor run (discontinua). Abajo: la val-loss de cada run lanzado, en orden.
Juega. El checkbox de la semilla es el corazón de la slide: con él marcado, el experimento es una función determinista del config; sin él, cada run lleva ruido de inicialización y de orden de datos. Haz la secuencia del guion y decide tú cuántas de tus comparaciones pasadas eran ruido.
Lee así. La tabla ES el argumento del día sobre trackers: sin ella no recuerdas qué probaste, no puedes reproducir el mejor run y no puedes defender la elección ante el equipo. TensorBoard para logging local, W&B para equipo y barridos, MLflow para producción self-hosted: cualquiera vale, ninguno es opcional.
Mensaje. La regla del deck: antes de barrer, fija modelo, pérdida, optimizador y schedule; luego mueve UN hiperparámetro por vez, con semilla fija, y registra todo. Cada hora invertida en el tracker ahorra una semana de búsqueda ciega.
Términos. run: un entrenamiento completo con su config y sus resultados. semilla: estado inicial del generador aleatorio; fija = experimento repetible. val-loss: log-loss en validación, el criterio de la tabla. frontera de decisión: la recta w·x+b = 0 donde el modelo cambia de opinión.
En una frase. La receta exprés del primer prototipo correcto — AdamW(lr = 10−3, weight_decay = 10−4) + CosineAnnealingLR + Dropout/BatchNorm + early stopping(patience = 10) + tracking de los cuatro paneles + validación 5-fold — no es una superstición: cada ingrediente cierra una de las brechas que has manipulado hoy con tus propias manos.