Что такое проблемы взрывающегося и затухающего градиента?
Проблемы взрывающегося градиента (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.
📍 Почему важно?
Эти проблемы могут полностью остановить обучение или привести к обучению не тех паттернов, что делает их ключевыми в архитектурном и инженерном проектировании нейросетей. Их знание позволяет:
-
правильно подбирать активации;
-
строить устойчивые архитектуры;
-
эффективно обучать глубокие модели.