Skip to content

English · Español

00 — Por qué la profundidad es difícil, y los tres trucos que la arreglan

🇪🇸 Apilar 20 capas en una red ingenuamente diseñada no funciona: o las activaciones explotan, o el gradiente se evapora, o las distribuciones internas se mueven tanto que cada capa entrena contra una entrada distinta. Tres trucos (init, norm, residual) anularon esos tres modos de fallo y son la razón por la que el aprendizaje profundo (deep learning) moderno funciona.


Lo que el gráfico del libro de texto no muestra

La aproximación universal dice: un MLP de 2 capas con suficientes unidades ocultas puede ajustar cualquier función. A partir de ese teorema, el "aprendizaje profundo" suena redundante — ¿por qué no usar simplemente redes de 2 capas muy anchas?

La respuesta es empírica, no teórica. Las redes anchas y poco profundas son ineficientes en muestras y resistentes a la optimización en comparación con redes profundas y estrechas con el mismo número de parámetros. Las redes profundas generalizan mejor, entrenan con batches más pequeños y producen representaciones más comprimidas y reutilizables. Pero — y aquí está la trampa — las redes profundas ingenuas no entrenan en absoluto.

Si coges el MLP de 2 capas de la Fase 9 y lo apilas 20 capas con inicialización Gaussiana aleatoria y sin normalización, tres cosas van mal, a menudo simultáneamente:

  1. Explosión en el forward pass. Cada capa multiplica las activaciones por una matriz; con mala inicialización, la norma de la activación se duplica en cada capa. La capa 10 satura tanh por todas partes o desborda en ReLU. La capa 20 es ruido sin sentido.
  2. Desvanecimiento en el backward pass. Los gradientes son productos de Jacobianos, capa por capa. Si cada Jacobiano tiene norma < 1, el gradiente de la capa 1 es minúsculo tras 20 multiplicaciones. Las primeras capas nunca se actualizan.
  3. Desplazamiento de covariables interno (internal covariate shift). Incluso cuando forward + backward están sanos en la inicialización, entrenar una capa cambia la distribución que ve la siguiente capa. La siguiente capa estaba sintonizada con la distribución previa; ahora está sintonizándose contra un objetivo móvil. Lento.

Los tres trucos estructurales de la Fase 10 son las tres correcciones:

Modo de fallo Corrección
Explosión en el forward pass Inicialización que preserva la varianza — elegir Var(W) = 1/n_in de modo que Var(y) = Var(x).
Desvanecimiento en el backward pass Conexiones residualesy = x + f(x) permite que el gradiente fluya como 1 + ∂f/∂x, nunca por debajo de 1 en el camino trivial.
Desplazamiento de covariables interno Normalización — re-centrar / re-escalar las activaciones a una distribución conocida en cada capa.

Cada truco es, aislado, una idea pequeña. La combinación — bloques residuales Pre-LN con inicialización Kaiming — es lo que hace entrenable un transformer de 30 capas con un presupuesto fijo. Los construimos en ese orden.

Qué dice realmente "preservar la varianza"

Toma una capa y = W x con W ∈ R^{n_out × n_in}. Asume que W_ij son i.i.d. con media cero y varianza σ², y que x es un vector con Var(x_j) = v (igual para todo j), independiente de W. Entonces por linealidad de la varianza e independencia:

Var(y_i) = Var(Σ_j W_ij x_j) = Σ_j Var(W_ij x_j) = n_in × σ² × v

Si queremos Var(y_i) = v (preservar la varianza a través de la capa), necesitamos σ² = 1 / n_in. Eso es la inicialización Xavier, para la activación lineal o tanh. Para ReLU, la mitad de las activaciones son cero en promedio → la v efectiva se reduce a la mitad → necesitamos σ² = 2 / n_in. Eso es la inicialización Kaiming. Toda la historia de la "teoría de inicialización" para MLPs son variaciones sobre este argumento de 3 líneas.

La página de teoría 01-initialization.md recorre la derivación completa con los supuestos explícitos. Borja debería ser capaz de rehacerla en una pizarra.

