las ecuaciones de esta slide
forecast ≡ modelar  p ( xt+1 | x1:t )(Ec. 1, nota técnica)
una serie temporal {xt}t=1..T no es i.i.d.: el valor de mañana depende del pasado x1:t. Pronosticar es estimar esa distribución condicional; todo el día gira en torno a cómo comprimir x1:t en algo que una red pueda usar.
xt = m + g·t + A·sen(2πt52) + εt,   εt ~ N(0, s²)(generador de la demo)
la serie sintética de demanda semanal: nivel base m, tendencia g (unidades/semana), estacionalidad anual de amplitud A (52 semanas por ciclo) y ruido gaussiano de desviación s. Cada componente tiene un slider: así ves qué parte de la curva es señal aprendible y qué parte no.
guion paso a paso
  1. Pon s = 0 y mira el panel de arriba. Queda solo la parte determinista m + g·t + estación: eso es lo máximo que cualquier modelo puede aprender; el resto es ruido irreductible.
  2. Sube s hasta 20 y pulsa "nueva muestra" tres veces. La estacionalidad casi desaparece a ojo, pero el panel de abajo la sigue separando: el patrón existe aunque el ojo no lo vea. Un buen modelo también lo encuentra.
  3. Pon g = -1 con A = 18. La demanda cae en tendencia: en retail esto dispara decisiones de rebaja y fin de vida del producto, no solo de producción.
  4. Vuelve a g = 0.3, A = 18, s = 6 (los valores del resto del deck) y lee la razón señal/ruido del lector. Con estos valores el MAPE alcanzable estará lejos de cero pero por debajo del 10%: el umbral competitivo de Inditex.
Comprueba que entiendes: ¿por qué barajar (shuffle) las semanas destrozaría este problema?
Porque la información está en el orden: la tendencia y la estacionalidad son relaciones entre t y t+1, t+52. Si barajas, la distribución marginal de las xt es idéntica pero p(xt+1|x1:t) se vuelve inestimable: ya no hay pasado coherente que condicione. Por eso los datos secuenciales piden arquitecturas con estado (RNN) y por eso en validación jamás se mezcla futuro con pasado.

Setup. Esta es la serie con la que trabajará todo el día: demanda semanal de un SKU de Inditex durante T = 156 semanas (3 años), generada con el modelo del panel de ecuaciones y semilla reproducible (mulberry32). Arriba: la serie completa, con la parte determinista en dorado y los datos observados en tinta. Abajo: la descomposición en tendencia, estacionalidad y ruido, cada una en su banda.

Juega. Los tres sliders controlan los tres componentes. La pregunta de negocio es siempre la misma: ¿cuánta de la variación de la serie es estructura aprendible (tendencia + estación) y cuánta es ruido que ningún modelo va a predecir? El lector da la desviación típica de la parte determinista, la del ruido y su cociente: la razón señal/ruido.

Lee así. Si la señal domina (cociente alto), un modelo simple ya hará buen forecast; si el ruido domina, ni el mejor LSTM bajará el error por debajo de s. Saber dónde está ese suelo evita prometer MAPEs imposibles al negocio.

Mensaje. Producir de más cuesta stock muerto y rebajas; producir de menos cuesta venta perdida. Cada punto de MAPE en Inditex se estima en 8–12 M€/año. Todo lo que sigue (RNN, LSTM, GRU) son máquinas para exprimir la parte aprendible de esta curva.

Términos. SKU: referencia concreta de producto. Estacionalidad: patrón que se repite con período fijo (aquí 52 semanas). Razón señal/ruido: sd(parte determinista)/sd(ruido); mide cuánto hay que aprender frente a cuánto es azar.

las ecuaciones de esta slide
ht = tanh(Wh ht−1 + Wx xt + b),    ŷt = Wo ht + bo(Ec. 2)
la RNN entera en una línea: el estado oculto ht (la "memoria de trabajo") mezcla la nota anterior ht−1, ponderada por Wh, con la entrada nueva xt, ponderada por Wx, y pasa la suma por una tanh que aplasta el resultado a (−1, 1). La salida ŷt es una capa lineal sobre ht. Los pesos son los mismos en todos los pasos: una sola regla, aplicada T veces.
at = Wh ht−1 + Wx x̃t + b,   tanh(a) = ea−e−aea+e−a ∈ (−1, 1)
la pre-activación at es lo que entra a la tanh. Si |at| > 2, la tanh está saturada: devuelve casi ±1 y su derivada es casi 0. El panel inferior pinta dónde caen las at de tu serie sobre la curva: la zona plana es donde la red deja de distinguir entradas.
guion paso a paso
  1. Con Wh = 0.6 y Wx = 0.4, mira la curva dorada de arriba. ht sigue la forma de la demanda normalizada con retardo y suavizado: la memoria mezcla presente y pasado.
  2. Sube Wx a 2. El % de pasos saturados del lector se dispara y ht se convierte en una onda cuadrada pegada a ±1: la tanh aplasta y la red ya no distingue una semana buena de una excelente. Es la réplica del ejemplo a mano del deck: con x = 10, 12, 11 y wx = 0.4, h1 = tanh(4) = 0.999.
  3. Pon Wx = 0.4 y Wh = 1.4. ht se queda "enganchado" cerca de +1 o −1 durante rachas largas: la autorrealimentación fuerte crea memoria pegajosa que tarda en soltar.
  4. Pon Wh = 0. ht = tanh(Wxt+b) depende solo del presente: sin recurrencia la red es una capa densa sin memoria, incapaz de ver tendencia ni estación.
