English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

invitado
1 / ?

De Dónde Vienen los Picos de Gradientes

Un Mini-Lote Tranquilo & Uno Sorprendente

La mayoría de los mini-lotes producen gradientes con magnitudes razonables. La pérdida de entropía cruzada para un modelo que ya ajusta aproximadamente los datos se mantiene en una banda estrecha; la retropropagación lleva esa señal de vuelta como gradientes de tamaño similar.


Algunos mini-lotes no lo hacen. Tres fuentes de picos de gradientes:


1. Ejemplos atípicos. Una sola secuencia con una combinación de tokens extremadamente rara produce una pérdida muy alejada de la media y un gradiente muy alejado de la media.

2. Casos límite numéricos. Un denominador de softmax casi cero, una normalización de capa que produce NaN, un desbordamiento FP16. Cada uno puede producir gradientes de órdenes de magnitud mayores que los típicos.

3. Cambios de distribución. Cambiar de fuentes de datos durante una sola ejecución de entrenamiento sorprende al modelo con una nueva distribución. El bandido de ANDREA reordena los pesos de las fuentes cada 7 a 42 pasos. Cada cambio es un pequeño cambio de distribución.


ANDREA-120M v1: Cascada de picos

La v1 no tenía recorte de gradientes. Las transiciones de fuentes cada 7 a 42 pasos del bandido alimentaban al modelo con breves ráfagas de repo-docs (estructurado en listas), luego gutenberg (prosa larga), luego hermes3-general (Q&A). Cada transición producía picos de gradientes: cada pico empujaba los pesos hacia atractores degenerados a escala de 120M.


Hecho empírico clave. ANDREA-12M sobrevivió al mismo bandido sin clipping. Las matrices de pesos más pequeñas permanecen robustas ante shocks de gradiente; un solo lote malo no puede empujar 12M parámetros a un atractor incontrolable como lo hace con 120M. El clipping importa más a medida que el modelo escala.

Clipping de Norma L2 Global

Dos Opciones: Por Tensor o Global

Dos formas de limitar las magnitudes de los gradientes:


Clipping por tensor. Clip cada tensor de gradiente de forma independiente. El gradiente de embedding se clipa a su propia norma; el gradiente de atención se clipa a su propia norma. Simple, pero distorsiona las escalas relativas: un pico pequeño en un tensor (ahora gradiente cero) se empareja con un gradiente enorme en otro (sin tocar).


Clipping de norma L2 global. Trata todos los gradientes como un gran vector. Calcula la norma L2 total a través de cada parámetro. Si la norma excede max_norm, escala cada gradiente por el mismo factor. Preserva las magnitudes relativas a través de los tensores.


ANDREA usa global. Pascanu et al. (2013) demostraron empíricamente que el clipping global supera al por-tensor para el entrenamiento de transformadores.


La Matemática

Calcula la norma L2 global:


norm = sqrt(sum over all params of g_i^2)


Si norm <= max_norm, los gradientes pasan sin cambios. Si norm > max_norm, escala cada gradiente por max_norm / norm:


g_i_clipped = g_i * (max_norm / norm)


Después de la escala, la nueva norma es exactamente igual a max_norm. ANDREA usa max_norm = 1.0.

Cálculo de un Factor de Escala

Supongamos que durante un paso de entrenamiento, la norma L2 global de todos los gradientes se calcula en `3.5`. El `max_norm` de ANDREA es `1.0`. Calcula (a) el factor de escala que se aplica, (b) cuál es la nueva norma L2 global después de la escala, y (c) qué pasaría si la norma sin recortar fuera `0.4` en lugar de `3.5`. Muestra tu aritmética.

Por qué el Cálculo de la Norma del Gradiente Necesita Tres Kernels

El Algoritmo Naïve No Puede Ejecutarse en una GPU

Pseudocódigo para el cálculo de la norma L2 global:


total = 0
para cada parámetro p:
para cada elemento g en p.grad:
total += g * g
norm = sqrt(total)

En una GPU, este bucle ingenuo falla por dos razones:


1. Acumulación secuencial. Un solo acumulador total obliga a cada hilo a esperar a todos los demás hilos, derrotando el paralelismo de la GPU.

2. Tensores heterogéneos. ANDREA-120M tiene tensores de formas muy diferentes: embedding (8449 x 768), atención QKV (768 x 768), layernorm (768). Un solo kernel no puede iterar eficientemente todas las formas.


El Pipeline de Tres Kernels de ANDREA

Divide el trabajo en tres kernels CUDA en microgpt_cuda.cu:


Kernel 1: k_grad_norm_partial. Para cada tensor de parámetros, calcula una suma parcial de cuadrados. Cada bloque de hilos reduce un fragmento del tensor; los resultados se escriben en un pequeño búfer de arañazo. Paralelismo: un bloque por fragmento, cientos de bloques en todos los tensores.


Kernel 2: k_grad_norm_final. Reducir el búfer de raspado a un solo escalar. Tomar su raíz cuadrada. Un kernel pequeño, se ejecuta en microsegundos.


Kernel 3: k_grad_scale. Si norm > max_norm, calcular scale = max_norm / norm & multiplicar cada elemento del gradiente por scale. Un pase sobre cada tensor de gradiente, paralelizacion embarazosamente paralela.


El Orden Importa: Pre-Adam

El pipeline de clipping se ejecuta ANTES de que AdamW actualice m, v o cualquier parámetro. ¿Por qué?


