Skip to content

English · Español

04 — Juntando init, norm y residual

🇪🇸 Los tres trucos no son aditivos; interactúan. Una buena inicialización dentro de un bloque Pre-LN residual con RMSNorm es la receta canónica de 2026. Aquí mostramos cómo encajan, qué combinaciones son redundantes, y cuál es la apariencia de la curva de pérdida cuando todo está bien.


El bloque canónico de 2026

                        Pre-LN block
                       ──────────────
   x  ──┬──────────────────────────►  +  ──► y
        │                              ▲
        │                              │
        └──► RMSNorm ──► f ─────────────┘

   where f is e.g.   Linear ──► GeLU ──► Linear
                     │                   │
                     │                   └── output projection: init γ small (or 0)
                     └── Kaiming init scaled for GeLU's effective gain (~1.7)

Ese es el ensamblaje. Cada bloque de LLM moderno se ve aproximadamente así — a veces con atención como la f interna, a veces un sub-bloque feedforward. La Fase 17 instanciará esto con atención; la Fase 10 construye los componentes.

Seis perillas:

  1. Activación — GeLU (default), SiLU/Swish (Llama), o ReLU (juguete). Cada una tiene su propia ganancia para la inicialización.
  2. Inicialización — Kaiming con la ganancia correcta para la activación.
  3. Posición de norm — Pre-LN, siempre.
  4. Tipo de norm — RMSNorm en los LLMs modernos; LayerNorm por compatibilidad / investigación clásica; BatchNorm sólo para visión.
  5. Escala residual — típicamente unitaria (sin escalado). Algunas recetas escalan la salida de f por 1/sqrt(L) para redes muy profundas (Bachlechner et al., FixUp).
  6. Inicialización de la proyección de salida — pequeña o cero, para que el bloque empiece como la identidad.

Interacciones entre los tres trucos

Estos no se componen trivialmente. Algunas combinaciones son redundantes; algunas son necesarias en conjunto.

Init + Norm

Mala inicialización + buena norm compensa parcialmente: la primera norm reescala la explosión antes de que se propague. Pero el gradiente aún degenera porque los pesos son malos, aunque las activaciones estén recortadas. Por tanto:

  • Sólo buena inicialización: forward bien para ~10 capas; degrada hacia las ~30 capas.
  • Sólo buena norm: forward bien siempre (la norm lo fuerza); los gradientes de peso del backward aún pueden portarse mal si la inicialización fue lo bastante mala para causar saturación temprana de no linealidad.
  • Buena inicialización + buena norm: limpio para cualquier profundidad probada.

Por esto el experimento estrella del lab 01 mantiene la norm constante (off, o LayerNorm) y varía la inicialización. La variación debe ser visible sin que la norm la cubra.

Init + Residual

Residual sobre una pila mal inicializada: el camino residual salva la señal del gradiente, pero la señal forward aún se ve dominada por la rama aprendida si f es inestable. Así que la red tiene un gradiente sano pero aprende hacia un objetivo ruidoso. Lento.

Residual + inicialización identidad para f (proyección de salida ≈ 0): limpio. La red empieza como la identidad, el gradiente es unitario, el entrenamiento procede suavemente.

Norm + Residual

Esta es la interacción más sutil — y es donde vive Pre-LN vs Post-LN. Relee teoría 03 si lo necesitas.

Los tres

Su combinación es el bloque canónico. Cualquier ausencia es una regresión. Cualquier extra (p. ej., dos norms en un bloque) es bloat.

Un ejemplo trabajado — MLP de 24 capas

Construyamos el MLP de 24 capas que querríamos entrenar.

Arquitectura:

Input → Linear(d, h) → Block × 24 → Linear(h, num_classes)

Block: x ──► RMSNorm ──► Linear(h, 4h) ──► GeLU ──► Linear(4h, h) ──► (add) ──► y
       └─────────────────────────────────────────────────────────────────┘

Con h = 256. Por tanto cada bloque tiene ~256 × 1024 + 1024 × 256 ≈ 530k params; 24 bloques ≈ 13M params. Razonable para entrenamiento en CPU sobre el corpus de la Fase 12.

Inicialización:

  • Linear(h, 4h) interna: Kaiming con ganancia GeLU ≈ 1.7 → \(\sigma_W^2 = 1.7 \cdot 2 / 256 ≈ 0.013\).
  • Linear(4h, h) de salida: misma, pero opcionalmente reducida para inicio identidad.
  • RMSNorm \(\gamma\): inicialización a 1 (estándar).

