← Назад к вопросам

Что такое градиентный взрыв?

3.0 Senior🔥 201 комментариев
#Глубокое обучение

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое градиентный взрыв?

Градиентный взрыв (gradient explosion) — это проблема в обучении глубоких нейронных сетей, когда градиенты ошибки становятся экспоненциально большими во время обратного распространения ошибки (backpropagation). Это приводит к нестабильному обучению и расходимости модели.

Суть проблемы

Во время обратного распространения градиенты умножаются на веса слоёв. Если веса больше 1, то с каждым слоём градиент увеличивается. В глубоких сетях эта кумулятивная операция может привести к очень большим числам:

# Пример: если вес > 1 и слоёв 100
weight = 1.5
layers = 100
gradient = 1.0

for _ in range(layers):
    gradient *= weight

print(f"Финальный градиент: {gradient}")
# Результат: градиент станет огромным числом

Практические последствия

  • NaN и Inf значения — очень большие градиенты превращаются в бесконечность
  • Недообучение — параметры обновляются скачками и пропускают оптимум
  • Расходимость обучения — функция потерь растёт вместо уменьшения
  • Нестабильность — модель может неожиданно "взорваться"

Решения

1. Gradient Clipping (обрезание градиентов)

Ограничиваем значение градиентов максимумом:

import torch

# Обрезание по норме
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)

# Обрезание по значению
torch.nn.utils.clip_grad_value_(model.parameters(), clip_value=0.5)

2. Нормализация слоёв

Batch Normalization или Layer Normalization стабилизируют активации:

import torch.nn as nn

model = nn.Sequential(
    nn.Linear(100, 64),
    nn.BatchNorm1d(64),
    nn.ReLU(),
    nn.Linear(64, 10)
)

3. Инициализация весов

Правильная инициализация предотвращает взрыв с самого начала:

# Xavier инициализация для sigmoid/tanh
nn.init.xavier_uniform_(layer.weight)

# He инициализация для ReLU
nn.init.kaiming_uniform_(layer.weight, nonlinearity=relu)

4. Уменьшение learning rate

Медленное обновление весов снижает скачки:

optimizer = torch.optim.Adam(model.parameters(), lr=1e-4)

5. Архитектурные решения

  • Использование Residual connections (ResNet) позволяет градиентам проходить напрямую
  • Skip connections упрощают обратное распространение
  • LSTM/GRU вместо обычных RNN имеют встроенные механизмы контроля градиентов

Когда это особенно важно

  • Очень глубокие сети (>50 слоёв)
  • RNN и LSTM на длинных последовательностях
  • Обучение с большим learning rate
  • Нестабильные задачи (например, с динамичными данными)

Понимание и контроль градиентных потоков — критически важно для успешного обучения современных моделей глубокого обучения.

Что такое градиентный взрыв? | PrepBro