Qué dice realmente "normalización"

Una capa de normalización toma las activaciones en algún punto de la red y las re-escala para que la siguiente capa siempre vea una distribución consistente. Hay opciones:

  • BatchNorm. Calcula media y varianza sobre la dimensión del batch. Cada unidad se normaliza usando las estadísticas del batch. Las estadísticas de entrenamiento ≠ las de inferencia; las medias móviles las puentean. Estándar en visión; los LLMs modernos no lo usan.
  • LayerNorm. Calcula media y varianza sobre la dimensión de features, por ejemplo. Sin divergencia entre entrenamiento e inferencia. Estándar en transformers — pero caro (una media + una sustracción de varianza + una escala).
  • RMSNorm. Elimina la sustracción de la media. Sólo divide por el RMS (sqrt(mean(x²))). La mitad de FLOPs, la mitad del memory traffic, estabilidad de entrenamiento comparable. Estándar en los LLMs modernos (Llama, Mistral, … 2026).

La pregunta más profunda — por qué quitar la media no perjudica — es empírica. Los papers de RMSNorm argumentan que el re-escalado es lo que importaba desde el principio; el centrado era incidental. Discutimos el argumento en 02-normalization.md sin afirmar una demostración.

Qué dice realmente "residual"

Un bloque residual es y = x + f(x), donde f es alguna sub-red (p. ej., una capa lineal + activación). Dos cosas se siguen:

  1. Identidad en el forward en el límite. Si f se inicializa para que su salida sea cero (o casi cero — ver el "truco de inicialización Pre-LN γ = 0" en 03-residuals.md), el bloque calcula y ≈ x. Apilar 100 de estos produce una red que, en la inicialización, es simplemente una función identidad. Entonces el entrenamiento mejora la identidad añadiendo pequeñas correcciones. El paisaje de optimización es mucho más fácil que el de una red que comienza como ruido aleatorio.
  2. Autopista de gradiente en el backward. ∂y/∂x = I + ∂f/∂x. El término identidad significa que el gradiente siempre tiene una ruta de vuelta a las capas anteriores, sin importar lo que esté haciendo f. Los gradientes desvanecidos se vuelven improbables. Esta es la perspectiva arquitectónica más importante del aprendizaje profundo moderno, y tardó hasta 2015 (ResNet) en llegar.

03-residuals.md demuestra la afirmación de la autopista del gradiente y recorre Pre-LN vs Post-LN.

Cómo está secuenciada la fase

Páginas de teoría → laboratorios → experimentos, en este orden de dependencias:

  1. Teoría 01 (init) se lee primero porque los laboratorios 00 y 01 la necesitan.
  2. Lab 00 (variance walk) es un laboratorio puro de observación — for layer in net: print(Var(activations)). Ver la explosión.
  3. Lab 01 (ablation de init) — el experimento estrella de tres curvas. Misma arquitectura, tres inits, tres trayectorias de pérdida.
  4. Teoría 02 (norm) desbloquea entonces el laboratorio 02 (ablation de norm, misma arquitectura, tres norms).
  5. Teoría 03 (residual) desbloquea el laboratorio 03 (50 capas con y sin residuales).
  6. Teoría 04 los une; sin código nuevo, sólo una síntesis que adelanta el bloque transformer.

A qué se parece "predecir antes de ejecutar"

Al final de la Fase 10, dada esta configuración:

"MLP de 30 capas, dim oculta 256, activación GeLU, RMSNorm Pre-LN, residual en cada bloque, init Kaiming escalada para GeLU. ¿Entrenará?"

Borja debería ser capaz de responder: , y predecir la forma de la trayectoria de pérdida (descenso suave, sin picos). Dada esta configuración:

"MLP de 30 capas, dim oculta 256, ReLU, sin norm, sin residual, init uniforme [-1, 1]."

Debería responder: no, y predecir el modo de fallo (explosión del forward pass → NaN para el paso 50).

Si esas predicciones aterrizan — antes de ejecutar — la fase ha tenido éxito.


Siguiente: theory/01-initialization.md.