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

un

invité
1 / ?
retour aux leçons

D'où Viennent les Pics de Gradients

Un Mini-Lot Calme & un Chocant

La plupart des mini-lots produisent des gradients de magnitudes raisonnables. La perte d'entropie croisée pour un modèle qui ajuste déjà grossièrement les données reste dans une bande étroite ; la rétropropagation transporte ce signal sous forme de gradients de taille similaire.


Certains mini-lots ne le font pas. Trois sources de pics de gradients :


1. Exemples aberrants. Une seule séquence avec une combinaison de tokens extrêmement rare produit une perte très éloignée de la moyenne & un gradient très éloigné de la moyenne.

2. Cas limites numériques. Un dénominateur softmax proche de zéro, une layernorm produisant un NaN, un débordement FP16. Chacun peut produire des gradients d'un ordre de grandeur supérieur à la normale.

3. Changements de distribution. Changer de source de données au cours d'une seule exécution d'entraînement choque le modèle avec une nouvelle distribution. Le bandit d'ANDREA réorganise les poids des sources toutes les 7 à 42 étapes. Chaque changement est un petit décalage de distribution.


ANDREA-120M v1 : Cascade de pics

La v1 n'avait pas de clipping de gradient. Les transitions de source toutes les 7 à 42 étapes du bandit nourrissaient le modèle de brèves rafales de repo-docs (structurés en liste), puis gutenberg (prose longue), puis hermes3-general (Q&R). Chaque transition produisait des pics de gradient : chaque pic poussait les poids vers des attracteurs dégénérés à l'échelle 120M.


Fait empirique clé. ANDREA-12M a survécu au même bandit sans clipping. Les matrices de poids plus petites restent robustes aux chocs de gradient ; un seul mauvais batch ne peut pas pousser 12M paramètres dans un attracteur en fuite comme il peut le faire avec 120M. Le clipping est plus important à mesure que le modèle s'agrandit.

Clipping de la norme L2 globale

Deux choix : Par tenseur ou global

Deux façons de borner les magnitudes de gradient :


Clipping par tenseur. Clipper chaque tenseur de gradient indépendamment. Le gradient d'embedding est clippé selon sa propre norme ; le gradient d'attention est clippé selon sa propre norme. Simple, mais cela déforme les échelles relatives : un petit pic dans un tenseur (maintenant gradient zéro) est associé à un gradient énorme dans un autre (non touché).


Clipping de la norme L2 globale. Traiter tous les gradients comme un grand vecteur unique. Calculer la norme L2 totale sur tous les paramètres. Si la norme dépasse max_norm, scaler chaque gradient par le même facteur. Préserve les magnitudes relatives entre les tenseurs.


ANDREA utilise global. Pascanu et al. (2013) ont démontré empiriquement que le clipping global surpasse le per-tensor pour l'entraînement des transformers.


Les Mathématiques

Calculez la norme L2 globale :


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


Si norm <= max_norm, les gradients passent inchangés. Si norm > max_norm, on scale tous les gradients par max_norm / norm :


g_i_clipped = g_i * (max_norm / norm)


Après mise à l'échelle, la nouvelle norm est exactement égale à max_norm. ANDREA utilise max_norm = 1.0.

Calcul d'un Facteur d'Échelle

Supposons qu'au cours d'une étape d'entraînement, la norme L2 globale de tous les gradients soit de `3.5`. Le `max_norm` d'ANDREA est de `1.0`. Calculez (a) le facteur d'échelle appliqué, (b) la nouvelle norme L2 globale après mise à l'échelle, & (c) ce qui se passerait si la norme non coupée était `0.4` au lieu de `3.5`. Montrez vos calculs.

Pourquoi le calcul de la norme des gradients nécessite trois noyaux

L'algorithme naïf ne peut pas s'exécuter sur un GPU

Pseudocode pour le calcul de la norme L2 globale :


total = 0
pour chaque paramètre p :
pour chaque élément g dans p.grad :
total += g * g
norm = sqrt(total)

Sur un GPU, cette boucle naïve échoue pour deux raisons :


1. Accumulation séquentielle. Un seul accumulateur total force chaque thread à attendre tous les autres threads, annulant le parallélisme GPU.

2. Tenseurs hétérogènes. ANDREA-120M possède des tenseurs de formes très différentes : embedding (8449 x 768), attention QKV (768 x 768), layernorm (768). Un seul kernel ne peut pas itérer efficacement toutes les formes.


Pipeline à trois kernels d'ANDREA

Diviser le travail en trois CUDA kernels dans microgpt_cuda.cu :


Kernel 1 : k_grad_norm_partial. Pour chaque tenseur de paramètres, calculer une somme partielle des carrés. Chaque bloc de threads réduit un chunk du tenseur ; les résultats s'écrivent dans un petit buffer temporaire. Parallélisme : un bloc par chunk, des centaines de blocs sur tous les tenseurs.


Noyau 2 : k_grad_norm_final. Réduire le tampon temporaire à un seul scalaire. Prendre sa racine carrée. Un petit noyau, s'exécute en microsecondes.


Noyau 3 : k_grad_scale. Si norm > max_norm, calculer scale = max_norm / norm & multiplier chaque élément du gradient par scale. Un passage sur chaque tenseur de gradient, parallélisme embarrassant.


L'ordre compte : Pre-Adam

La pipeline de clipping s'exécute AVANT que AdamW ne mette à jour m, v, ou tout paramètre. Pourquoi ?


