27 ResNet
Контекст
Казалось бы, глубже = лучше — но у очень глубоких сетей росла ОШИБКА ОБУЧЕНИЯ (не тестовая, именно обучающая). Это не переобучение, а проблема ОПТИМИЗАЦИИ: простые глубокие стеки трудно обучить. Хе и др. (Microsoft) решают её.
Идея и механизм
Пусть блок учит не целевое преобразование H(x), а ОСТАТОК F(x) = H(x) − x, а выход складывается со входом через identity skip-connection:
Если оптимум близок к тождеству, сети легче выучить F ≈ 0, чем подгонять тождество стеком нелинейностей. Это позволило обучать сети в 50, 101, 152 слоя и глубже.
мат. анализ Почему градиент не затухает: «магистраль» через skip
Производная выхода остаточного блока по входу:
Сквозь L блоков градиент — произведение таких множителей. Из-за слагаемого I (тождество) всегда есть прямой путь: даже если все ∂F → 0, градиент остаётся ≈ 1, а не зануляется.
«+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)
Почему это важно
ResNet выиграл ImageNet-2015 (3.57% top-5) и одновременно detection/localization на ImageNet + detection/segmentation на COCO — свип пяти соревнований. Residual-связи стали универсальным приёмом: они в каждом блоке Transformer (#32), в диффузионных U-Net, почти везде. «Аддитивный путь спасает градиент» — один из самых переиспользуемых принципов в DL.
Связи
VGG довела простое наращивание глубины до предела (19 слоёв) и упёрлась в деградацию. ResNet снимает именно эту стену — продолжает «глубже = лучше», но даёт глубине технический способ работать.
Один приём в двух обличьях: аддитивный «короткий путь» не даёт градиенту затухать. В LSTM это ct = ct−1 + … во времени; в ResNet — y = x + F(x) в глубину. Та же математика «+1» в производной.
Каждый подслой трансформера обёрнут в residual + LayerNorm. Без skip-связей обучать глубокие трансформеры было бы так же тяжело, как глубокие CNN до ResNet. Идея 2015-го стала стандартным «клеем» любой глубокой архитектуры.
Вопросы пытливого ума
Почему просто складывать слои перестаёт работать, если это не переобучение?
Это проблема оптимизации, не ёмкости. Эмпирически у глубокого простого стека растёт ошибка обучения — он даже хуже подгоняет данные, чем мелкий, хотя «мог бы» хотя бы скопировать его и добавить тождественные слои. Оказывается, выучить тождество стеком нелинейностей трудно. Residual-переформулировка делает тождество «значением по умолчанию» (F=0), и трудность исчезает.
Skip-связь — это эвристика или за ней есть теория?
И то, и другое. Есть «градиентная магистраль» (мат-блок). Есть и другой взгляд: ResNet ведёт себя как ансамбль множества неглубоких путей разной длины (Veit, 2016) — выкидывание отдельных блоков почти не ломает сеть, как выкидывание одного дерева из леса. Ещё интерпретация — итеративное уточнение представления. Несколько теорий, и все по-своему верны.
Почему именно сложение x + F(x), а не конкатенация признаков?
Сложение сохраняет размерность, почти бесплатно и даёт чистую «+I» в градиенте. Конкатенация (так делает DenseNet) сохраняет все признаки всех слоёв — богаче, но растит число каналов и память. Это размен: ResNet проще и экономнее, DenseNet — информативнее, но тяжелее. Сложение победило за счёт простоты и масштабируемости.
Что читать в оригинале
Короткий — читать целиком. Поймите постановку «проблемы деградации» и почему skip — это про оптимизацию, а не про ёмкость; это один из важнейших инженерных уроков канона.