Comprobación Pre-LN: la norm va primero dentro del bloque; el residual suma la entrada original con la salida interna. ✓

Entrenamiento esperado: si el optimizador de la Fase 18 es Adam con LR ~3e-4, la pérdida debería decrecer suavemente desde el paso 0 sin necesidad de warmup. Predice esto; verifícalo en la Fase 17 cuando lo entrenemos de verdad.

Interacciones de fallo comunes

Ocho cosas que salen sutilmente mal:

  1. Inicialización Kaiming + activación tanh. El factor 2 es excesivo para tanh → las activaciones crecen. Usa Xavier con tanh.
  2. Inicialización Xavier + activación ReLU. La mitad de varianza comparada con Kaiming → las activaciones colapsan. Usa Kaiming con ReLU.
  3. Pre-LN + Post-LN mezclados en el mismo modelo. Sorprendentemente común en código heredado. La mezcla produce escalado de gradiente inconsistente por bloque. Elige uno.
  4. γ = 0 inicializado en RMSNorm. La salida es cero en todas partes. La red no tiene señal. Inicializa γ = 1.
  5. ε fuera de la raíz (cubierto en teoría 02). Fallo silencioso en entradas degeneradas.
  6. BatchNorm en un transformer. No. Desajuste entrenamiento/inferencia + batches efectivos minúsculos (en inferencia autoregresiva).
  7. Sin residual en el salto embedding-al-primer-bloque. La mayoría de los papers sí tienen un residual o proyección ahí. Omitirlo hace que el gradiente del primer bloque se filtre.
  8. Doble normalización — aplicar LayerNorm tanto a la entrada como a la salida del bloque (es decir, Pre-LN y Post-LN). Bloat; mal condicionado.

Cada uno de estos es un objetivo de quiz.

El ejercicio de "predecir la curva de pérdida"

Tras la Fase 10, dada una configuración, deberías ser capaz de esbozar la curva de pérdida antes de entrenar.

Configuración A: "MLP de 12 capas, ReLU, init Kaiming, sin norm, sin residual, batch 64, LR 1e-3, 1000 pasos."

Predicción: la pérdida cae rápido durante ~200 pasos, luego se estanca (el gradiente en la capa 1 se desvanece). Pérdida final > aleatoria, < entrenada. No divergente, no óptima.

Configuración B: "MLP de 12 capas, ReLU, init uniforme[-0.5, 0.5], sin norm, sin residual, batch 64, LR 1e-3, 1000 pasos."

Predicción: la pérdida explota a NaN en 5–20 pasos (explosión del forward pass). O: se recorta en algún punto y luego se estanca cerca de pérdida aleatoria.

Configuración C: "MLP de 30 capas, GeLU, init Kaiming(gain=1.7), RMSNorm Pre-LN, residual, batch 64, LR 3e-4, 1000 pasos."

Predicción: decrecimiento monótono suave, sin pico, sin necesidad de warmup. Pérdida final cercana a un baseline de 2 capas si la tarea es fácil, más baja si la tarea es lo bastante dura para necesitar profundidad.

Si Borja puede emitir estas tres predicciones con confianza, la Fase 10 ha tenido éxito.

Una nota sobre lo que deliberadamente no cubrimos

  • Interacciones del optimizador (AdamW vs SGD-momentum) — terreno de la Fase 9, la Fase 19 profundiza.
  • Schedules de learning rate (warmup, cosine decay) — Fase 19. Pre-LN reduce la necesidad de warmup pero no reemplaza al schedule por completo.
  • Interacciones de weight decay con la normalización. Sutil. Fase 19.
  • Recorte de gradiente. Fase 19.
  • Precisión mixta. Fase 26.

Cada uno de estos interactúa con init/norm/residual de maneras no triviales. Los nombramos ahora para que no sorprendan después.

Resumen en un párrafo

Los tres trucos no son independientes. Una buena inicialización mantiene la señal forward cuerda antes de que la norm tenga que limpiarla; la norm la mantiene cuerda durante el entrenamiento mientras los pesos derivan; el residual mantiene el gradiente fluyendo de vuelta sin importar lo que haga la rama aprendida. El bloque canónico de 2026 es Pre-LN RMSNorm + init escalada Kaiming + residual + GeLU/SiLU. Las variaciones sobre esta receta son todas menores; la receta en sí es lo que hace entrenables a los LLMs profundos. De aquí en adelante, cada arquitectura de la Fase 10+ del currículo usa alguna versión de ella.


Siguiente: lab/00-variance-walk.md.