Comprueba que entiendes: ¿por qué normalizamos la demanda antes de metérsela a la RNN?
Porque la demanda cruda vive en torno a 100 unidades y la tanh satura a partir de |a| ≈ 2: con xt = 100 cualquier Wx razonable produce tanh(±∞) en la práctica, exactamente lo que viste en el paso 2 del guion. Normalizar (restar media, dividir por sd) coloca las entradas en la zona útil de la no-linealidad. Es la versión secuencial del escalado de features de los días de MLP.

Setup. Tomo la serie de demanda de la slide anterior (parámetros fijos: g = 0.3, A = 18, s = 6, misma semilla), la normalizo a x̃t = (xt−media)/sd, y ejecuto de verdad la recurrencia escalar ht = tanh(Whht−1 + Wxt + b) con h0 = 0 durante las primeras 60 semanas. Arriba: x̃t (tinta) y ht (dorado). Abajo: la curva tanh con un punto por cada pre-activación at visitada; la franja |a| > 2 es la zona saturada.

Juega. Wh gradúa cuánto pesa la nota anterior; Wx, cuánto pesa la semana nueva; b desplaza el punto de trabajo. El lector muestra h60, el % de pasos con |at| > 2 y la correlación entre ht y x̃t.

Lee así. ht es un resumen de TODO el pasado en un solo número (en la práctica, un vector de dh números). La calidad del forecast depende de que ese resumen retenga lo útil; los dos paneles te enseñan los dos enemigos: saturación (abajo) y memoria mal dosificada (arriba).

Mensaje. Una RNN es alguien que lee el informe de ventas semana a semana y va actualizando sus notas mentales con la misma regla cada semana. La siguiente slide pregunta: ¿cuánto recuerda esa regla de lo que pasó hace 30 semanas? La respuesta es el defecto estructural que motiva la LSTM.

Términos. ht: estado oculto, memoria de trabajo. Pre-activación at: lo que entra a la tanh. Saturación: zona donde tanh ≈ ±1 y su derivada ≈ 0. Pesos compartidos: Wh, Wx, b idénticos en los T pasos.

las ecuaciones de esta slide
∂ℓt∂hk = ∂ℓt∂ht j=k+1..t ∂hj∂hj−1 = ∂ℓt∂ht j Wh diag(σ′(aj))(Ec. 3, BPTT)
backpropagation through time: para que el error de la semana t eduque a la memoria de la semana k, el gradiente debe atravesar un factor por cada paso intermedio. Cada factor es "peso recurrente × derivada de la activación". Un producto largo de números > 1 explota; de números < 1, se desvanece.
caso escalar:  ∂hT∂hT−L = j=T−L+1..T Wh·(1−hj2),   tanh′(a) = 1−tanh²(a) ≤ 1
con tanh, la derivada es 1−h² ≤ 1 (y ≈ 0 en saturación). El canvas calcula este producto de verdad sobre la recurrencia de la slide anterior y lo pinta en escala log: una recta descendente es decaimiento exponencial, una ascendente es explosión.
guion paso a paso
  1. Con Wh = 0.6 y T = 30, lee el gradiente a retardo 29 en el lector. Del orden de 10−10: el error de hoy ya no educa a la memoria de hace 29 semanas. La RNN básica olvida lo de hace 20–30 pasos, como decía el deck.
  2. Sube Wh despacio hasta 1.0 mirando la pendiente de la recta de arriba. La pendiente se suaviza pero sigue siendo negativa: incluso con Wh = 1 las derivadas tanh′ < 1 siguen comiéndose el gradiente.
  3. Sigue hasta Wh = 1.8. El badge pasa a EXPLOTA y la curva sube: cada paso multiplica por más de 1 y el gradiente a 30 pasos es astronómico. Entrenar así diverge en pocas iteraciones (de ahí el gradient clipping).
  4. Con Wh = 0.95, mueve T de 5 a 60. La pérdida es exponencial en T: duplicar la ventana temporal no duplica el problema, lo eleva al cuadrado. El panel de abajo muestra cada factor individual |Wh·tanh′(aj)|: casi todos por debajo de 1.
Comprueba que entiendes: ¿por qué con Wh = 1 exacto el gradiente sigue desvaneciéndose?
Porque el factor de cada paso no es Wh a secas sino Wh·tanh′(aj), y tanh′ = 1−h² solo vale 1 cuando h = 0 exactamente. En cuanto la red tiene estado no nulo (que es siempre: para eso está), tanh′ < 1 y el producto decae. Para mantener gradiente vivo necesitarías compensar con Wh > 1, pero entonces los pasos poco saturados explotan. No existe un Wh que estabilice todos los regímenes a la vez: el arreglo tiene que ser estructural, no de ajuste fino. Eso es la LSTM.

Setup. Ejecuto la recurrencia escalar de la slide anterior (Wx = 0.4, b = 0, demanda normalizada, semilla fija) durante T semanas y calculo exactamente el gradiente ∂hT/∂hT−L = ∏ Wh(1−hj²) para cada retardo L. Arriba: |gradiente| frente al retardo, en escala log10, con la franja [10−3, 103] marcada como zona sana. Abajo: el factor de cada paso |Wh·tanh′(aj)| con la línea crítica en 1.