Los gradientes recortados alimentan las medias móviles exponenciales de AdamW. Si se permitiera que un pico fluyera hacia m & v, corrompería esas medias en ejecución & ralentizaría la recuperación durante muchos pasos después del pico. El recorte previo a Adam mantiene el efecto del pico confinado al único paso malo.


Gradient Clipping with 3 CUDA Kernels

¿Por qué tres kernels, no uno?

Supongamos que alguien propone fusionar `k_grad_norm_partial` & `k_grad_norm_final` en un solo kernel que compute la norma global completa en una pasada. Da una razón específica por la que esta fusión fallaría o tendría un peor rendimiento en una GPU. Referencia cómo los bloques de hilos de GPU comparten memoria & se sincronizan.

Cómo el No-Clipping Mató a v1

Transiciones de Fuente Bandit Cada 7 a 42 Pasos

El bandit de ANDREA opera en fases. Cada fase dura 7, 14, 21, 28 o 42 pasos (elegidos aleatoriamente). En cada límite de fase, los pesos de fuente cambian: tal vez repo-docs salta de 0.1 a 0.6, gutenberg cae de 0.4 a 0.1, hermes3-general sube de 0.5 a 0.7.


Cada transición es un shock de distribución para el modelo. La pérdida se dispara brevemente. Los gradientes se disparan con ella: un modelo que estaba minimizando la pérdida contra prosa con sabor a gutenberg ahora ve estructuras de listas con sabor a repo-docs, y los gradientes llevan una señal correctiva que puede ser 10x o 100x la magnitud típica.


Modo de Fallo de v1

Sin clipping, esos picos de gradiente de 10-100x fluían hacia las promedios m & v de AdamW. El suavizado de AdamW significaba que el efecto del pico persistía por muchos pasos después del lote malo real. Combinado con no weight decay (Adam vainilla en v1), las actualizaciones de pesos impulsadas por picos se acumulaban en fases hasta que los pesos derivaban hacia un atractor degenerado: el logit de un token dominaba softmax, la salida muestreada era ese token, el contexto de entrenamiento contenía ese token, el gradiente reforzaba ese token. Bloqueo por repetición.


Estabilidad v2

v2 añadió clipping con max_norm = 1.0, junto con AdamW & calentamiento de LR. El efecto del pico en m & v está acotado; los pesos no pueden derivar más rápido que lr max_norm = 0.0003 1.0 = 0.0003 por parámetro por paso en el pico. Las transiciones de fase aún producen picos, pero esos picos están limitados antes de que alcancen el optimizador.


Resultado: v2 (después del filtro de datos v2.5 & pulido v3) alcanzó recall factual, coherencia multi-párrafo, & 9.5/10 calificaciones externas en muestras de biología & procesamiento de señales.


El Acoplamiento Capacidad-Frágilidad

Mismo bandido. Mismos datos. Mismos hiperparámetros excepto clipping. ¿Por qué el de 12M sobrevivió sin clipping mientras que el de 120M colapsó?


Dos factores compuestos:


1. Matrices de pesos más grandes almacenan más atractores. Una proyección de atención 768x768 tiene 590K parámetros; incluso un pequeño drift por parámetro produce cambios significativos en el comportamiento de atención. Una proyección de atención 384x384 tiene 147K parámetros y permanece en un subespacio más restringido.

2. Más capas significa más interacciones multiplicativas. v3 tiene 12 capas transformer (vs 6 para 12M). Los picos se propagan a través de 12 capas de no linealidades compuestas; cada capa puede amplificar el drift de la capa anterior.


La fragilidad se acumula con la capacidad. El clipping se vuelve obligatorio por encima de algún umbral de escala; ANDREA sitúa ese umbral en algún lugar entre 12M y 120M parámetros.

Diagnóstico de la cascada v1

Supongamos que en el paso 50,000 del entrenamiento v1, un solo mini-lote produce un gradiente con norma L2 global de 50.0 (los lotes típicos producen ~0.5). Rastrea qué sucede con el primer momento `m` de AdamW en los próximos 10 pasos si los lotes subsiguientes regresan a magnitudes de gradiente típicas. Considera cómo `m = beta1 * m + (1 - beta1) * g` con beta1=0.9 propaga el pico.

¿Dónde más se aplica el Clipping?

Más allá del currículo impulsado por bandit de ANDREA, nombra un OTRO escenario de entrenamiento donde el clipping de gradiente L2 global sería igualmente importante, y da un mecanismo que lo haga así.

Actividades Adyacentes

Tres hermanos se enlazan con el clipping:


- Actividad 10: AdamW. El clipping protege m y v de AdamW de la contaminación por picos. Sin clipping, un lote malo corrompe el estado del optimizador por 50+ pasos.

- Actividad 11: Calentamiento de LR. El calentamiento amortigua lr; el clipping amortigua g. Juntos: en el paso 1, la actualización de parámetro en el peor caso es lr_after_warmup max_norm = 1.5e-7 1.0 = 1.5e-7, vs 0.0003 * 50 = 0.015 sin ninguna de las dos protecciones. Una reducción de 100,000x en la magnitud de la actualización temprana en el peor caso.

- Actividad 14: Bandido de múltiples brazos. La longitud de la fase de bandido (7 a 42 pasos) es corta específicamente para evitar que una sola fuente domine; el recorte es lo que hace que esas transiciones frecuentes sean seguras.


El recorte es la ganancia de estabilidad más barata en el entrenamiento de transformadores: 3 pequeños kernels de CUDA, microsegundos por paso, impacto decisivo en si los modelos de 120M+ convergen o colapsan.