Exploding Gradient
Les gradients explosifs augmentent de façon exponentielle pendant la rétropropagation, provoquant d’importantes mises à jour des poids, des pics de perte et des valeurs NaN. Présentation des causes, des signes et des solutions.
Un gradient explosif est un échec de l'entraînement dans lequel les gradients calculés par la rétropropagation augmentent de façon exponentielle à mesure qu'ils remontent un réseau neuronal profond ou récurrent. La descente de gradient applique alors des mises à jour considérables aux poids du modèle, la fonction de perte monte en flèche ou devient NaN ou inf, et l'entraînement diverge. C'est l'image inverse du problème du gradient évanescent. Pascanu, Mikolov et Bengio ont analysé ces deux problèmes dans les réseaux neuronaux récurrents et ont proposé l'écrêtage de la norme des gradients pour contrer les gradients explosifs, une mesure de protection qui reste aujourd'hui la précaution standard lors de l'entraînement en apprentissage profond.
Pourquoi les gradients explosent#
D'après la règle de la chaîne, le gradient qui atteint une couche précoce est le produit d'un facteur par couche ultérieure, ou par pas de temps dans un réseau récurrent. Lorsque ces facteurs sont régulièrement supérieurs à 1, leur produit croît de façon exponentielle avec la profondeur : un facteur de 1.5 répété sur 30 couches multiplie le signal par environ 190,000. Parmi les causes courantes figurent une mauvaise initialisation des poids, un taux d'apprentissage trop élevé, des entrées non normalisées, de longues séquences dans les modèles récurrents et un dépassement de capacité pendant l'entraînement en précision mixte, où les valeurs FP16 supérieures à 65,504 deviennent inf. Les signes sont une courbe de perte qui fait soudainement un bond ou devient NaN, des journaux de normes de gradient qui augmentent de plusieurs ordres de grandeur entre les étapes et des poids qui deviennent NaN.
Prévention et atténuation#
La plupart des pipelines d'entraînement modernes combinent plusieurs de ces moyens de défense.
- Écrêtage des gradients : lorsque la norme L2 globale de tous les gradients dépasse un seuil, chaque gradient est réduit du même facteur. La mise à jour conserve sa direction et seule sa longueur est plafonnée.
- Normalisation par lot : la normalisation par lot et la normalisation par couche remettent à l'échelle les activations de chaque couche, ce qui stabilise l'échelle des signaux d'une couche à l'autre et lisse le paysage de la fonction de perte.
- Initialisation soignée : les initialisations Xavier (Glorot) et He mettent les poids initiaux à l'échelle afin que la variance des activations reste à peu près constante d'une couche à l'autre.
- Connexions résiduelles : les connexions de saut offrent aux gradients un chemin d'identité contournant chaque bloc ; le signal rétropropagé devient ainsi une somme de chemins plutôt qu'un long produit unique.
- Préchauffage du taux d'apprentissage : commencer avec un faible taux d'apprentissage et l'augmenter progressivement pendant les premières étapes évite des mises à jour initiales démesurées, alors que les poids et les statistiques de l'optimiseur ne sont pas encore stabilisés.
L'extrait ci-dessous construit un empilement de 30 couches qui amplifient chacune leur entrée par 1.5x, puis écrête le gradient obtenu avec 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 norme du gradient brut est de 9.90e+10 et, après écrêtage, elle est de 1.00 ; la prochaine étape de l'optimiseur reste donc bornée, quelle que soit l'amplitude du gradient brut.
Lors de l'entraînement, Ultralytics YOLO26 applique cette mesure de protection à chaque étape : le formateur remet à l'échelle les gradients en précision mixte, écrête leur norme globale à 10.0 et laisse le redimensionneur de gradient ignorer toute mise à jour qui contient encore des valeurs inf ou NaN. Un formateur personnalisé peut modifier la limite, par exemple en la ramenant à 0.1 pour RT-DETR.
Gradients explosifs et gradients évanescents#
Les deux problèmes proviennent du même produit de facteurs par couche en rétropropagation. Les facteurs supérieurs à 1 font exploser les gradients, entraînant des mises à jour instables, un dépassement de capacité numérique et une divergence ; l'écrêtage constitue la solution habituelle. Les facteurs inférieurs à 1 font tendre les gradients vers zéro, empêchant les premières couches d'apprendre ; les solutions habituelles sont des activations non saturantes comme ReLU, les connexions résiduelles et les unités récurrentes à portes comme les LSTM. La normalisation et une initialisation soignée aident à prévenir les deux problèmes.
Applications concrètes#
Les grands modèles de langage sont entraînés sur des centaines de milliers d'étapes et de longues séquences de texte, où les pics soudains de perte sont un risque bien connu ; leurs recettes d'entraînement prévoient donc un écrêtage des gradients. GPT-3 a été entraîné avec Adam et une norme globale des gradients écrêtée à 1.0.
En vision par ordinateur, les réseaux profonds de détection d'objets sont entraînés sur des jeux de données de l'échelle de COCO, avec des taux d'apprentissage élevés et une précision mixte ; l'écrêtage et la mise à l'échelle de la perte empêchent donc un lot extrême rare de corrompre les poids. Les détecteurs basés sur Transformer sont plus sensibles, car les gradients de la cross-attention du décodeur peuvent faire des pics ; les modèles de la famille DETR, comme RT-DETR et DINO, utilisent donc généralement un écrêtage à une norme maximale de 0.1.