Juega. Wh controla el factor común del producto; T, cuántos factores se multiplican. El badge clasifica el régimen según el gradiente al máximo retardo: DESVANECE (< 10−3), SANO, o EXPLOTA (> 103).

Lee así. En escala log un producto es una suma: cada paso añade log|Whtanh′| a la altura. Por eso la curva es casi una recta y su pendiente es el log del factor medio. La geometría del problema queda desnuda: no es un bug de implementación, es la estructura multiplicativa de la cadena.

Mensaje. Para el negocio: una RNN básica entrenada sobre ventanas de 52 semanas no aprenderá la estacionalidad anual, porque el gradiente que conecta la Navidad de este año con la del anterior llega multiplicado por ≈ 10−10. La solución no es otro optimizador: es cambiar la célula. Dos slides más y la tendrás.

Términos. BPTT: backpropagation through time, la regla de la cadena aplicada a la recurrencia desplegada. Desvanecimiento / explosión: decaimiento / crecimiento exponencial del gradiente con el retardo. Gradient clipping: truncar la norma del gradiente; cura la explosión, no el desvanecimiento.

las ecuaciones de esta slide
σ(z) = 11 + e−z ∈ (0, 1),    στ(z) = σ(z/τ)
la sigmoide convierte cualquier número real z en una fracción entre 0 y 1: z muy negativo → casi 0 (puerta cerrada), z muy positivo → casi 1 (puerta abierta), z = 0 → exactamente 0.5. La temperatura τ gradúa la brusquedad: τ pequeña → casi un interruptor on/off; τ grande → un regulador suave.
puerta en acción:  salida = σ(z) ⊙ señal,    ft = σ(Wf[ht−1, xt] + bf)(puerta de olvido)
una puerta es exactamente esto: multiplicar una señal, componente a componente (⊙), por un número entre 0 y 1 calculado a partir del contexto [ht−1, xt]. No es un if-else escrito a mano: es un if-else diferenciable, así que la red puede aprender cuándo abrir y cerrar por descenso de gradiente.
guion paso a paso
  1. Mueve z de −6 a +6 con τ = 1 mirando las barras de abajo. La memoria de 8 componentes pasa de borrada (todo ≈ 0) a copiada intacta, pasando por todas las atenuaciones intermedias: eso es un interruptor suave.
  2. Deja z = 0.6 y lee σ(0.6) en el lector. 0.646: el mismo número de la puerta de olvido f1 del ejemplo del deck. Una puerta a 0.646 deja pasar el 64.6% de cada componente de la memoria.
  3. Baja τ a 0.1. La curva se vuelve un escalón: cualquier z ≠ 0 da 0 o 1. Útil como interruptor duro, pero la derivada es casi 0 en todas partes salvo en z = 0: el gradiente no podría aprender dónde abrir.
  4. Sube τ a 4. La curva es casi una recta alrededor de 0.5: la puerta apenas decide. La derivada σ′ del lector es máxima en z = 0 y vale σ(1−σ)/τ: brusquedad y entrenabilidad están en tensión.
Comprueba que entiendes: ¿por qué la puerta usa σ y el candidato usa tanh?
Porque hacen trabajos distintos. La puerta debe producir una fracción de paso: tiene sentido en [0, 1], y σ vive ahí. El candidato C̃t debe proponer contenido nuevo, que puede ser positivo o negativo ("la demanda sube" / "la demanda baja"): tiene sentido en (−1, 1), y tanh vive ahí. Multiplicar fracción × contenido da la actualización dosificada. Si usaras tanh como puerta, una puerta "negativa" invertiría el signo de la memoria: no es atenuar, es corromper.

Setup. Arriba: la curva στ(z) con el punto de trabajo actual y, en gris, su derivada. Abajo: una memoria de 8 componentes (el vector C, barras tinta, valores fijos que representan "lo aprendido hasta hoy": nivel de demanda, fase estacional, efecto promo…) y el resultado de multiplicarla por στ(z) (barras doradas). Es literalmente la operación ft ⊙ Ct−1 de la LSTM, con la puerta compartida.

Juega. z simula lo que la red calcularía a partir del contexto: Wf[ht−1, xt] + bf. En la LSTM real cada componente de la memoria tiene su propio z (su propia fila de Wf), así que la red puede conservar el componente "estacionalidad" y borrar el componente "promo puntual" a la vez.

Lee así. El lector muestra σ(z), el % de señal que pasa, y la derivada σ′(z) = σ(1−σ)/τ. La derivada es la "entrenabilidad" de la puerta en ese punto: en los extremos la puerta está decidida y ya no aprende; cerca de 0.5 está indecisa pero maximalmente educable.

Mensaje. Caso churn telco del curso: una puerta aprendida puede decidir "si el cliente acaba de llamar a soporte (xt), olvida la inercia de silencio acumulada". Las tres puertas de la LSTM (olvido, entrada, salida) son tres copias de este mecanismo con pesos distintos. La siguiente slide las ensambla.

Términos. σ: sigmoide, fracción de paso en (0, 1). : producto de Hadamard, componente a componente. τ: temperatura, brusquedad de la decisión. [ht−1, xt]: concatenación de memoria de trabajo y entrada nueva, el "contexto" que mira la puerta.

