21 · Retropropagación a través del tiempo (BPTT)
BPTT despliega la RNN en una red feedforward profunda equivalente y ejecuta backprop estándar — todos los trucos de redes profundas se transfieren directamente.
BPTT 'despliega' la RNN en una red feedforward profunda (una capa por paso temporal) y ejecuta backprop estándar — por eso el entrenamiento de RNN es esencialmente entrenamiento de red profunda disfrazado.
Sin esto:
Sin BPTT, los gradientes de la RNN son misteriosos; con él, todos los demás trucos de redes profundas (clipping, ReLU, regularización) se transfieren directamente.
En la lección anterior vimos cómo una RNN procesa una secuencia hacia adelante en el tiempo. Ahora necesitamos entrenarla — lo que significa calcular gradientes y actualizar pesos.
La clave es esta: una RNN que procesa una secuencia de T tokens es matemáticamente equivalente a una red feedforward de T capas donde cada capa tiene pesos idénticos. El estado oculto h_1 se calcula a partir de h_0 y x_1 (capa 1). El estado oculto h_2 se calcula a partir de h_1 y x_2 (capa 2). Y así sucesivamente. Cada "capa" es simplemente un paso temporal.
La Retropropagación a través del tiempo (BPTT) explota esta equivalencia: despliega la RNN, trátala como una red feedforward profunda, y ejecuta backprop ordinario a través del grafo desplegado. El gradiente fluye hacia atrás desde la pérdida en el paso final todo el camino de regreso a través de los pasos T, T-1, T-2, …, 1.
Dado que los pesos son compartidos, el gradiente para cada matriz de pesos (como W_hh) es la suma de contribuciones de cada paso temporal:
∂L/∂W_hh = Σ_{t=1}^{T} ∂L/∂h_t · ∂h_t/∂W_hh
Esta acumulación es la parte "a través del tiempo". Cada paso temporal vota en la actualización.
En la práctica, desplegar a través de 10,000 pasos temporales requeriría 10,000× la memoria de un único pase hacia adelante. La solución práctica es la BPTT truncada: retropropagar solo a través de los últimos K pasos (típicamente K = 20–128), descartar gradientes más lejanos, y deslizar una ventana a través de la secuencia.
Grafo de cómputo desplegado — una RNN de 5 pasos equivale a una red feedforward de 5 capas con pesos atados
Python (in browser)
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
BPTT truncada — el algoritmo de entrenamiento práctico para secuencias largas
Si usas BPTT truncada con K=20 y la RNN procesa una secuencia de 100 tokens, ¿qué pasa con los gradientes de los primeros tokens?
- BPTT despliega la RNN en un grafo feedforward con pesos atados y ejecuta backprop estándar — no se necesita ningún algoritmo nuevo.
- Los gradientes se acumulan a través de pasos temporales: ∂L/∂W_hh = Σ_t contribuciones de cada paso.
- La BPTT truncada (K=20–128 pasos) es obligatoria en la práctica; significa que el modelo no puede aprender dependencias más largas que K tokens.
Cada bucle de entrenamiento de RNN en PyTorch usa BPTT internamente — la llamada a .backward() sobre la pérdida ES BPTT. La BPTT truncada es estándar para el modelado del lenguaje; normalmente se retropropaga a través de 35–128 tokens (el tamaño del fragmento es un hiperparámetro que se ajusta).
Si lo quitas: Llamarías a optimizer.step() en una RNN sin entender que cada actualización de peso es la suma de las contribuciones de 35 pasos temporales — y no tendrías intuición de por qué las ventanas de backprop más largas a veces ayudan pero siempre cuestan más memoria.