Что такое проблемы взрывающегося и затухающего градиента?

Проблемы взрывающегося градиента (exploding gradient) и затухающего градиента (vanishing gradient) — это фундаментальные сложности, которые возникают при обучении нейронных сетей с помощью градиентного спуска, особенно в глубоких сетях и рекуррентных нейронных сетях (RNN). Эти проблемы возникают на этапе обратного распространения ошибки (backpropagation) и напрямую связаны с вычислением градиентов.

🔹 Что такое градиенты?

Градиенты — это производные функции ошибки (loss function) по параметрам (весам) сети. Во время обучения градиенты используются для обновления весов через градиентный спуск:

w_new = w_old - learning_rate \* gradient

🔸 Проблема затухающего градиента (Vanishing Gradient)

📌 В чём суть?

Когда градиенты, проходя назад по слоям, становятся очень маленькими (близкими к нулю), это приводит к тому, что веса нижних слоёв почти не обновляются. Как следствие:

  • обучение становится очень медленным или вообще останавливается;

  • сеть не может выучить долгосрочные зависимости (особенно в RNN).

📉 Почему возникает?

Затухание градиентов связано с цепным правилом производных. Если каждый слой имеет производную < 1 (например, 0.5), то после n слоёв:

L/w  (0.5)^n

И при n → ∞ градиент → 0.

Примеры функций активации, вызывающих это:

  • Sigmoid — производная максимум 0.25.

  • tanh — производная максимум 1, но чаще < 1.

🧠 Где особенно важно?

  • RNN, LSTM, GRU — где необходимо сохранять информацию о событиях, происходящих во времени;

  • Глубокие полносвязные нейронные сети (MLP), где много уровней трансформации признаков.

🔸 Проблема взрывающегося градиента (Exploding Gradient)

📌 В чём суть?

Если градиенты, проходя назад по слоям, становятся очень большими (взрываются), то:

  • веса обновляются на огромные значения;

  • возникает нестабильность — loss становится NaN или бесконечностью;

  • сеть не обучается, либо результаты становятся хаотичными.

📈 Почему возникает?

Если производные > 1 (например, 1.5), то после n слоёв:

L/w  (1.5)^n

При n > 10 это может стать численно неустойчивым. Особенно часто случается:

  • при плохой инициализации весов;

  • при использовании ReLU без нормализации.

🧪 Технические причины

И то, и другое связано с матрицами Якоби, которые участвуют в backpropagation. Если произведение этих матриц имеет собственные значения > 1 → градиенты растут, < 1 → затухают.

🧰 Методы борьбы

Против затухающего градиента:

  • Использование ReLU, Leaky ReLU, ELU вместо Sigmoid/tanh.

  • Batch Normalization.

  • Скип-коннекты (residual connections) в ResNet.

  • Архитектуры LSTM, GRU вместо обычных RNN.

  • Xavier или He инициализация весов.

Против взрывающегося градиента:

Gradient clipping — ограничение модуля градиента, например:

torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)

  • Использование нормализованных активаций (LayerNorm, BatchNorm).

  • Хорошая инициализация весов.

  • Снижение learning rate.

📍 Почему важно?

Эти проблемы могут полностью остановить обучение или привести к обучению не тех паттернов, что делает их ключевыми в архитектурном и инженерном проектировании нейросетей. Их знание позволяет:

  • правильно подбирать активации;

  • строить устойчивые архитектуры;

  • эффективно обучать глубокие модели.