las ecuaciones de esta slide
ft = σ(Wf[ht−1,xt]+bf)   it = σ(Wi[ht−1,xt]+bi)   C̃t = tanh(WC[ht−1,xt]+bC)(Ec. 4a)
olvido ft: qué fracción de la memoria vieja sobrevive. Entrada it: qué fracción del contenido nuevo entra. Candidatot: el contenido nuevo propuesto (en (−1, 1), con signo). Las tres miran el mismo contexto [ht−1, xt] con pesos distintos.
Ct = ft ⊙ Ct−1 + it ⊙ C̃t,    ot = σ(Wo[ht−1,xt]+bo),   ht = ot ⊙ tanh(Ct)(Ec. 4b)
la célula Ct se actualiza con una mezcla aditiva: conserva ft partes de lo viejo y añade it partes de lo nuevo — sin pasar por ninguna tanh que la aplaste. La salida ot decide qué fracción de la memoria se publica como ht: la LSTM puede recordar sin contar lo que recuerda.
guion paso a paso
  1. Sin forzar nada, lee la fila t = 1 de la tabla. f1 = 0.646, i1 = 0.668, C̃1 = 0.604, C1 = 0.404, o1 = 0.690, h1 = 0.264: exactamente los números del ejemplo a mano del deck. La simulación ES esa cuenta, repetida 8 pasos.
  2. Activa "forzar f" con f = 1 y "forzar i" con i = 0. Ct se congela en C0 = 0 para siempre: memoria perfecta de lo inicial, sorda a las entradas. Las puertas en los extremos son los modos puros "solo recordar" / "solo escuchar".
  3. Pon f = 0 (forzada) e i = 1 (forzada). Ct = C̃t en cada paso: la célula se reescribe entera cada semana, igual que la RNN básica. La RNN es el caso particular "olvido total".
  4. Desactiva f e i, activa "forzar o" con o = 0. ht = 0 en todos los pasos aunque Ct siga evolucionando por dentro (míralo en el canvas): la red puede acumular evidencia en silencio y publicarla semanas después.
Comprueba que entiendes: ¿por qué C1 = 0.404 no depende de f1?
Porque C1 = f1·C0 + i1·C̃1 y C0 = 0: la puerta de olvido multiplica una memoria que aún está vacía, así que su valor 0.646 es irrelevante en t = 1. Solo cuenta el término de entrada 0.668 × 0.604 = 0.404. Desde t = 2 la cosa cambia: C1 ≠ 0 y f2 ya decide cuánto de ese 0.404 sobrevive. Si lo ves en la tabla, has entendido la aritmética de la célula.

Setup. LSTM escalar con los pesos del deck: Wf = 0.5, Wi = 0.8, WC = 0.7, Wo = 0.6 (cada peso multiplica a ht−1 y a xt), sesgos bf = 0.1, bi = −0.1, bC = 0, bo = 0.2, estado inicial h0 = C0 = 0. La secuencia de entrada empieza con los x1 = 1.0 y x2 = 0.5 del deck y sigue 6 pasos más (una mini serie de demanda normalizada). El canvas pinta Ct (dorado), ht (tinta) y xt (gris); la tabla da las seis columnas por paso.

Juega. Los tres pares checkbox + slider hacen un experimento imposible en una red entrenada: fijar una puerta a mano en todos los pasos y ver qué papel jugaba. Forzar f es decidir cuánto pasado sobrevive; forzar i, cuánto presente entra; forzar o, cuánto se publica.

Lee así. La fila t = 1 de la tabla reproduce el ejemplo a mano del deck (redondeos incluidos); el resto de filas es la misma cuenta iterada. El lector resume C8, h8 y la media de cada puerta.

Mensaje. En el forecast de demanda, f aprende a conservar la fase estacional, i aprende a dejar entrar el efecto de una promo, y o aprende a no contaminar la predicción de esta semana con memoria irrelevante. Tres decisiones de negocio, tres puertas, una célula.

Términos. ft, it, ot ∈ [0,1]: puertas de olvido, entrada y salida. t: candidato, contenido nuevo propuesto. Ct: célula, memoria de largo plazo. ht: estado oculto publicado, lo que ven las capas siguientes.

las ecuaciones de esta slide
Ct = f ⊙ Ct−1 + i ⊙ C̃t  ⇒  ∂CT∂CT−L = j=T−L+1..T fj(camino aditivo)
la actualización de la célula es lineal en Ct−1: ninguna tanh la aplasta por el camino. Su jacobiano por paso es la propia puerta fj, no Wh·tanh′. Con fj ≈ 1, el producto se queda ≈ 1: el gradiente viaja por la "autopista de la célula" sin peajes.
RNN: j Wh(1−hj²)   frente a   LSTM: j fj,   con fj = 0.95:  0.955 = 0.774
los dos productos, lado a lado. El deck daba los números estilizados: tras 5 pasos el gradiente RNN cae a ≈ 0.04 y el de la LSTM se mantiene en ≈ 0.77. Aquí ambos se calculan en vivo: el de la LSTM como ∏fj con la f del slider (0.955 = 0.774, el del deck), y el de la RNN sobre la recurrencia real de la slide 3 — que, medio saturada, cae incluso más rápido que el 0.04 de pizarra.
guion paso a paso
  1. Con f = 0.95, lee en el lector el gradiente LSTM a 5 pasos. 0.774: el "se mantiene en ≈ 0.77" del deck es literalmente 0.955. El gradiente RNN de al lado ronda 10−4: la recurrencia real, medio saturada, es aún más cruel que el ≈ 0.04 estilizado de la pizarra.
  2. Sube f a 1.00 con i = 0. El pulso de demanda inyectado en t = 1 sigue intacto en C40 y el gradiente a 39 pasos vale exactamente 1: memoria perfecta, gradiente perfecto. Este es el caso límite que la RNN no puede alcanzar con ningún Wh.
  3. Baja f a 0.7. La memoria del pulso muere en ≈ 10 semanas y el gradiente LSTM decae como 0.7L: la LSTM también puede olvidar — la diferencia es que elige la tasa, no se la impone la arquitectura.
  4. Sube Wh de la RNN rival a 1.3. Su gradiente pasa de desvanecerse a explotar sin pasar por "estable": en la curva log se ve que la RNN no tiene ningún ajuste que lo deje plano. La línea de la LSTM con f ≈ 1 sí es plana: esa es toda la tesis de la slide.
