Затухание градиента
Коротко
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 и других архитектурах.
Игнорировать последовательности
В рекуррентных сетях глубина возникает не только по слоям, но и по времени. Поэтому длинная последовательность может создать такую же проблему, как очень глубокая сеть.