← ДокументацияDOCS / Learning Techniques / Исчезающие градиенты

Борьба с исчезающими градиентами: почему обучение «замирает» и как это исправить

Как решить проблему vanishing gradients в глубоких нейронных сетях и обеспечить стабильное обучение всех слоёв.

Что такое исчезающие градиенты?

При обучении нейросетей мы используем обратное распространение ошибки (backpropagation): ошибка на выходе сети передаётся назад по слоям, корректируя веса. Но в глубоких сетях есть проблема — градиенты могут становиться слишком маленькими по мере продвижения к начальным слоям.

Это и есть vanishing gradients — ситуация, когда «сигнал ошибки» гаснет, и начальные слои перестают обучаться.

Почему это происходит

1. Математика активаций

Многие функции активации (например, sigmoid, tanh) сжимают значения в узкий диапазон. Их производные в этих зонах малы. При умножении этих маленьких производных на каждом слое градиент экспоненциально уменьшается.

Пример: если производная ~ 0.1, то через 10 слоёв градиент станет порядка 10^(-10) — практически ноль.

2. Эффект цепочки (chain rule)

Backpropagation использует правило произведения производных. Если каждое звено маленькое, произведение «схлопывается» к нулю.

3. Глубина сети

Чем больше слоёв, тем выше риск, что полезный градиент до них просто не дойдёт.

Почему это проблема

  • • Первые слои не обучаются — сеть не формирует хорошие признаки
  • • Обучение замедляется — даже при большом числе эпох модель «топчется на месте»
  • • Зависимость от начальной инициализации — если стартовые веса неудачные, градиент может исчезнуть с первых шагов

Как с этим бороться

1. Выбор функций активации с «живыми» градиентами

Рекомендуемые

  • • ReLU — max(0, x)
  • • LeakyReLU — max(0.01x, x)
  • • ELU — x if x >= 0, alpha(e^x - 1) if x <= 0
  • • GELU — x * Phi(x)

Избегать в глубоких сетях

  • • Sigmoid — 1/(1 + e^(−x))
  • • Tanh — (e^x - e^(−x))/(e^x + e^(−x))

Преимущество: ReLU и её вариации не сжимают положительные значения и сохраняют градиент = 1 в активной зоне. Это снижает риск затухания градиентов по сравнению с sigmoid/tanh.

2. Инициализация весов с учётом глубины сети

  • • Xavier (Glorot) initialization: sigma² = 2/(n_in + n_out)
  • • He initialization: sigma² = 2/n_in

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

3. Нормализация

Batch Normalization

Нормализует активации по батчу, выравнивая их распределение и удерживая в «рабочем» диапазоне.

Layer Normalization

Нормализует активации внутри слоя, стабилизируя градиенты и ускоряя обучение.

Эффект: Выравнивают распределение активаций, удерживая их в «рабочем» диапазоне, где производные не исчезают. Кроме того, BN действует как регуляризатор.

4. Резидуальные связи (skip connections)

y = F(x) + x // Residual connection

Принцип: В ResNet и Transformer слои могут «пропускать» сигнал напрямую, минуя несколько преобразований. Это помогает градиенту проходить без потерь, даже если внутри есть слои с малыми производными.

5. Градиентный клиппинг и масштабирование

Обычно используется для exploding gradients, но в паре с другими методами помогает стабилизировать распространение сигнала.

Сравнение методов борьбы

МетодКогда использоватьПреимуществаНедостатки
ReLU активацииГлубокие сети, большинство задачПростота, эффективность, отсутствие vanishing gradientsDying ReLU проблема
Правильная инициализацияВсегда при создании новых архитектурПростота, универсальностьНе решает все проблемы
Batch NormalizationГлубокие сети, CNN, MLPСтабильность, ускорение обученияЗависимость от размера батча
Skip connectionsОчень глубокие сети (ResNet, Transformer)Эффективность, простота градиентовУсложнение архитектуры
Градиентный клиппингНестабильное обучениеПростота, стабильностьМожет замедлить обучение

Практические рекомендации

Пошаговый план борьбы с vanishing gradients:

  1. 1Начните с ReLU активаций — замените sigmoid/tanh на ReLU или его вариации
  2. 2Используйте правильную инициализацию — Xavier для tanh/sigmoid, He для ReLU
  3. 3Добавьте Batch Normalization — после каждого слоя в глубоких сетях
  4. 4Рассмотрите skip connections — для очень глубоких архитектур
  5. 5Мониторьте градиенты — используйте gradient clipping при необходимости

Ключевые выводы

  • • Vanishing gradients — фундаментальная проблема глубоких нейронных сетей
  • • Комбинация методов работает лучше, чем отдельные решения
  • • Правильный выбор активаций критически важен для стабильного обучения
  • • Нормализация и skip connections — современные стандарты для глубоких сетей
  • • Мониторинг градиентов помогает выявить проблемы на ранних стадиях
Борьба с исчезающими градиентами: почему обучение «замирает» и как это исправить