Эпоха 4 · Архитектуры и масштаб · 2015

27 ResNet

Deep Residual Learning for Image Recognition · He, Zhang, Ren & Sun · Microsoft · CVPR 2016 (Best Paper)
🟥 читать целиком~1.5–2 чоригинал ↗
Суть за 20 секунд. Очень глубокие сети через skip-связи: блок учит остаток F(x), а выход = F(x) + x. Градиент течёт напрямую через skip и не затухает; сети в 50–152 слоя стали обучаемы. Residual-связи теперь везде, включая Transformer.

Контекст

Казалось бы, глубже = лучше — но у очень глубоких сетей росла ОШИБКА ОБУЧЕНИЯ (не тестовая, именно обучающая). Это не переобучение, а проблема ОПТИМИЗАЦИИ: простые глубокие стеки трудно обучить. Хе и др. (Microsoft) решают её.

Идея и механизм

Пусть блок учит не целевое преобразование H(x), а ОСТАТОК F(x) = H(x) − x, а выход складывается со входом через identity skip-connection:

y = F(x) + x

Если оптимум близок к тождеству, сети легче выучить F ≈ 0, чем подгонять тождество стеком нелинейностей. Это позволило обучать сети в 50, 101, 152 слоя и глубже.

мат. анализ Почему градиент не затухает: «магистраль» через skip

Производная выхода остаточного блока по входу:

∂y∂x = ∂(x + F(x))∂x = I + ∂F∂x

Сквозь L блоков градиент — произведение таких множителей. Из-за слагаемого I (тождество) всегда есть прямой путь: даже если все ∂F → 0, градиент остаётся ≈ 1, а не зануляется.

обычная сеть: ∂yL∂x0 = ∏l ∂Fl∂x → 0   vs   ResNet: ∏l (I + …) не затухает

«+I» — это вся суть: identity-shortcut прокладывает градиенту магистраль сквозь сотни слоёв. Та же идея, что аддитивный путь в LSTM (ct = ct−1 + …), только во времени там, а в глубину здесь.

PyTorch Остаточный блок
import torch, torch.nn as nn

class ResidualBlock(nn.Module):
    def __init__(self, C):
        super().__init__()
        self.f = nn.Sequential(
            nn.Conv2d(C, C, 3, padding=1), nn.BatchNorm2d(C), nn.ReLU(),
            nn.Conv2d(C, C, 3, padding=1), nn.BatchNorm2d(C))
    def forward(self, x):
        return torch.relu(x + self.f(x))   # skip-connection: x + F(x)
x F(x) identity skip (магистраль для градиента) + y
Блок учит остаток F(x); вход x идёт в обход по skip-связи и складывается с F(x). Skip — прямая магистраль для градиента сквозь глубину.
Аналогия. В небоскрёбе можно идти по лестнице (через все этажи-слои) или сесть в сквозной лифт (skip-связь). Сообщение (градиент) гарантированно доедет с любого этажа на первый, даже если лестница где-то завалена: лифт всегда работает. А каждому слою достаточно лишь чуть подправить то, что приехало (выучить остаток), а не строить весь маршрут заново.

Почему это важно

ResNet выиграл ImageNet-2015 (3.57% top-5) и одновременно detection/localization на ImageNet + detection/segmentation на COCO — свип пяти соревнований. Residual-связи стали универсальным приёмом: они в каждом блоке Transformer (#32), в диффузионных U-Net, почти везде. «Аддитивный путь спасает градиент» — один из самых переиспользуемых принципов в DL.

Связи

← опирается на25. VGG

VGG довела простое наращивание глубины до предела (19 слоёв) и упёрлась в деградацию. ResNet снимает именно эту стену — продолжает «глубже = лучше», но даёт глубине технический способ работать.

↔ родственник идеи11. LSTM

Один приём в двух обличьях: аддитивный «короткий путь» не даёт градиенту затухать. В LSTM это ct = ct−1 + … во времени; в ResNet — y = x + F(x) в глубину. Та же математика «+1» в производной.

→ встроен в32. Transformer

Каждый подслой трансформера обёрнут в residual + LayerNorm. Без skip-связей обучать глубокие трансформеры было бы так же тяжело, как глубокие CNN до ResNet. Идея 2015-го стала стандартным «клеем» любой глубокой архитектуры.

Вопросы пытливого ума

Почему просто складывать слои перестаёт работать, если это не переобучение?

Это проблема оптимизации, не ёмкости. Эмпирически у глубокого простого стека растёт ошибка обучения — он даже хуже подгоняет данные, чем мелкий, хотя «мог бы» хотя бы скопировать его и добавить тождественные слои. Оказывается, выучить тождество стеком нелинейностей трудно. Residual-переформулировка делает тождество «значением по умолчанию» (F=0), и трудность исчезает.

Skip-связь — это эвристика или за ней есть теория?

И то, и другое. Есть «градиентная магистраль» (мат-блок). Есть и другой взгляд: ResNet ведёт себя как ансамбль множества неглубоких путей разной длины (Veit, 2016) — выкидывание отдельных блоков почти не ломает сеть, как выкидывание одного дерева из леса. Ещё интерпретация — итеративное уточнение представления. Несколько теорий, и все по-своему верны.

Почему именно сложение x + F(x), а не конкатенация признаков?

Сложение сохраняет размерность, почти бесплатно и даёт чистую «+I» в градиенте. Конкатенация (так делает DenseNet) сохраняет все признаки всех слоёв — богаче, но растит число каналов и память. Это размен: ResNet проще и экономнее, DenseNet — информативнее, но тяжелее. Сложение победило за счёт простоты и масштабируемости.

Что читать в оригинале

Короткий — читать целиком. Поймите постановку «проблемы деградации» и почему skip — это про оптимизацию, а не про ёмкость; это один из важнейших инженерных уроков канона.