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

un

gast
1 / ?
terug naar lessen

Waar Gradientpieken Vandaan Komen

Een Rustige Mini-Batch & een Schokkende

De meeste mini-batches produceren gradients met redelijke magnitudes. Cross-entropy verlies voor een model dat de data al ruwweg past, blijft in een smalle band; backprop draagt dat signaal terug als gradients van vergelijkbare grootte.


Sommige mini-batches doen dat niet. Drie bronnen van gradientpieken:


1. Uitschieters. Een enkele sequentie met een extreem zeldzame tokencombinatie produceert een ver-van-gemiddelde loss & een ver-van-gemiddelde gradiënt.

2. Numerieke randgevallen. Een bijna-nul softmax-noemer, een NaN-producerende layernorm, een FP16-overflow. Elk kan gradiënten produceren die orden van grootte groter zijn dan typisch.

3. Verschuivingen in verdeling. Het wisselen van databronnen tijdens een enkele trainingsshift schokt het model met een nieuwe verdeling. ANDREA's bandit her schudt brongewichten elke 7 tot 42 stappen. Elke wissel is een kleine verschuiving in verdeling.


ANDREA-120M v1: Spike Cascade

v1 had geen gradient clipping. Bronovergangen elke 7 tot 42 stappen van de bandit voedden het model korte bursts van repo-docs (lijst-gestructureerd), dan gutenberg (lange proza), dan hermes3-general (Q&A). Elke overgang produceerde gradiëntspikes: elke spike duwde gewichten in degeneratieve attractors op 120M-schaal.


Belangrijk empirisch feit. ANDREA-12M overleefde dezelfde bandit zonder clipping. Kleinere gewichtsmatrices blijven robuust tegen gradiëntschokken; een enkele slechte batch kan 12M parameters niet in een uit de hand gelopen attractor duwen zoals het 120M kan. Clipping doet er meer toe naarmate een model schaalt.

Global L2 Norm Clipping

Twee Keuzes: Per-Tensor of Global

Twee manieren om gradiëntgrootte te begrenzen:


Per-tensor clipping. Clip elke gradiënttensor onafhankelijk. Embedding gradiënt wordt gekliped naar zijn eigen norm; attention gradiënt wordt gekliped naar zijn eigen norm. Eenvoudig, maar vervormt relatieve schalen: een kleine piek in één tensor (nu nul gradiënt) paart met een enorme gradiënt in een andere (onveranderd).


Global L2 norm clipping. Behandel alle gradiënten als één groot vector. Bereken de totale L2 norm over elke parameter. Als de norm max_norm overschrijdt, schaal elke gradiënt met dezelfde factor. Behoudt relatieve groottes over tensors heen.


ANDREA gebruikt globaal. Pascanu et al. (2013) toonden empirisch aan dat globale clipping beter presteert dan per-tensor voor transformer-training.


De Wiskunde

Bereken de globale L2-norm:


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


Als norm <= max_norm, gaan de gradients ongewijzigd door. Als norm > max_norm, schaalt u elke gradient met max_norm / norm:


g_i_clipped = g_i * (max_norm / norm)


Na schaling is de nieuwe norm exact gelijk aan max_norm. ANDREA gebruikt max_norm = 1.0.

Berekenen van een Schaalfactor

Stel dat tijdens één trainingsstap de globale L2-norm van alle gradients 3,5 is. ANDREA's `max_norm = 1.0`. Bereken (a) de schaalfactor die wordt toegepast, (b) wat de nieuwe globale L2-norm is na schaling, & (c) wat er zou gebeuren als de ongeclipte norm 0,4 was in plaats van 3,5. Toon uw rekenwerk.

Waarom Gradient Norm Berekening Drie Kernels Nodig Heeft

Het Naïeve Algoritme Kan Niet Op Een GPU Draaien

Pseudocode voor globale L2 norm berekening:


total = 0
voor elke param p:
voor elk element g in p.grad:
total += g * g
norm = sqrt(total)

Op een GPU mislukt deze naïeve lus om twee redenen:


1. Sequentiële accumulatie. Een enkele total accumulator dwingt elke thread om te wachten op elke andere thread, wat de GPU-parallelisme tenietdoet.

2. Heterogene tensoren. ANDREA-120M heeft tensoren van sterk verschillende vormen: embedding (8449 x 768), attention QKV (768 x 768), layernorm (768). Één kernel kan niet efficiënt over alle vormen itereren.


ANDREA's Three-Kernel Pipeline

Splits het werk op in drie CUDA kernels in microgpt_cuda.cu:


Kernel 1: k_grad_norm_partial. Voor elke parameter tensor, bereken een partïle som van kwadraten. Elk thread block reduceert een chunk van de tensor; resultaten schrijven naar een klein scratch buffer. Parallelisme: één block per chunk, honderden blocks over alle tensoren.


Kernel 2: k_grad_norm_final. Verminder de scratchbuffer tot een enkele scalar. Neem de vierkantswortel ervan. Eén kleine kernel, draait in microseconden.


Kernel 3: k_grad_scale. Als norm > max_norm, bereken scale = max_norm / norm & vermenigvuldig elk gradiëntelement met scale. Eén doorgang over elke gradiëntentensor, genant parallel.


Volgorde Doet Ertoe: Pre-Adam

De clipping-pijplijn draait VÓÓR AdamW m, v of enige parameter bijwerkt. Waarom?