Comprueba que entiendes: si f = 1 nunca olvida, ¿por qué no fijamos f = 1 siempre?
Porque no olvidar también es un error: la memoria acumularía residuos de todas las promos, festivos y rachas pasadas (con i > 0, Ct crece sin freno: súbelo y míralo). El régimen de demanda de hace dos años puede ser irrelevante tras un cambio de surtido. El punto de la LSTM no es "f = 1", es que f es aprendible y contextual: f ≈ 1 mientras la información siga vigente y f ↓ cuando xt diga "borrón y cuenta nueva". La RNN no tiene ese mando: su tasa de olvido la fija Wh·tanh′, igual para todo y para siempre.

Setup. Aíslo el mecanismo estrella de la LSTM. Arriba: la célula como cinta transportadora: inyecto un pulso C̃1 = 1 ("una promo excepcional en la semana 1") y dejo correr Ct = f·Ct−1 + i·C̃t durante 40 semanas con puertas fijas (las demás C̃t traen ruido pequeño de demanda). Abajo: |gradiente| frente al retardo L en escala log, para la LSTM (∏f = fL, dorado) y para la RNN rival (∏Wh(1−h²) calculado sobre la recurrencia real con demanda normalizada, tinta).

Juega. f es la tasa de retención de la cinta; i, cuánto ruido nuevo se sube a ella; Wh mueve a la RNN rival entre sus dos únicos destinos (desvanecerse o explotar).

Lee así. En el panel log, la LSTM es una recta de pendiente log f, ajustable hasta pendiente 0; la RNN es una recta cuya pendiente no puedes anular porque tanh′ < 1 siempre. Mismo gráfico, dos geometrías: ese es el teorema visual del día.

Mensaje. "La célula Ct es un canal de gradiente": la frase del deck, demostrada con el producto calculado en vivo. Por esto la LSTM aprende la estacionalidad anual (retardo 52) que a la RNN básica le llega con gradiente 10−10.

Términos. Cinta transportadora: la línea Ct−1 → Ct, solo multiplicada por f y sumada con i·C̃. Camino aditivo: actualización sin no-linealidad que aplaste el estado. ∏fj: jacobiano acumulado de la célula, controlado por la red.

las ecuaciones de esta slide
zt = σ(Wz[ht−1,xt])   rt = σ(Wr[ht−1,xt])   h̃t = tanh(Wh[rt⊙ht−1, xt])(Ec. 5a, GRU)
update zt: cuánto se renueva el estado. Reset rt: cuánto pasado se consulta al proponer el candidato h̃t. No hay célula C aparte: la memoria y la salida son el mismo vector ht.
ht = (1−zt)⊙ht−1 + zt⊙h̃t(Ec. 5b)
la mezcla GRU es una media ponderada: lo que no se renueva (1−z) se conserva tal cual. Compárala con la LSTM: f e i fusionadas en una sola puerta con la ligadura f = 1−i. El camino aditivo sigue ahí (∂ht/∂ht−1 ⊃ (1−zt)), por eso la GRU también aprende dependencias largas.
#params por capa:  RNN: 1·P   GRU: 3·P   LSTM: 4·P,   P = dh(dh+d) + dh
cada "bloque" P es una matriz dh×(dh+d) más su sesgo. La RNN tiene 1 bloque, la GRU 3 (z, r, h̃) y la LSTM 4 (f, i, C̃, o): de ahí el 25% de ahorro de GRU frente a LSTM, y el crecimiento cuadrático en dh de ambas.
guion paso a paso
  1. Con dh = 64 y d = 5 (la receta PyTorch del deck), lee el lector. LSTM ≈ 18k parámetros por capa, GRU ≈ 13.4k: el ahorro es exactamente 25%, porque 3 bloques frente a 4.
  2. Sube dh a 512. LSTM supera el millón de parámetros por capa. En el panel log-log la curva tiene pendiente 2: doblar dh cuadruplica los parámetros, porque domina el término dh×dh.
  3. Con dh = 512, sube d de 1 a 20. Los parámetros apenas se mueven: añadir features de calendario o promo es casi gratis; lo caro es el estado. Dimensiona dh, no temas a las covariables.
  4. Baja dh a 8. Unos cientos de parámetros: para un SKU con 156 semanas de histórico, esto es lo honesto. Con 18k parámetros y 156 datos, el modelo memoriza el histórico en vez de aprenderlo.
Comprueba que entiendes: ¿dónde está la puerta de olvido en la GRU?
Escondida en zt. En la LSTM, olvidar (f) y escribir (i) son decisiones independientes: puede conservar todo Y añadir algo. La GRU las ata: conserva exactamente lo que no renueva (1−z). Pierde un grado de libertad y una memoria privada (la C que no se publica), a cambio de un 25% menos de parámetros y un estado único más simple. Por eso la regla práctica del deck: dataset pequeño o dependencias moderadas → GRU primero; dependencias muy largas con memoria interna rica → LSTM.

