English · Español
03 — Conexiones residuales y la autopista del gradiente¶
🇪🇸 Una conexión residual (residual connection) es
y = x + f(x): la entrada salta encima de la transformación. Esto da dos cosas: red profunda que entrena (porque el gradiente tiene una autopista que no se evapora) y un paisaje de optimización mucho más suave.
La idea de 2015 que lo cambió todo¶
En 2015, He et al. publicaron ResNet. El número estrella era una red convolucional de 152 capas en ImageNet, cuando 30+ capas habían sido el techo práctico previo. El único cambio: cada bloque se envolvía en una conexión residual:
donde \(f\) es el "camino de pesos" del bloque — típicamente dos convoluciones con una normalización y una activación. El "skip" — el término x desnudo a la derecha — no hace trabajo, no tiene parámetros aprendibles, ni FLOPs. Y aun así fue la diferencia entre entrenable e inentrenable a 100+ capas.
La razón tiene dos mitades:
- La condición inicial del forward es la identidad. Si \(f\) se inicializa pequeña, \(f(x) \approx 0\), así que \(y \approx x\). Apilar \(L\) bloques inicialmente calcula la función identidad. La optimización empieza desde una buena función (no ruido aleatorio) y la mejora.
- Autopista del gradiente en el backward. El Jacobiano se descompone:
El término identidad siempre lleva el gradiente de vuelta. Incluso si \(\partial f / \partial x\) tiene autovalores diminutos, el gradiente a través de x nunca es menor que el gradiente a través de y. Los gradientes desvanecidos quedan mayormente curados.
El aprendizaje profundo moderno se apoya en estas dos mitades.
Por qué la inicialización-identidad importa (forma amigable para Borja)¶
Imagina que apilas 100 capas sin residuales. En la inicialización, \(f_L(f_{L-1}(\dots f_1(x)))\) es una composición 100 veces de mapas casi aleatorios. La salida es esencialmente ruido. La pérdida es enorme. El gradiente es enorme, se recorta o se vuelve NaN, el entrenamiento colapsa.
Apila en su lugar 100 bloques residuales. En la inicialización con \(f_l \approx 0\), la salida de la red es aproximadamente \(x\) misma. La pérdida es la que tendría una red identidad de 1 capa — normalmente bien, definitivamente no degenerada. El gradiente está sano. El entrenamiento empieza.
Entonces, lentamente, cada \(f_l\) aprende a añadir una pequeña corrección. La función \(y(x)\) se convierte en \(x + \sum_l (\text{pequeñas contribuciones})\). La red está parametrizada como un residuo respecto a la identidad, lo cual es una parametrización inicial mucho mejor que "una función arbitraria de 100 capas".
Esta perspectiva a veces se expresa como "las redes profundas aprenden perturbaciones a la identidad, no funciones arbitrarias". Es un modelo mental útil.
El argumento del Jacobiano / autopista del gradiente formalmente¶
Para una cadena \(y_L = y_{L-1} + f_L(y_{L-1})\), el Jacobiano total es:
Expandiendo el producto (formalmente):
El primer término es la identidad — garantizadamente no nula, garantizadamente de rango completo. Los términos restantes añaden correcciones de las capas aprendidas. Crucial: el gradiente de vuelta a \(y_0\) tiene como mínimo un camino de Jacobiano unitario garantizado (el término identidad), sin importar lo que estén haciendo las capas aprendidas.
Contrasta con una cadena no residual \(y_L = f_L(f_{L-1}(\dots f_1(y_0)))\):
Un producto de \(L\) Jacobianos. Si cada uno tiene norma espectral < 1 (típico en redes entrenadas), la norma del producto se encoge geométricamente: el gradiente en \(y_0\) es exponencialmente pequeño. Este es el problema del gradiente desvanecido, y es por lo que las redes profundas pre-ResNet necesitaban trucos cuidadosos (inicialización ortogonal, LSTMs, etc.) para entrenar.
Pre-LN vs Post-LN — la pregunta de la ubicación del residual¶
El transformer pone un LayerNorm en el bloque residual. ¿Dónde?
Post-LN: $$ y = \text{LN}(x + f(x)) $$
La norm envuelve la totalidad de la salida residual. Gradiente:
El Jacobiano de LayerNorm escala toda la contribución residual. El Jacobiano de LayerNorm depende de la varianza de la entrada y generalmente no es cercano a la identidad — puede amplificar o atenuar. Compuesto sobre \(L\) bloques, las normas del gradiente derivan.
Pre-LN: $$ y = x + f(\text{LN}(x)) $$
La norm está dentro de la rama de \(f\). Gradiente:
La identidad se preserva incondicionalmente. El LayerNorm sólo afecta a la rama aprendida.
Consecuencia empírica. Los transformers originales (Post-LN) divergen sin warmup de learning rate. Los transformers Pre-LN entrenan establemente sin warmup. Los LLMs modernos son todos Pre-LN. Usa Pre-LN como default en todo lo que construyamos desde la Fase 17 en adelante.
(Excepción: unas pocas arquitecturas exóticas de 2023+ revisitan Post-LN con trucos extra — Sandwich LN, DeepNorm. Fuera de alcance.)
El truco de inicialización γ a cero¶
Un truco sutil de Pre-LN: si la proyección de salida del bloque se inicializa a cero (o el parámetro afín del norm del bloque \(\gamma\) se inicializa a cero), toda la rama \(f\) produce cero en el paso 0. La red es exactamente la identidad en la inicialización.
Algunas recetas recientes (p. ej., NormFormer, FixUp) se apoyan en esto para estabilidad extra-profunda. La Fase 17 puede que sí o que no — depende de si los modelos profundos que entrenemos lo necesitan.
Diagrama¶
Pre-LN block Post-LN block
──────────── ─────────────
x x
│ │
├──────► LN ──► f ──► + ─► y │
│ ▲ ├──────► f ─► + ─► LN ─► y
│ │ │ ▲
└─────────────────────┘ └──────────────┘
(residual) (residual)
Los dos diagramas se parecen casi idénticamente — y el álgebra sólo difiere en dónde se sitúa LN. La dinámica de entrenamiento difiere en órdenes de magnitud.
¿Qué pasa si quitas los residuales?¶
El Lab 03 ejecutará esto:
- Entrenar un MLP de 50 capas sin residuales. Trazar la norma del gradiente en la capa 1 a lo largo del entrenamiento.
- Entrenar el mismo MLP de 50 capas con residuales. Mismo gráfico.
Esperado: sin residuales muestra la norma del gradiente en la capa 1 cayendo por debajo de \(10^{-7}\) en los primeros 100 pasos (desvanecida). Con residuales se mantiene en \([10^{-3}, 10^{-1}]\) durante todo el entrenamiento.
Esta es la demostración empírica del argumento de autopista del gradiente en la máquina de Borja.
Redes profundas no residuales — ¿qué trucos compensaban?¶
Antes de ResNet, la gente construía redes profundas vía:
- Pérdidas auxiliares en capas intermedias (Inception-v1 añadió dos clasificadores laterales). Fuerza señal de gradiente en las capas tempranas sin residuales.
- Highway networks (Srivastava et al. 2015) — gating explícito: \(y = T(x) \cdot f(x) + (1 - T(x)) \cdot x\). Una interpolación aprendible entre identidad y transformación. El residual es "highway con \(T = 1\)" — más simple, mismo beneficio.
- Inicialización ortogonal cuidadosa para mantener el espectro del Jacobiano cerca de la unidad. Funciona hasta ~30 capas; no escala.
Después de ResNet, todas estas fueron silenciosamente reemplazadas por residuales. El residual es estrictamente más fácil y más fuerte.
Un punto sutil: el residual no es un "shortcut"¶
Una lectura errónea común: "el residual es un atajo alrededor de la capa; la red aprende a usar el atajo cuando quiere". Erróneo. El residual está siempre activo, no gated. El bloque está parametrizado como \(y = x + f(x)\) incondicionalmente. La red puede aprender \(f(x) = 0\) (efectivamente sortear el bloque) o \(f(x) =\) algo no trivial; cualquiera de las dos está bien.
La Highway network sí tiene gating; el bloque residual no. La simplificación (eliminar la gate) fue una mejora estricta.
Dónde importa esto en el currículo¶
- Fase 15 (attention): la atención se envuelve en un bloque residual.
- Fase 17 (bloque transformer): el residual Pre-LN es el bloque canónico.
- Fase 21 (dinámica de entrenamiento): el paisaje de pérdida bajo residuales tiene un condicionamiento demostrablemente mejor (Li et al. 2018).
- Fase 24 (Triton / framework): los bloques residuales de PyTorch son 3 líneas de código — pero entenderás la matemática que hay detrás.
Problemas de práctica¶
Soluciones en solutions/03-residuals-ref.md (apertura de fase).
- Para una pila residual de 30 bloques con cada \(f_l\) teniendo Jacobiano con norma espectral \(\rho < 1\), deriva una cota superior para la desviación del Jacobiano total respecto a la identidad. (Pista: expande el producto, usa una serie geométrica.)
- Esboza por qué un bloque residual con \(f(x) = -x\) sería patológico. (Pista: ¿qué calcula \(y = x + (-x)\)? ¿Cómo se ve el gradiente?)
- En Pre-LN con \(f\) inicializada de modo que \(f \approx 0\), el paisaje de pérdida cerca de la inicialización es aproximadamente el de una red de 1 capa aplicada a la entrada. Argumenta por qué esto es mejor que el paisaje de pérdida de una red no residual de 30 capas en la inicialización.
Resumen en un párrafo¶
Una conexión residual \(y = x + f(x)\) hace dos cosas: hace que la condición inicial de la red sea la identidad (que es fácil de optimizar desde ahí), y da al gradiente un camino incondicional de ganancia unitaria de vuelta a las capas tempranas (sin desvanecimiento). Pre-LN (\(y = x + f(\text{LN}(x))\)) es el default moderno porque la norm no se sitúa en el camino residual; Post-LN (\(y = \text{LN}(x + f(x))\)) sí lo hace, y compone la deriva del Jacobiano sobre la profundidad. Sin residuales, los MLPs de 50 capas no pueden entrenar; con residuales, entrenan trivialmente.
Siguiente: theory/04-putting-it-together.md.