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

un

гость
1 / ?
назад к урокам

Откуда берутся всплески градиентов

Спокойный мини-батч и шокирующий

Большинство мини-батчей производят градиенты с разумными величинами. Функция потерь кросс-энтропии для модели, которая уже примерно соответствует данным, остаётся в узкой полосе; обратное распространение несёт этот сигнал назад в виде градиентов похожего размера.


Некоторые мини-батчи — нет. Три источника всплесков градиентов:


1. Примеры-выбросы. Одна последовательность с крайне редкой комбинацией токенов производит потерю, далёкую от среднего значения, и градиент, далёкий от среднего значения.

2. Численные краевые случаи. Почти нулевой знаменатель softmax, layernorm, производящий NaN, переполнение FP16. Каждый из них может производить градиенты на порядки больше типичных.

3. Сдвиги распределения. Переключение источников данных во время одного запуска обучения шокирует модель новым распределением. Бандит ANDREA перетасовывает веса источников каждые 7–42 шага. Каждое переключение — это небольшой сдвиг распределения.


ANDREA-120M v1: Каскад пиков

v1 не имел обрезки градиентов. Переходы источников каждые 7–42 шага от бандита подавали модели краткие всплески repo-docs (структурированные списки), затем gutenberg (длинная проза), затем hermes3-general (вопросы-ответы). Каждое переключение производило пики градиентов: каждый пик толкал веса в вырожденные аттракторы на масштабе 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.

Вычисление коэффициента масштабирования

Предположим, во время одного шага обучения глобальная L2-норма всех градиентов составляет `3.5`. У ANDREA `max_norm = 1.0`. Вычислите (a) применяемый коэффициент масштабирования, (b) чему равна новая глобальная L2-норма после масштабирования, и (c) что произошло бы, если бы необрезанная норма была `0.4` вместо `3.5`. Покажите вычисления.

Почему вычисление нормы градиента требует трех ядер

Наивный алгоритм не может работать на 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. Один проход по всем тензорам градиентов, смущающе параллельно.


Порядок имеет значение: Pre-Adam

Конвейер обрезки запускается ДО обновлений AdamW m, v или любого параметра. Почему?


Обрезанные градиенты подаются в экспоненциальные скользящие средние AdamW. Если бы всплеск был допущен в m & v, он бы исказил эти скользящие средние & замедлил восстановление на многие шаги после всплеска. Обрезка перед Adam сохраняет эффект всплеска в пределах одного плохого шага.


Gradient Clipping with 3 CUDA Kernels

Почему три ядра, а не одно?

Предположим, кто-то предложил объединить `k_grad_norm_partial` & `k_grad_norm_final` в одно ядро, которое вычисляет всю глобальную норму за один проход. Приведите одну конкретную причину, почему такое объединение либо потерпит неудачу, либо будет работать хуже на GPU. Сослаться на то, как блоки потоков GPU делят память & синхронизируются.

Как 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 кратковременно взлетает. Градиенты взлетают вместе с ним: модель, которая минимизировала 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. Эффект пика на m & v ограничен; веса не могут дрейфовать быстрее, чем lr max_norm = 0.0003 1.0 = 0.0003 на параметр за шаг на пике. Фазовые переходы всё ещё производят пики, но эти пики обрезаются до того, как достигнут оптимизатора.


Результат: v2 (после фильтра данных v2.5 и полировки v3) достиг фактического вспоминания, coherentности в несколько параграфов и 9.5/10 внешних оценок на выборках по биологии и обработке сигналов.


Связь ёмкости и хрупкости

Один и тот же бандит. Одни и те же данные. Одни и те же гиперпараметры, кроме клиппинга. Почему 12M выжили без клиппинга, в то время как 120M рухнули?


Два наслояющихся фактора:


1. Более крупные матрицы весов хранят больше аттракторов. Проекция внимания 768x768 имеет 590K параметров; даже небольшое смещение на параметр производит значимые изменения в поведении внимания. Проекция внимания 384x384 имеет 147K параметров и остается в более ограниченном подпространстве.

2. Больше слоев означает больше мультипликативных взаимодействий. v3 имеет 12 трансформерных слоев (против 6 для 12M). Пики распространяются через 12 слоев накапливающихся нелинейностей; каждый слой может усиливать смещение предыдущего слоя.


Хрупкость накапливается с мощностью. Клиппинг становится обязательным выше некоторого порогового значения масштаба; ANDREA помещает этот порог где-то между 12M и 120M параметрами.

Диагностика каскада v1

Предположим, на шаге 50 000 обучения v1 один мини-батч производит градиент с глобальной L2-нормой 50.0 (типичные батчи дают ~0.5). Проследите, что происходит с первым моментом `m` в AdamW в следующие 10 шагов, если последующие батчи возвращаются к типичным величинам градиентов. Учтите, как `m = beta1 * m + (1 - beta1) * g` с beta1=0.9 распространяет всплеск.

Где ещё применяется обрезка?

Помимо учебного плана ANDREA на основе бандита, назовите ОДИН ДРУГОЙ сценарий обучения, где глобальная L2-обрезка градиентов была бы столь же важна, и укажите один механизм, который это обуславливает.

Смежные активности

Три сестринские активности связаны с клиппингом:


- Активность 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+ или рушатся.