Exploding Gradient
Взрывной рост градиентов — это их экспоненциальное увеличение во время обратного распространения ошибки, которое приводит к огромным обновлениям весов, скачкам функции потерь и значениям NaN. Рассматриваются причины, признаки и способы устранения.
Взрывной рост градиента — это сбой обучения, при котором градиенты, вычисляемые с помощью обратного распространения ошибки, экспоненциально увеличиваются при прохождении назад по глубокой или рекуррентной нейронной сети. Градиентный спуск начинает применять огромные обновления к весам модели, функция потерь резко возрастает или становится NaN либо inf, и обучение расходится. Это противоположность проблеме затухающего градиента. Паскану, Миколов и Бенжио изучили обе проблемы в рекуррентных нейронных сетях и предложили для борьбы со взрывным ростом градиента ограничивать его норму. Этот прием и сегодня остается стандартной мерой защиты при обучении моделей глубокого обучения.
Почему градиенты растут#
По правилу цепочки градиент, достигающий раннего слоя, представляет собой произведение множителей для каждого последующего слоя или шага времени в рекуррентной сети. Если эти множители стабильно больше 1, произведение экспоненциально растет с глубиной: множитель 1.5, повторенный на 30 слоях, увеличивает сигнал примерно в 190,000 раз. Среди распространенных причин — неудачная инициализация весов, слишком высокая скорость обучения, ненормализованные входные данные, длинные последовательности в рекуррентных моделях и переполнение при обучении с смешанной точностью, когда значения FP16 выше 65,504 превращаются в inf. Признаки проблемы — внезапный скачок функции потерь или ее превращение в NaN, увеличение логируемой нормы градиента на несколько порядков между шагами и веса, которые становятся NaN.
Предотвращение и устранение проблемы#
В большинстве современных конвейеров обучения сочетаются несколько таких мер защиты.
- Ограничение градиента: если общая L2-норма всех градиентов превышает порог, каждый градиент масштабируется одним и тем же коэффициентом. Направление обновления сохраняется, ограничивается только его длина.
- Пакетная нормализация: пакетная нормализация и нормализация по слою масштабируют активации на каждом слое. Это стабилизирует масштаб сигналов между слоями и сглаживает поверхность функции потерь.
- Тщательная инициализация: инициализации Xavier (Glorot) и He масштабируют начальные веса так, чтобы дисперсия активаций оставалась примерно постоянной от слоя к слою.
- Остаточные соединения: пропускающие соединения создают для градиентов путь тождества в обход каждого блока, поэтому сигнал обратного прохода представляет собой сумму путей, а не одно длинное произведение.
- Разогрев скорости обучения: если начать с небольшой скорости обучения и постепенно увеличивать ее на первых шагах, можно избежать огромных начальных обновлений, пока веса и статистики оптимизатора еще не стабилизировались.
Приведенный ниже фрагмент кода создает стек из 30 слоев, каждый из которых усиливает входной сигнал в 1.5 раза, а затем ограничивает получившийся градиент с помощью 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}")Норма исходного градиента составляет 9.90e+10, а после ограничения — 1.00, поэтому следующий шаг оптимизатора остается ограниченным независимо от величины исходного градиента.
При обучении Ultralytics YOLO26 эта мера защиты применяется на каждом шаге: тренер отменяет масштабирование градиентов смешанной точности, ограничивает их общую норму значением 10.0 и позволяет масштабировщику градиента пропустить любое обновление, которое все еще содержит значения inf или NaN. В пользовательском тренере можно изменить порог, например снизить его до 0.1 для RT-DETR.
Взрывной и затухающий градиенты#
Обе проблемы возникают из-за одного и того же произведения множителей для каждого слоя при обратном распространении ошибки. Множители больше 1 вызывают взрывной рост градиентов, нестабильные обновления, числовое переполнение и расходимость; обычно помогает ограничение градиента. Множители меньше 1 заставляют градиенты стремиться к нулю, из-за чего ранние слои перестают обучаться. Обычно помогают несатурирующие функции активации, такие как ReLU, остаточные соединения и рекуррентные блоки с вентильным механизмом, например LSTM. Нормализация и тщательная инициализация помогают справиться с обеими проблемами.
Примеры применения в реальных условиях#
Большие языковые модели обучают сотни тысяч шагов на длинных текстовых последовательностях, где внезапные скачки функции потерь — известная проблема. Поэтому в рецептах обучения таких моделей предусмотрено ограничение градиентов: GPT-3 обучали с Adam и ограничением общей нормы градиента до 1.0.
В компьютерном зрении глубокие сети обнаружения объектов обучаются на наборах данных масштаба COCO с высокой скоростью обучения и смешанной точностью. Ограничение градиентов и масштабирование функции потерь не дают редкому экстремальному пакету повредить веса. Детекторы на базе Transformer чувствительнее, поскольку градиенты в декодере через перекрестное внимание могут резко возрастать. Поэтому для моделей семейства DETR, таких как RT-DETR и DINO, обычно устанавливают максимальную норму 0.1.