Geklipte gradiënten voeden de exponentiële moving averages van AdamW. Als een piek zou worden toegestaan om door te stromen naar m & v, zou het die lopende gemiddelden corrumperen & de herstelperiode voor vele stappen na de piek vertragen. Clipping vóór Adam houdt het effect van de piek beperkt tot de enkele slechte stap.


Gradient Clipping with 3 CUDA Kernels

Waarom Drie Kernels, Niet Eén?

Stel dat iemand voorstelt om `k_grad_norm_partial` & `k_grad_norm_final` samen te voegen in een enkele kernel die de gehele globale norm in één doorgang berekent. Geef één specifiek reden waarom deze samenvoeging zou falen of slechter zou presteren op een GPU. Verwijs naar hoe GPU thread blocks geheugen delen & synchroniseren.

Hoe No-Clipping v1 doodde

Bandit Source Transitions Elke 7 tot 42 Stappen

ANDREA's bandit opereert in fasen. Elke fase duurt 7, 14, 21, 28 of 42 stappen (willekeurig gekozen). Bij elke fasegrens verschuiven de brongewichten: misschien springt repo-docs van 0.1 naar 0.6, gutenberg daalt van 0.4 naar 0.1, hermes3-general stijgt van 0.5 naar 0.7.


Elke transitie is een distributieschok voor het model. Loss piekt kort. Gradienten pieken mee: een model dat verlies minimaliseerde tegen gutenberg-geurende proza ziet nu repo-docs-geurende lijstrstructuren, & gradienten dragen een correctiesignaal dat 10x of 100x de typische grootte kan zijn.


v1 Failure Mode

Zonder clipping stroomden die 10-100x gradient spikes door in de m & v gemiddelden van AdamW. De smoothing van AdamW zorgde ervoor dat het spike-effect vele stappen aanhield na de daadwerkelijke slechte batch. Gecombineerd met geen weight decay (vanilla Adam in v1), hoopten spike-gedreven weight updates zich op over fasen totdat de weights afdwaalden naar een degeneratieve attractor: de logit van één token domineerde softmax, het gesamplede output was dat token, de training context bevatte dat token, de gradient versterkte dat token. Repetition lock-in.


v2 Stabiliteit

v2 voegde clipping toe met max_norm = 1.0, naast AdamW & LR warmup. Het spike-effect op m & v is begrensd; weights kunnen niet sneller afdwalen dan lr max_norm = 0.0003 1.0 = 0.0003 per parameter per stap op piek. Fase-overgangen produceren nog steeds spikes, maar die spikes worden afgekapt voordat ze de optimizer bereiken.


Resultaat: v2 (na data filter v2.5 & v3 polish) bereikte feitelijke recall, multi-paragraph coherentie, & 9.5/10 externe beoordelingen op biologie & signaalverwerking samples.


De Capacity-Brittleness Koppeling

Zelfde bandit. Zelfde data. Zelfde hyperparameters behalve clipping. Waarom overleefde 12M zonder clipping terwijl 120M instortte?


Twee samengestelde factoren:


1. Grotere gewichtsmatrices slaan meer attractors op. Een 768x768 attention-projectie heeft 590K parameters; zelfs kleine per-parameter drift produceert betekenisvolle veranderingen in attention-gedrag. Een 384x384 attention-projectie heeft 147K parameters & blijft in een meer begrensde subspace.

2. Meer lagen betekent meer multiplicatieve interacties. v3 heeft 12 transformerlagen (vs 6 voor 12M). Spikes verspreiden zich door 12 lagen van samengestelde nonlineariteiten; elke laag kan de drift van de vorige laag versterken.


Brosheid stapelt op met capaciteit. Clipping wordt verplicht boven een bepaalde schaal-drempel; ANDREA plaatst die drempel ergens tussen 12M & 120M parameters.

Diagnose van de v1-cascade

Stel dat bij stap 50.000 van de v1-training een enkele mini-batch een gradiënt produceert met globale L2-norm van 50.0 (typische batches produceren ~0.5). Volg wat er gebeurt met AdamW's eerste moment `m` in de volgende 10 stappen als daaropvolgende batches terugkeren naar typische gradiëntgrootten. Overweeg hoe `m = beta1 * m + (1 - beta1) * g` met beta1=0.9 de piek propageert.

Waar Nog Meer Toepassing van Clipping?

Buiten ANDREA's bandit-gedreven curriculum, noem ÉÉN ANDERE trainingsscenario waar globale L2-gradiëntclipping even belangrijk zou zijn, & geef één mechanisme dat het zo maakt.

Aangrenzende Activiteiten

Drie broers/zussen linken aan clipping:


- Activiteit 10: AdamW. Clipping beschermt AdamW's m & v tegen spike-contaminatie. Zonder clipping corrumpeert één slechte batch de optimizerstaat voor 50+ stappen.

- Activiteit 11: LR warmup. Warmup dempt lr; clipping dempt g. Samen: op stap 1 is de worst-case parameterupdate lr_after_warmup max_norm = 1.5e-7 1.0 = 1.5e-7, vs 0.0003 * 50 = 0.015 zonder een van beide guards. Een reductie van 100.000x in worst-case vroege update-magnitude.

- Activiteit 14: Multi-armed bandits. De lengte van de banditfase (7 tot 42 stappen) is kort specifiek om te voorkomen dat één bron domineert; clipping maakt die frequente overgangen veilig.


Clipping is de goedkoopste stabiliteitswinst in transformertraining: 3 kleine CUDA-kernels, microseconden per stap, doorslaggevende impact op of 120M+ modellen convergeren of instorten.