Setup. Las fórmulas de la GRU están en el panel; aquí se cuantifica la diferencia de tamaño. Arriba: parámetros por capa de RNN, GRU y LSTM para los dh y d de los sliders (barras, con la memoria en KB/MB para float32 = 4 bytes por parámetro). Abajo: parámetros frente a dh en escala log-log, con tu dh marcado: las tres curvas son paralelas (misma pendiente 2), separadas por los factores 1, 3, 4.

Juega. El conteo es exacto, no aproximado: P = dh(dh+d)+dh por bloque (matriz sobre la concatenación más sesgo), por el número de bloques de cada arquitectura. Es el mismo número que te daría sum(p.numel() for p in model.parameters()) en PyTorch para una capa.

Lee así. El coste en memoria casi nunca es el problema (ni un MB); el problema es la razón parámetros/datos. El lector la calcula para un histórico de 156 semanas: cuando supera ≈ 10, enciende la alarma de sobreajuste.

Mensaje. "Si dudas entre LSTM y GRU, prueba GRU primero: menos parámetros, menos riesgo" (deck). En forecasting de retail el dataset por SKU es corto: el 25% de ahorro no es elegancia, es regularización.

Términos. zt: puerta de actualización (cuánto se renueva). rt: puerta de reset (cuánto pasado consulta el candidato). P: parámetros de un bloque puerta/candidato. float32: 4 bytes por parámetro.

las ecuaciones de esta slide
DW = { ( [xt−W+1,…,xt],  xt+1 ) :  t = W,…,T−1 },   |DW| = T−W
la ventana deslizante convierte una serie en un dataset supervisado: cada ejemplo es "las W últimas semanas" (entrada) y "la semana siguiente" (etiqueta). Es el puente entre el mundo secuencial y el aprendizaje supervisado de los días anteriores: la X es una matriz (T−W)×W y la y, un vector.
tensor PyTorch:  x ∈ ℝ(batch, T, n_features)  —  aquí (T−W, W, 1)
la forma que espera nn.LSTM(batch_first=True) en la receta del deck: cada fila del dataset es una secuencia corta de longitud W con 1 feature. El split temporal train/test corta por una fecha, nunca al azar.
guion paso a paso
  1. Mueve "ejemplo n.º" de 0 a tope con W = 6. La caja dorada se desliza semana a semana por la serie: cada posición fabrica un ejemplo. De UNA serie de 156 semanas salen 150 ejemplos: así se consigue dataset donde parecía no haberlo.
  2. Sube W a 20. El lector baja a 136 ejemplos y la matriz de abajo se ensancha: ventana más larga = más contexto por ejemplo, menos ejemplos y más parámetros aguas abajo. Es un dial de sesgo-varianza, no un detalle de implementación.
  3. Con W = 2, mira la matriz de abajo. Las diagonales doradas (semanas de pico estacional) atraviesan las filas: cada valor de la serie aparece en W filas distintas, como entrada en varias posiciones y una vez como etiqueta.
  4. Fíjate en la línea vertical de la matriz. Separa las columnas de entrada (lags) de la columna etiqueta yt = xt+1: a su izquierda, lo que el modelo ve; a su derecha, lo que debe acertar.
Comprueba que entiendes: ¿por qué el split train/test se hace por fecha y no aleatorio?
Porque las filas del dataset comparten semanas: el ejemplo t y el t+1 se solapan en W−1 valores. Con split aleatorio, una fila de test casi idéntica a una de train se cuela en el entrenamiento — fuga de información — y el MAPE de test sale artificialmente bajo. Cortando por fecha (aquí: últimas 32 semanas a test), el modelo se evalúa como va a vivir: prediciendo un futuro que no ha visto. En forecasting, validar mal es la forma más cara de mentirse.

Setup. La misma serie de demanda de todo el día. Arriba: la serie con el ejemplo elegido resaltado: caja dorada = las W semanas de entrada, punto dorado = la etiqueta xt+1. Abajo: el dataset entero como matriz de color (cada fila un ejemplo, cada columna un lag; rampa blanco→dorado→sepia = demanda baja→alta), con la columna etiqueta separada por la línea vertical y la franja de test marcada a la derecha.

Juega. W controla cuánto pasado ve cada ejemplo. La estacionalidad anual necesita W ≈ 52 para ser visible en la ventana… o un modelo con memoria (LSTM) que la arrastre en su estado: esa es la diferencia profunda entre ensanchar la ventana y tener célula.

Lee así. El lector da |DW| = T−W, la forma de la matriz X y el reparto train/test (124/32 menos los W de arranque). La matriz de abajo ES el tensor que entra a nn.LSTM, aplastado a 2D para poder mirarlo.

Mensaje. Todo el aparato de los días 02–05 (datasets, train/test, MLP, regresión) se recicla: la serie temporal solo necesitaba este puente. La siguiente slide entrena de verdad un modelo sobre estas filas.

Términos. Lag: valor retardado xt−j usado como feature. W: tamaño de ventana. Fuga de información: que el test contamine el train por solapamiento temporal. batch_first: convención PyTorch (batch, T, features).

