Что такое skip connection (пропускное соединение) в архитектуре нейронных сетей?

Ответ

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

Основные типы и применение:

  1. Аддитивные skip-connection (ResNet-style):

    output = F(x, {W_i}) + x

    Используются для сложения тензоров одинаковой размерности. Их главная цель — облегчить обучение, позволяя градиенту течь напрямую. Если блоку F(x) не нужно ничего менять, его веса могут стремиться к нулю, и блок становится почти тождественным.

  2. Конкатенирующие skip-connection (DenseNet-style):

    output = concat( x, F(x, {W_i}) )

    Используются для объединения по глубине (channel dimension). Они явно сохраняют все предыдущие представления, что улучшает поток градиентов и encourages feature reuse, но может быстро увеличивать потребление памяти.

Почему skip connections так эффективны:

  • Решение проблемы исчезающего градиента: Они создают "короткие пути" для обратного распространения ошибки. Градиент может течь напрямую через тождественное соединение без затухания нелинейными функциями активации и матрицами весов.
  • Обучение тождественной функции: Глубокая сеть должна как минимум не быть хуже shallower сети. Skip connections делают это тривиальным — shallower сеть является подмножеством более глубокой (когда дополнительные слои учатся нулевому отображению).
  • Улучшение потока информации: Сеть может выбирать, какую информацию обрабатывать в глубине, а какую передавать неизменной.

Где встречаются, помимо ResNet:

  • Трансформеры: Skip connection окружает каждый sub-layer (Multi-Head Attention и Feed-Forward Network) с последующей нормализацией.
  • U-Net: Конкатенирующие соединения между encoder и decoder для точной локализации в сегментации изображений.
  • Highway Networks: Более общая форма, где пропускное соединение управляется воротами.

По сути, skip connections стали стандартным компонентом для построения глубоких и стабильно обучаемых архитектур.

Ответ 18+ 🔞

А, ну это же классика, ёпта! Skip connection, или, как я это называю, «запасной путь для ленивых нейронов». Суть проще пареной репы, но гениальность — в рот меня чих-пых!

Представь, ты строишь небоскреб из слоёв нейросети. Каждый новый этаж (слой) должен как-то преобразовать информацию с предыдущего. И вот ты уже на 50-м этаже, а сигнал от самого низа доходит такой измученный и потрёпанный, что нихуя не понятно, что там было в начале. Это и есть та самая «деградация» или «исчезающий градиент» — сигнал затухает, обучаться нечему, сеть тупит.

И тут приходят ребята и говорят: «А давайте, блядь, проведём лифт!» Ну или пожарную лестницу. Суть в том, что вход в блок слоёв не только прогоняется через все эти сложные преобразования F(x), но и тупо прибавляется к выходу из этого блока. Смотри, как это выглядит в коде, тут всё честно:

output = F(x, {W_i}) + x  # Сложили хитрый результат с исходным данными

Получается, если наш блок из нескольких слоёв F(x) вдруг обучится полной хуйне, его веса могут схлопнуться почти в ноль. И тогда output будет почти равен x. Блок как бы «отключается», и сигнал спокойно проскакивает по этому короткому пути, минуя все сложности. Гениально и просто, как топор! Сеть сама решает, когда ей «думать» этими слоями, а когда просто передать данные дальше. Сам от себя охуел, когда это осознал.

Но это, блядь, не единственный способ! Есть ещё вариант для прожорливых — конкатенация. Тут мы не складываем, а склеиваем:

output = concat( x, F(x, {W_i}) )  # Склеили исходное и преобразованное

Это уже подход, как в DenseNet. Получается, что каждый следующий слой видит вообще всё, что было до него. Овердохуища информации! С одной стороны, это круто для повторного использования признаков, а с другой — память жрёт как не в себя, потому что каналов становится всё больше и больше.

Так почему же эта штука работает, как шарманка?

  1. Градиенту — зелёный свет. Ему теперь не нужно продираться с 50-го этажа через все активации и матрицы. Есть прямая «запасная лестница» — прыгнул и уже внизу. Проблема исчезающего градиента накрылась медным тазом.
  2. Обучение тождеству — раз плюнуть. Более глубокая сеть должна быть хотя бы не хуже мелкой. А с skip connection это становится тривиально: мелкая сеть — это просто частный случай глубокой, где дополнительные слои научились ничего не делать.
  3. Информационный трафик. Сеть теперь умная хитрая жопа: она может решить, что какую-то инфу (типа контуры объекта) протащить без изменений, а какую-то (типа текстуру) — обработать в глубине.

И эта поебень, чувак, теперь везде!

  • В трансформерах: каждый суб-блок (внимание или полносвязный слой) обёрнут в skip connection и нормализацию. Стандартный десерт.
  • В U-Net для сегментации: там вообще пир! Конкатенирующие соединения между энкодером и декодером, чтобы при сборке картинки назад помнить, где какие мелкие детали были. Без этого — доверия ебать ноль к точным границам.
  • Highway Networks: это вообще дедушки с гейтами, которые решают, сколько пропустить, а сколько преобразовать.

Короче, skip connection — это не просто фича, это пизда рулю современного глубокого обучения. Без этих «костылей» мы бы до сих пор боялись сетей глубже 20 слоев. А теперь — да похуй, 100, 150, 1000... Лифт-то есть!