Звідки беруться сплески градієнтів
Спокійний міні-пакет та шокуючий
Більшість міні-пакетів виробляють градієнти з розумними величинами. Функція втрат крос-ентропії для моделі, яка вже приблизно підходить до даних, залишається у вузькій смузі; зворотне поширення несе цей сигнал назад як градієнти подібного розміру.
Деякі міні-пакети — ні. Три джерела сплесків градієнтів:
1. Аномальні приклади. Одна послідовність з надзвичайно рідкісною комбінацією токенів виробляє значно відхилену від середнього втрату та значно відхилений від середнього градієнт.
2. Числові граничні випадки. Близький до нуля знаменник softmax, layernorm, що виробляє NaN, переповнення FP16. Кожен може виробляти градієнти на порядки більші за типові.
3. Зсуви розподілу. Перемикання джерел даних під час одного тренувального запуску шокує модель новим розподілом. Бандит ANDREA перерозподіляє ваги джерел кожні 7 до 42 кроки. Кожне перемикання — це малий зсув розподілу.
ANDREA-120M v1: Каскад спайків
v1 не мала кліпінгу градієнтів. Переходи джерел кожні 7 до 42 кроки від бандита подавали моделі короткі сплески repo-docs (структуровані списки), потім gutenberg (довга проза), потім hermes3-general (Q&A). Кожен перехід виробляв спайки градієнтів: кожен спайк штовхав ваги в дегенеративні аттрактори на масштабі 120M.
Ключовий емпіричний факт. ANDREA-12M пережила того ж бандита без кліпінгу. Менші матриці ваг залишаються стійкими до градієнтних шоків; один поганий батч не може штовхнути 12M параметрів у нестійкий атрактор так, як це може статися з 120M. Кліпінг важливіший для більших моделей.
Глобальний кліпінг L2 норми
Два варіанти: Per-Tensor чи Global
Два способи обмежити магнітуди градієнтів:
Кліпінг per-tensor. Кліпувати кожен тензор градієнта незалежно. Градієнт вбудовування кліпується до своєї норми; градієнт уваги — до своєї норми. Просто, але спотворює відносні масштаби: маленький спайк в одному тензорі (тепер нульовий градієнт) поєднується з величезним градієнтом в іншому (незайманий).
Глобальний кліпінг L2 норми. Розглядати всі градієнти як один великий вектор. Обчислити загальну L2 норму по всіх параметрах. Якщо норма перевищує max_norm, масштабувати кожен градієнт на той самий коефіцієнт. Зберігає відносні магнітуди між тензорами.
ANDREA використовує глобальний. Pascanu et al. (2013) емпірично продемонстрували, що глобальне обрізання перевершує per-tensor для тренування трансформерів.
Математика
Обчисліть глобальну L2 норму:
norm = sqrt(sum over all params of g_i^2)
Якщо norm <= max_norm, градієнти проходять без змін. Якщо norm > max_norm, масштабувати кожен градієнт на max_norm / norm:
g_i_clipped = g_i * (max_norm / norm)
Після масштабування нова норма дорівнює точно max_norm. ANDREA використовує max_norm = 1.0.
Обчислення коефіцієнта масштабування
Чому обчислення норми градієнта потребує трьох ядер
Наївний алгоритм не може працювати на GPU
Псевдокод для глобального обчислення L2-норми:
total = 0
для кожного параметра p:
для кожного елемента g в p.grad:
total += g * g
norm = sqrt(total)
На GPU цей наївний цикл не працює з двох причин:
1. Послідовне накопичення. Один акумулятор total змушує кожен потік чекати на кожен інший потік, що руйнує паралелізм GPU.
2. Гетерогенні тензори. ANDREA-120M має тензори з значно різними формами: embedding (8449 x 768), attention QKV (768 x 768), layernorm (768). Один kernel не може ефективно обробляти всі форми.
Трьохядерний конвеєр ANDREA
Розділіть роботу на три CUDA kernel у microgpt_cuda.cu:
Kernel 1: k_grad_norm_partial. Для кожного тензора параметрів обчисліть часткову суму квадратів. Кожен блок потоків зводить частину тензора; результати записуються в малий буфер. Паралелізм: один блок на частину, сотні блоків по всіх тензорах.
Ядро 2: k_grad_norm_final. Зменшити буфер чернетки до одного скаляра. Взяти його квадратний корінь. Одне маленьке ядро, виконується за мікросекунди.
Ядро 3: k_grad_scale. Якщо norm > max_norm, обчислити scale = max_norm / norm та помножити кожен елемент градієнта на scale. Один прохід по кожному тензору градієнтів, embarrassingly parallel.
Порядок важливий: Pre-Adam
Конвеєр обрізання виконується ПЕРЕД оновленнями AdamW для m, v або будь-якого параметра. Чому?
Обрізані градієнти надходять до експоненційних ковзних середніх AdamW. Якщо б сплеск був дозволений у m & v, він би зіпсував ці ковзні середні & сповільнив відновлення на багато кроків після сплеску. Обрізання перед Adam зберігає ефект сплеску обмеженим єдиним поганим кроком.
Чому три ядра, а не одне?
Як No-Clipping знищив v1
Переходи джерел бандита кожні 7–42 кроки
Бандит ANDREA працює у фазах. Кожна фаза триває 7, 14, 21, 28 або 42 кроки (вибирається випадково). На межі кожної фази ваги джерел змінюються: наприклад, repo-docs стрибає з 0.1 до 0.6, gutenberg падає з 0.4 до 0.1, hermes3-general зростає з 0.5 до 0.7.
Кожен перехід — це шок розподілу для моделі. Втрата (loss) короткочасно стрибає. Градієнти стрибають разом з нею: модель, яка мінімізувала втрату проти прози в стилі gutenberg, тепер бачить структури списків у стилі repo-docs, і градієнти несуть корегуючий сигнал, який може бути в 10 або 100 разів більшою за типову величину.
Режим відмови v1
Без кліпінгу ці градієнтні сплески в 10-100 разів проникали в середні m та v AdamW. Згладжування AdamW означало, що ефект сплеску зберігався протягом багатьох кроків після самого поганого батчу. У поєднанні з відсутністю weight decay (vanilla Adam у v1), оновлення ваг, керовані сплесками, накопичувалися протягом фаз, доки ваги не з'їхали в дегенеративний атрактор: логіт одного токена домінував у softmax, вибірковий вивід був цим токеном, тренувальний контекст містив цей токен, градієнт посилював цей токен. Закріплення повторення.
Стабільність v2
v2 додав кліпінг з max_norm = 1.0, поряд з AdamW та LR warmup. Ефект сплеску на m та v обмежений; ваги не можуть з'їжджати швидше, ніж lr max_norm = 0.0003 1.0 = 0.0003 на параметр на крок у піке. Фазові переходи все ще виробляють сплески, але ці сплески обмежуються до того, як вони досягнуть оптимізатора.
Результат: v2 (після фільтра даних v2.5 та полірування v3) досяг фактичного відтворення, когерентності багатопараграфного тексту та 9.5/10 зовнішніх оцінок на зразках біології та обробки сигналів.
Зв'язок ємності та крихкості
Той самий бандит. Ті самі дані. Ті самі гіперпараметри, окрім кліпінгу. Чому 12M вижили без кліпінгу, тоді як 120M зазнали колапсу?
Два кумулятивні фактори:
1. Більші матриці ваг зберігають більше аттракторів. Проекція уваги 768x768 має 590K параметрів; навіть невелике зміщення на параметр створює значні зміни в поведінці уваги. Проекція уваги 384x384 має 147K параметрів і залишається в більш обмеженому підпросторі.
2. Більше шарів означає більше мультиплікативних взаємодій. v3 має 12 трансформерних шарів (проти 6 для 12M). Спайки поширюються через 12 шарів кумулятивних нелінійностей; кожен шар може посилювати зміщення попереднього шару.
Крихкість кумулюється з потужністю. Кліпінг стає обов'язковим вище певного порогового масштабу; ANDREA розміщує цей поріг десь між 12M та 120M параметрами.
Діагностика каскаду v1
Де ще застосовується кліпінг?
Суміжні активності
Три брати пов'язані з кліпінгом:
- Активність 10: AdamW. Кліпінг захищає m та v AdamW від забруднення сплесками. Без кліпінгу один поганий батч псує стан оптимізатора на 50+ кроків.
- Активність 11: LR warmup. Warmup гасить lr; кліпінг гасить g. Разом: на кроці 1 найгірше оновлення параметра — lr_after_warmup max_norm = 1.5e-7 1.0 = 1.5e-7, проти 0.0003 * 50 = 0.015 без жодного захисту. Зменшення магнітуди найгіршого раннього оновлення у 100,000 разів.
- Дія 14: Багаторукі розбійники. Фаза розбійників (7 до 42 кроків) коротка спеціально для того, щоб запобігти домінуванню будь-якого одного джерела; обрізання робить ці часті переходи безпечними.
Обрізання — це найдешевша перемога стабільності в тренуванні трансформерів: 3 маленькі CUDA-ядра, мікросекунди на крок, вирішальний вплив на те, чи збіжаться моделі 120M+ чи зруйнуються.