Затухание градиента

Коротко

Definition

Затухание градиента — это проблема обучения глубоких нейронных сетей, при которой градиенты, доходящие до ранних слоёв при обратном распространении ошибки, становятся очень маленькими, и веса этих слоёв почти не обновляются.

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

Из-за этого ранние слои обучаются медленно или почти не обучаются.

Интуиция

Глубокая нейронная сеть — это композиция многих преобразований.

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

Если на каждом шаге градиент умножается на число меньше 1, он постепенно уменьшается:

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

Тогда обновление параметров тоже почти исчезает:

Если очень мал, то даже при ненулевом learning rate вес почти не меняется.

Как возникает

Рассмотрим пример с сигмоидой в качестве функции активации.

Схематично сеть можно представить так:

где:

  • — вход;
  • — вес;
  • — значение до активации;
  • — функция активации;
  • — выход нейрона после активации;
  • — функция потерь.

По правилу цепочки производная по раннему весу содержит произведение множителей из последующих слоёв:

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

Почему сигмоида усиливает проблему

Сигмоида:

Её производная:

Максимальное значение производной сигмоиды равно:

Это значит, что даже в лучшей точке сигмоида умножает градиент максимум на 0.25.

Если несколько сигмоид стоят подряд, градиент быстро уменьшается:

А если сигмоида находится в насыщенной области, производная ещё меньше. Это происходит, когда вход сильно положительный или сильно отрицательный: выход сигмоиды близок к 1 или 0, и функция почти плоская.

В таких областях сеть почти перестаёт получать полезный градиент.

Формальное описание

Пусть глубокая сеть состоит из последовательности преобразований:

Тогда градиент по параметрам раннего слоя зависит от произведения производных последующих слоёв:

Если нормы многих множителей меньше 1, градиент затухает.

Если нормы многих множителей больше 1, возникает противоположная проблема — exploding gradients, то есть взрыв градиента.

Чем опасно

Затухание градиента приводит к тому, что:

  • ранние слои почти не обучаются;
  • сеть хуже извлекает низкоуровневые признаки;
  • обучение становится очень медленным;
  • глубокая сеть может работать не лучше мелкой;
  • loss может перестать заметно уменьшаться;
  • модель застревает в плохом решении.

Особенно это было проблемой для ранних глубоких сетей с sigmoid или tanh activation.

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

Когда возникает

Затухание градиента часто возникает в таких ситуациях:

  • очень глубокая сеть;
  • sigmoid или tanh в насыщенных областях;
  • плохая инициализация весов;
  • длинные последовательности в RNN;
  • отсутствие нормализации;
  • отсутствие skip connections;
  • слишком маленькие градиенты из-за масштаба данных или loss;
  • неудачная архитектура.

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

Решения

ReLU и похожие активации

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

Это позволяет градиенту проходить лучше, чем через sigmoid в насыщенной области.

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

Skip connection

Skip connection создаёт обходной путь для сигнала и градиента.

В residual-блоке:

производная содержит дополнительный тождественный путь:

Это помогает градиенту проходить через глубокую сеть и не исчезать полностью.

Правильная инициализация весов

Инициализация весов влияет на масштаб активаций и градиентов.

Частые варианты:

  • Xavier / Glorot initialization — хорошо подходит для sigmoid и tanh;
  • He initialization — хорошо подходит для ReLU-подобных активаций.

Цель инициализации — не дать сигналу и градиенту быстро исчезнуть или взорваться при прохождении через слои.

Батч-нормализация

Батч-нормализация стабилизирует распределения активаций и помогает держать значения в более удобном диапазоне.

Это может уменьшить риск попадания активаций в насыщенные области и сделать обучение устойчивее.

LSTM и gated-архитектуры

Для последовательностей проблему затухания градиента частично решают архитектуры с gates, например LSTM.

LSTM использует специальные механизмы управления памятью, которые помогают сохранять информацию на длинных интервалах.

Нормализация и residual design

В современных архитектурах часто объединяют несколько решений:

  • residual connections;
  • normalization layers;
  • аккуратную инициализацию;
  • подходящие activation functions;
  • адаптивные оптимизаторы.

Например, трансформеры используют residual connections и normalization, что помогает обучать глубокие модели.

Минимальный пример

Допустим, градиент должен пройти через 6 слоёв, и на каждом слое он умножается на производную 0.25.

Тогда итоговый множитель:

Если исходный градиент был равен 1, до раннего слоя дойдёт примерно:

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

Если же использовать архитектуру со skip connection, у градиента появляется дополнительный путь, который не требует прохождения через все малые производные подряд.

Практические признаки

На практике затухание градиента можно заподозрить, если:

  • loss почти не уменьшается;
  • ранние слои почти не меняют веса;
  • нормы градиентов в ранних слоях близки к нулю;
  • глубокая сеть обучается хуже, чем мелкая;
  • RNN плохо ловит долгие зависимости;
  • качество не улучшается при увеличении глубины.

Для диагностики можно смотреть:

  • нормы градиентов по слоям;
  • распределения активаций;
  • скорость изменения весов;
  • train и validation curves.

Типичные ошибки понимания

Думать, что проблема только в learning rate

Маленький learning rate действительно делает обновления меньше, но при затухании главная проблема в самом градиенте. Если градиент почти нулевой, увеличение learning rate не всегда помогает и может сделать обучение нестабильным.

Считать, что ReLU полностью решает проблему

ReLU помогает, но не гарантирует успешное обучение любой глубокой сети. Нужны также инициализация, нормализация, residual connections и корректная архитектура.

Путать затухание градиента с переобучением

При переобучении модель хорошо запоминает train, но хуже работает на validation. При затухании градиента модель может плохо обучаться даже на train.

Считать, что проблема бывает только в CNN

Затухание градиента может возникать в разных глубоких сетях: MLP, CNN, RNN, LSTM и других архитектурах.

Игнорировать последовательности

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

Связанные понятия