9 · Gradiente explosivo y recorte de gradientes
La otra cara del desvanecimiento — gradientes que crecen exponencialmente — y la solución de una línea que mantiene estables los RNNs y Transformers.
Lo opuesto al desvanecimiento — gradientes explosivos — ocurre cuando los pesos son demasiado grandes; recorta la norma del gradiente antes de cada actualización.
Sin esto:
Sin recorte, los RNNs y transformers entrenando en secuencias largas explotan regularmente a NaN.
En la lección 4 estudiamos los gradientes desvanecidos: las señales se reducen a ~0 al retropropagarse a través de capas sigmoid. El modo de fallo opuesto también existe — los gradientes explosivos — y es igual de común en los modelos de secuencia profundos.
Cuando los pesos de la red se inicializan demasiado grandes, cada capa multiplica el gradiente en lugar de reducirlo. A través de 20 capas, un gradiente que comienza en 1 puede llegar a 10^{20} — enviando los pesos a NaN y bloqueando el entrenamiento en unos pocos cientos de pasos.
Los gradientes explosivos son especialmente comunes en:
- RNNs y LSTMs — la misma matriz de pesos
Wse multiplica en cada paso de tiempo; para secuencias largas esto es equivalente a elevarWa la potencia T - Transformers sin inicialización adecuada o warmup
- Redes feedforward muy profundas con pesos mal escalados
La solución estándar es el recorte de gradientes por norma: si la norma global del gradiente supera un umbral, escala todos los gradientes hacia abajo proporcionalmente para que la norma sea igual al umbral. Esto preserva la dirección de la actualización mientras acota su magnitud.
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).
Python (in browser)
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Lectura de PyTorch — clip_grad_norm_ en un bucle de entrenamiento
¿Qué método de recorte de gradientes preserva la dirección de la actualización?
- Los gradientes explosivos son el espejo del desvanecimiento: los pesos grandes amplían los gradientes exponencialmente capa por capa, enviando los pesos a NaN en unos pocos cientos de pasos de entrenamiento.
- Recorte de gradientes por norma: `if ||g|| > max_norm: g = g * max_norm / ||g||`. Escala todos los gradientes uniformemente, preservando la dirección de la actualización.
- El recorte por valor cambia la dirección; el recorte por norma la preserva — prefiere el recorte por norma en la práctica.
- En PyTorch: llama a `torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)` después de `loss.backward()` y antes de `optimizer.step()`. Es estándar en todo bucle de entrenamiento de RNN/LSTM.
Todo bucle de entrenamiento de RNN/LSTM incluye `clip_grad_norm_`. El entrenamiento de Transformers también lo usa frecuentemente. Sin él, los modelos de secuencia divergen habitualmente.
Si lo quitas: Entrenas RNNs que explotan a NaN después de 100–200 pasos y no tienes una forma sistemática de estabilizarlos — la solución es literalmente una línea de código.