las ecuaciones de esta slide
t+1 = w0 + Σj=1..W wj xt+1−j,   ŵ = argminw Σtrain(xt+1−x̂t+1
el modelo se entrena en vivo en tu navegador: regresión lineal sobre la ventana (un modelo autorregresivo AR(W)), resuelta exactamente con las ecuaciones normales (XX+λI)w = Xy por eliminación gaussiana cada vez que mueves un slider. Es el "primer prototipo honesto" contra el que el deck manda comparar cualquier LSTM.
MAPE = 1NΣt|xt−x̂txt|,    coste = Σt cu·máx(xt−st,0) + co·máx(st−xt,0)(Ec. 6 + negocio)
MAPE es la métrica estándar de retail (error porcentual medio). Pero el negocio paga en euros asimétricos: producir st = x̂t+s unidades cuesta cu € por unidad que falta (venta perdida) y co € por unidad que sobra (almacenaje y rebaja). El colchón s óptimo NO es 0 cuando cu ≠ co.
guion paso a paso
  1. Sube W de 1 a 12 mirando el MAPE de test. De W = 1 (naive: mañana = hoy) a W ≈ 4–6 mejora claramente; después se estanca o empeora: más lags = más parámetros con las mismas 124 semanas.
  2. Con W = 6 y s = 0, lee el coste anual en el lector. Con cu = 15 y co = 4, el coste con s = 0 NO es el mínimo de la curva de abajo: el forecast insesgado no es la decisión óptima.
  3. Arrastra s hasta el valle de la curva dorada. El óptimo está en s > 0: como faltar cuesta 15 € y sobrar 4 €, conviene producir por encima del forecast. Compara con s* del lector (el percentil cu/(cu+co) ≈ 79% de los errores).
  4. Iguala cu = co = 10. El valle se centra en s ≈ 0: con costes simétricos, el mejor colchón es no tenerlo. La asimetría de costes, no el modelo, es quien fija el sesgo óptimo.
Comprueba que entiendes: ¿puede bajar el coste sin bajar el MAPE?
Sí, y lo acabas de hacer: al mover s no cambia el modelo (mismas predicciones, casi mismo MAPE; de hecho el MAPE empeora ligeramente con s ≠ 0) y sin embargo el coste cae porque los errores se redistribuyen hacia el lado barato. MAPE mide simetría estadística; el negocio paga asimetría económica. Por eso un forecaster de demanda se evalúa SIEMPRE en las dos escalas: la métrica para comparar modelos, los euros para tomar la decisión (cuánto producir). Es el problema del vendedor de periódicos (newsvendor) asomando dentro del deep learning.

Setup. Entrenamiento real en el navegador: con la serie del día construyo el dataset de ventanas, corto por fecha (test = últimas 32 semanas), resuelvo la regresión AR(W) exacta sobre el train y predigo el test a un paso. Arriba: demanda real del test (tinta) frente a la producción decidida x̂t+s (dorado); las zonas sombreadas marcan faltantes (venta perdida) y sobrantes (rebaja). Abajo: el coste total del test en función del colchón s, con tu s actual (punto) y el mínimo (marca).

Juega. W cambia el modelo (se re-entrena al instante); s, cu y co cambian la decisión y su precio. Los dos planos — estadístico y económico — se mueven por separado a propósito.

Lee así. El lector da MAE y MAPE de test, el coste anual en euros con tu s, y el s* teórico del newsvendor: el percentil cu/(cu+co) de los errores de forecast en train. Que el valle empírico y s* coincidan razonablemente es la teoría funcionando.

Mensaje. Este AR lineal es el baseline que la práctica del curso (Online Retail II) obliga a batir con la LSTM de PyTorch del deck. Si la LSTM no lo supera en MAPE de test, ARIMA/ETS o este AR son la opción honesta: las features exógenas (promo, precio, calendario), no la arquitectura, suelen ser lo que desequilibra la balanza.

Términos. AR(W): modelo autorregresivo de orden W. MAE / MAPE: error absoluto medio / porcentual medio. cu, co: coste unitario de faltante (understock) y sobrante (overstock). Newsvendor: el colchón óptimo es el cuantil cu/(cu+co) del error.

las ecuaciones de esta slide
recursiva:  x̂t+2 = f(t+1, xt,…),  x̂t+3 = f(t+2, x̂t+1,…), …
la estrategia recursiva: un solo modelo a un paso, aplicado h veces realimentando sus propias predicciones como si fueran datos. Barata y coherente, pero el error se compone: a horizonte k, el modelo lleva k−1 entradas inventadas por él mismo.
directa:  x̂t+k = fk(xt,…,xt−W+1)  para cada k = 1,…,h     MAPE(k) = mediat|xt+k−x̂t+kxt+k|
la estrategia directa: un modelo distinto fk por horizonte, cada uno entrenado para predecir a k semanas solo con datos reales. h modelos en vez de 1, pero sin realimentación de errores. El panel inferior mide MAPE(k) de ambas en vivo sobre el tramo de test.
guion paso a paso
  1. Con h = 6 y W = 6, compara las dos curvas de abajo y el MAPE(1) del lector. A horizonte 1 son clavadas (la directa con k = 1 ES el modelo a un paso) y a 6 semanas ambas suben suave, de ≈ 4.6% a ≈ 6.5%: en horizontes cortos la estrategia casi no importa.
  2. Sube h a 26 (medio año, el horizonte de compra de temporada) y mira la curva dorada. La recursiva se compone: de ≈ 5% en k = 1 a ≈ 16–17% en k ≈ 8–10, el triple, por realimentar sus propios errores… y luego baja al volver a engancharse a la fase estacional que el AR extrapola.
  3. Sin tocar h, sigue la curva discontinua. La directa gana en horizontes medios (k = 5–12) pero a partir de k ≈ 14 se dispara hasta el 24–27%: cada fk tiene que saltar k semanas de golpe y, con la tendencia del test fuera del rango de train, extrapola mal. Ninguna estrategia domina en todos los plazos.
  4. Baja W a 2 con h = 26. Sorpresa: la recursiva aguanta dignamente incluso a 26 semanas, porque un AR(2) basta para codificar una oscilación senoidal y al iterarlo extrapola la estación casi limpia. Sube W a 12 y verás a ambas degradarse a horizonte largo: más parámetros, dinámica más frágil al iterar.
Comprueba que entiendes: ¿por qué Inditex usa horizontes distintos para producción, distribución y rebajas?
Porque el error crece con el horizonte, y cada decisión tolera un error distinto. Producir (6 semanas vista) se decide con un forecast peor — por eso se produce con colchón y flexibilidad de proveedor. Distribuir a tienda (2 semanas) usa un forecast mucho mejor y ajusta lo que la producción decidió a ciegas. Las rebajas corrigen al final lo que quedó. La curva MAPE(k) que acabas de generar es exactamente el "presupuesto de error" que asigna cada decisión a su horizonte: el modelo es uno, las decisiones se cuelgan de puntos distintos de la curva.

Setup. El mismo AR(W) de la slide anterior, ahora pidiendo h semanas de golpe. Arriba: el final del train (tinta), la demanda real del test (gris), la trayectoria recursiva (dorado) y la directa (dorado profundo, discontinua) desde la última semana de train. Abajo: MAPE por horizonte k, promediado sobre todos los anclajes posibles dentro del test (cada anclaje hace su forecast de h pasos y se agregan los errores absolutos por k): es una evaluación honesta, no una sola trayectoria con suerte.

Juega. h fija cuántas semanas hacia delante pides; W, cuánto pasado real ve el modelo. Los dos modelos se re-entrenan al mover W: la directa ajusta h regresiones, una por horizonte.

Lee así. La pendiente de MAPE(k) es el precio del futuro: plana cerca de k = 1 y creciente después, pero las dos estrategias fallan por causas distintas. La recursiva acumula sus propios errores (su joroba en horizontes medios); la directa pierde datos efectivos y extrapola fuera de rango en horizontes largos. La estacionalidad, que el AR iterado extrapola bien, es quien re-engancha a la recursiva; el ruido s marca el suelo común de ambas curvas.

Mensaje. "Multipaso: recursiva o directa" (nota técnica), ya no como definición sino como decisión medida en vivo: ninguna domina en todos los plazos, así que se elige mirando la curva MAPE(k) en el horizonte donde tu decisión vive. Y el puente al Día 07: un Transformer con atención predice horizontes largos mirando directamente las semanas relevantes del pasado, sin arrastrar un estado paso a paso.

Términos. Horizonte h: nº de pasos a futuro pedidos. Anclaje: semana desde la que se lanza un forecast multipaso. Recursiva: 1 modelo realimentado. Directa: h modelos, uno por horizonte.

Datos secuenciales → dataset supervisado
Slides: Serie · Ventana
"Una serie de demanda es tendencia + estacionalidad + ruido, y el orden es la información. La ventana deslizante la convierte en pares (W semanas → semana siguiente): T−W ejemplos, split por fecha, jamás aleatorio."
La RNN y su defecto estructural
Slides: RNN · Gradiente
"ht = tanh(Whht−1+Wxxt+b) comprime todo el pasado con una sola regla compartida. Pero el gradiente atraviesa ∏Wh·tanh′: explota si el factor pasa de 1, se desvanece si no llega. A 30 semanas de retardo, la RNN básica ya no aprende."
LSTM y GRU: puertas sobre una cinta
Slides: Puerta σ · LSTM · Cinta C · GRU
"La sigmoide es un if-else diferenciable. Tres puertas (olvido, entrada, salida) gobiernan una célula aditiva Ct = f⊙Ct−1+i⊙C̃t cuyo gradiente es ∏fj: con f≈1, memoria y gradiente viajan intactos. La GRU hace lo mismo con 3 matrices en vez de 4: 25% menos parámetros, primera opción con datasets cortos."
Del forecast a la decisión en euros
Slides: Forecast · Multipaso
"Un AR(W) entrenado en vivo fija el baseline honesto: MAE y MAPE en test. El negocio paga costes asimétricos (cu faltante, co sobrante): el colchón óptimo es el cuantil cu/(cu+co) del error, no cero. Y el error crece con el horizonte h: cada decisión (producir, distribuir, rebajar) se cuelga de su punto de la curva MAPE(k), y la estrategia multipaso (recursiva o directa) se elige mirándola."

En una frase. Las redes recurrentes convierten "el pasado" en un estado que viaja; las puertas de la LSTM/GRU deciden qué sobrevive en ese estado, arreglando el gradiente por diseño; y un forecast solo vale lo que valen los euros de las decisiones que alimenta. Próximo día: la atención sustituye al estado viajero mirando directamente las semanas relevantes.

Garrido-Merchán — ecgarrido@comillas.edu — Deep Learning para Business Analytics — Día 06 · RNN, LSTM y GRU para forecasting