Потеря градиента (Vanishing Gradient): почему глубокое обучение страдает от «кратковременной амнезии»

1. Введение: "Господин директор, я не слышу ваш голос!"



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

Однако до начала 2000‑х годов глубокое обучение находилось в темноте. При добавлении 10, 20 слоёв производительность падала, а иногда обучение вовсе прекращалось.

Пример:

  • CEO (выходной слой): "Эй! Почему качество продукта так низкое? (Loss)"
  • Руководители → менеджеры → супервайзеры…: сигнал должен проходить вниз,
  • Новичок (входной слой): "...что вы сказали? Я ничего не слышал!"

Параметры, отвечающие за фундаментальные операции в передней части (входной слой), не обновляются. Это и есть потеря градиента (Vanishing Gradient).


2. Анализ причин: виновники – «Сигмоида» и «умножение»

Почему сигнал исчезает? Виноваты стандартные функции активации, которые мы считали нормой, и математические свойства цепного правила.

(1) Предательство сигмоиды: «слишком плотный фильтр»

Исследователи любили сигмоиду, потому что она выдаёт значения между 0 и 1, как вероятность спайка нейрона. Но с точки зрения разработчика сигмоида – это «сжатие», которое искажает вход.

  • Проблема 1: верхняя граница градиента (Max Gradient = 0.25)
  • Производная сигмоиды достигает максимум 0.25 только при x = 0.
  • При небольших изменениях x градиент стремится к 0.
  • Это как микрофон, выставленный на минимум: даже громко вы кричите, слышится шепот.

(2) Трагедия цепного правила: «0.25 в степени N»

Обучение основано на обновлении весов: w = w – (learning_rate * gradient). Градиент должен существовать.

В обратном распространении градиенты умножаются слои за слоем. При 30 слоях даже при идеальном 0.25 результат будет:

$$0.25 \times 0.25 \times \dots \times 0.25 \,(30\text{ раз}) \approx 8\times10^{-19}$$

  • Результат: градиент вблизи входного слоя становится меньше, чем может представить компьютер, и становится 0 (Underflow).
  • Проблема: обновление весов превращается в w = w – 0, обучение останавливается.
  • Это как сеть с 99.99 % потерей пакетов: ошибки не доходят до передней части.

3. Решение 1: ReLU – «переходим от аналогового к цифровому»



Герой, который решил эту проблему, – простая функция ReLU (Rectified Linear Unit).

(1) Революция производной: «1 или 0»

Код ReLU:


def relu(x):
    return max(0, x)

Производная:

  • x > 0 (активировано): градиент 1.
  • x ≤ 0 (неактивировано): градиент 0.

Почему это важно? В положительной области сигнал не уменьшается при умножении.

$$1 \times 1 \times 1 \times \dots \times 1 = 1$$

ReLU пропускает сигнал без потерь, поэтому крик CEO доходит до новичка с градиентом 1.

(2) Оптимизация производительности: exp() vs if

Сигмоида использует экспоненциальные функции, которые тяжело вычислять на CPU/GPU. ReLU – простое сравнение (if x > 0), что делает её значительно быстрее.

(3) Предупреждение: Dying ReLU

Если вход всегда отрицательный, градиент становится 0 и нейрон «умирает». Для этого появились варианты, такие как Leaky ReLU, которые дают небольшую наклонную часть.


4. Решение 2: ResNet (Residual Network) – «создаём горячую линию»

ReLU позволила строить сети до 20–30 слоёв, но желание добавить 100, 1000 слоёв снова привело к проблемам. Решением стал ResNet.

(1) Идея: «учись только разнице»

Обычная сеть пытается построить полную функцию H(x). ResNet вводит «пропускной» связь:

$$Output = F(x) + x$$

Это значит: модель учится только крошечной разнице (Residual), а оригинальный вход передаётся напрямую.

(2) Быстрый путь обратного распространения

При дифференцировании сумма имеет свойство распределения:

$$\frac{\partial Output}{\partial x} = \frac{\partial F(x)}{\partial x} + 1$$

Независимо от того, как сильно F(x) уменьшает градиент, всегда сохраняется +1, который проходит к входу. Это как «быстрая дорога» для градиента.

  • Без ResNet: если градиент исчезает, обучение останавливается.
  • С ResNet: даже если F(x) даёт 0, +1 сохраняет поток.

Благодаря этому можно строить сети из 152, даже 1000 слоёв.


5. Вывод: победа инженерии над «зимним» глубоким обучением

Проблема потери градиента казалась теоретическим пределом, но решения оказались инженерными, а не математическими.

image

  1. ReLU: убирает сложные вычисления, оставляя линейность.
  2. ResNet: открывает «короткие пути» для градиента.

Современные архитектуры – Transformer, CNN и др. используют эти два принципа как базовые инструменты.

Когда вы видите в коде return x + layer(x), помните: это установка «подвески» (Shortcut), чтобы градиент не исчезал.

"А, я установил защиту от потери градиента. Теперь могу спокойно строить глубокие сети!"