Exploding Gradient
I gradienti esplosivi crescono in modo esponenziale durante la backpropagation, causando enormi aggiornamenti dei pesi, picchi della loss e valori NaN. Panoramica di cause, segnali e soluzioni.
L'esplosione del gradiente è un problema di addestramento in cui i gradienti calcolati tramite backpropagation aumentano esponenzialmente mentre attraversano all'indietro una rete neurale profonda o ricorrente. La discesa del gradiente applica quindi aggiornamenti enormi ai pesi del modello, la funzione di perdita aumenta bruscamente o diventa NaN o inf e l'addestramento diverge. È il fenomeno opposto al problema del gradiente evanescente. Pascanu, Mikolov e Bengio hanno analizzato entrambi i problemi nelle reti neurali ricorrenti e proposto il clipping della norma del gradiente per contrastarne l'esplosione: una misura di protezione ancora standard nell'addestramento del deep learning.
Perché i gradienti esplodono#
Per la regola della catena, il gradiente che raggiunge un livello iniziale è il prodotto di un fattore per ogni livello successivo, oppure per ogni passo temporale in una rete ricorrente. Quando questi fattori sono costantemente maggiori di 1, il prodotto cresce esponenzialmente con la profondità: un fattore pari a 1.5 ripetuto per 30 livelli moltiplica il segnale per circa 190,000. Tra le cause comuni rientrano un'inizializzazione dei pesi inadeguata, un tasso di apprendimento troppo alto, input non normalizzati, sequenze lunghe nei modelli ricorrenti e l'overflow nell'addestramento a precisione mista, durante il quale i valori FP16 superiori a 65,504 diventano inf. I segnali sono una curva della perdita che subisce un'impennata improvvisa o assume il valore NaN, log della norma del gradiente che mostrano aumenti di diversi ordini di grandezza tra un passaggio e l'altro e pesi che diventano NaN.
Prevenzione e mitigazione#
La maggior parte delle pipeline di addestramento moderne combina più di queste misure di protezione.
- Clipping del gradiente: Quando la norma L2 globale di tutti i gradienti supera una soglia, ciascun gradiente viene ridotto dello stesso fattore. L'aggiornamento mantiene la propria direzione, ma la sua lunghezza viene limitata.
- Batch normalization: La batch normalization e la layer normalization ridimensionano le attivazioni a ogni livello, mantenendo il segnale su una scala stabile tra i livelli e rendendo più regolare il paesaggio della funzione di perdita.
- Inizializzazione accurata: Le inizializzazioni Xavier (Glorot) e He scalano i pesi iniziali in modo che la varianza delle attivazioni rimanga pressoché costante da un livello all'altro.
- Connessioni residue: Le connessioni skip offrono ai gradienti un percorso identità che aggira ogni blocco, facendo sì che il segnale all'indietro sia una somma di percorsi anziché un unico prodotto prolungato.
- Warmup del tasso di apprendimento: Iniziare con un tasso di apprendimento basso e aumentarlo gradualmente nei primi passaggi evita aggiornamenti iniziali enormi, mentre i pesi e le statistiche dell'ottimizzatore sono ancora instabili.
Il frammento di codice qui sotto crea una sequenza di 30 livelli, ciascuno dei quali amplifica il proprio input di 1.5x, quindi applica il clipping al gradiente risultante con PyTorch:
import torch
from torch import nn
torch.manual_seed(0)
# 30 stacked linear layers, each initialized to amplify its input by 1.5x
layers = [nn.Linear(64, 64, bias=False) for _ in range(30)]
for layer in layers:
nn.init.orthogonal_(layer.weight, gain=1.5)
model = nn.Sequential(*layers)
loss = model(torch.randn(8, 64)).pow(2).mean()
loss.backward()
# clip_grad_norm_ rescales all gradients in place and returns their norm before clipping
norm_before = nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
norm_after = nn.utils.get_total_norm([p.grad for p in model.parameters()])
print(f"Gradient norm before clipping: {norm_before:.2e}, after: {norm_after:.2f}")La norma del gradiente grezzo è 9.90e+10 e, dopo il clipping, è 1.00; così, il successivo passaggio dell'ottimizzatore rimane limitato, a prescindere dall'entità del gradiente grezzo.
L'addestramento di Ultralytics YOLO26 applica questa misura di protezione a ogni passaggio: il trainer riporta alla scala originale i gradienti a precisione mista, limita la loro norma globale a 10.0 e consente allo scaler del gradiente di saltare qualsiasi aggiornamento che contenga ancora valori inf o NaN. Un trainer personalizzato può modificare il limite, ad esempio abbassandolo a 0.1 per RT-DETR.
Gradienti esplosivi e gradienti evanescenti#
Entrambi i problemi derivano dallo stesso prodotto di fattori per livello durante la backpropagation. I fattori superiori a 1 fanno esplodere i gradienti, generando aggiornamenti instabili, overflow numerico e divergenza; la soluzione abituale è il clipping. I fattori inferiori a 1 riducono i gradienti quasi a zero, impedendo ai livelli iniziali di apprendere; tra le soluzioni abituali ci sono le attivazioni non saturanti come ReLU, le connessioni residue e le unità ricorrenti con gate come le LSTM. La normalizzazione e un'inizializzazione accurata aiutano a contrastare entrambi i problemi.
Applicazioni nel mondo reale#
I modelli linguistici di grandi dimensioni vengono addestrati per centinaia di migliaia di passaggi su sequenze di testo lunghe, nelle quali i picchi improvvisi della perdita sono un rischio noto; per questo, le procedure di addestramento applicano il clipping dei gradienti: GPT-3 è stato addestrato con Adam e una norma globale del gradiente limitata a 1.0.
Nella visione artificiale, le reti profonde di rilevamento degli oggetti vengono addestrate su dataset delle dimensioni di COCO, con tassi di apprendimento elevati e precisione mista; clipping e loss scaling impediscono quindi che un raro batch estremo corrompa i pesi. I rilevatori basati su Transformer sono più sensibili, perché i gradienti che attraversano la cross-attention del decoder possono subire picchi; i modelli della famiglia DETR, come RT-DETR e DINO, applicano quindi di norma il clipping con una norma massima di 0.1.