Les gradients tronqués alimentent les moyennes mobiles exponentielles d'AdamW. Si un pic était autorisé à se propager dans m & v, il corromprait ces moyennes en cours d'exécution & ralentirait la récupération pendant de nombreux pas après le pic. Le clipping avant Adam confine l'effet du pic à l'unique mauvais pas.


Gradient Clipping with 3 CUDA Kernels

Pourquoi trois kernels, et non un seul ?

Supposons que quelqu'un propose de fusionner `k_grad_norm_partial` & `k_grad_norm_final` en un seul kernel qui calcule la norme globale entière en un seul passage. Donnez une raison spécifique pour laquelle cette fusion échouerait ou performerait moins bien sur un GPU. Référez-vous à la manière dont les blocs de threads GPU partagent la mémoire & se synchronisent.

Comment le No-Clipping a tué v1

Transitions de source bandit tous les 7 à 42 pas

Le bandit d'ANDREA opère par phases. Chaque phase dure 7, 14, 21, 28 ou 42 pas (choisi aléatoirement). À chaque limite de phase, les poids des sources changent : peut-être repo-docs passe de 0.1 à 0.6, gutenberg descend de 0.4 à 0.1, hermes3-general monte de 0.5 à 0.7.


Chaque transition est un choc de distribution pour le modèle. La perte grimpe brièvement. Les gradients grimpent avec : un modèle qui minimisait la perte contre de la prose au goût gutenberg voit maintenant des structures de listes au goût repo-docs, & les gradients portent un signal correctif qui peut être 10x ou 100x l'ampleur typique.


Mode de défaillance de v1

Sans clipping, ces pics de gradient 10-100x se propageaient dans les moyennes m & v d'AdamW. Le lissage d'AdamW faisait que l'effet des pics persistait pendant de nombreux pas après le mauvais batch réel. Combiné à l'absence de weight decay (vanilla Adam dans v1), les mises à jour de poids pilotées par les pics s'accumulaient sur des phases jusqu'à ce que les poids dérivent vers un attracteur dégénéré : le logit d'un token dominait le softmax, la sortie échantillonnée était ce token, le contexte d'entraînement contenait ce token, le gradient renforçait ce token. Verrouillage de répétition.


Stabilité de v2

v2 a ajouté le clipping avec max_norm = 1.0, aux côtés d'AdamW & du warmup de LR. L'effet des pics sur m & v est borné ; les poids ne peuvent pas dériver plus vite que lr max_norm = 0.0003 1.0 = 0.0003 par paramètre par pas au pic. Les transitions de phase produisent encore des pics, mais ces pics sont plafonnés avant d'atteindre l'optimiseur.


Résultat : v2 (après filtre de données v2.5 & polissage v3) a atteint le rappel factuel, la cohérence multi-paragraphes, & 9.5/10 notes externes sur des échantillons de biologie & traitement du signal.


Le Couplage Capacité-Fragilité

Même bandit. Même données. Même hyperparamètres sauf le clipping. Pourquoi 12M a survécu sans clipping tandis que 120M s'est effondré ?


Deux facteurs cumulatifs :


1. Les matrices de poids plus grandes stockent plus d'attracteurs. Une projection d'attention 768x768 a 590K paramètres ; même une petite dérive par paramètre produit des changements significatifs dans le comportement d'attention. Une projection d'attention 384x384 a 147K paramètres & reste dans un sous-espace plus contraint.

2. Plus de couches signifie plus d'interactions multiplicatives. v3 a 12 couches transformer (vs 6 pour 12M). Les pics se propagent à travers 12 couches de non-linéarités cumulatives ; chaque couche peut amplifier la dérive de la couche précédente.


La fragilité s'accumule avec la capacité. Le clipping devient obligatoire au-delà d'un certain seuil d'échelle ; ANDREA place ce seuil quelque part entre 12M & 120M paramètres.

Diagnostic du cascade v1

Supposons qu'au pas 50 000 de l'entraînement v1, un seul mini-lot produise un gradient avec une norme L2 globale de 50,0 (les lots typiques produisent ~0,5). Tracez ce qui arrive au premier moment `m` d'AdamW sur les 10 pas suivants si les lots suivants reviennent à des magnitudes de gradient typiques. Considérez comment `m = beta1 * m + (1 - beta1) * g` avec beta1=0.9 propage la pointe.

Où d'Autre le Clipping s'Applique-t-il ?

Au-delà du curriculum piloté par bandit d'ANDREA, nommez un AUTRE scénario d'entraînement où le clipping global L2 des gradients serait tout aussi important, & donnez un mécanisme qui le rend tel.

Activités Adjacentes

Trois activités liées au clipping :


- Activité 10 : AdamW. Le clipping protège les m & v d'AdamW de la contamination par les pics. Sans clipping, un mauvais batch corrompt l'état de l'optimiseur pendant 50+ étapes.

- Activité 11 : Échauffement du LR. L'échauffement atténue lr ; le clipping atténue g. Ensemble : à l'étape 1, la pire mise à jour de paramètre est lr_after_warmup max_norm = 1.5e-7 1.0 = 1.5e-7, vs 0.0003 * 50 = 0.015 sans aucune protection. Une réduction de 100 000x de l'amplitude de la pire mise à jour précoce.

- Activité 14 : Multi-armed bandits. La longueur de la phase bandit (7 à 42 étapes) est courte spécifiquement pour empêcher une seule source de dominer ; le clipping est ce qui rend ces transitions fréquentes sûres.


Le clipping est la victoire de stabilité la moins chère dans l'entraînement des transformers : 3 petits kernels CUDA, microsecondes par étape, impact décisif sur le fait que les modèles de 120M+ convergent ou s'effondrent.