Что такое residual блок?
Что проверяют
Понимаете ли вы, какую проблему решает skip-соединение и почему без него глубокие сети обучались хуже неглубоких. Следом обычно спрашивают про bottleneck-блок и про то, что делать, когда размерности входа и выхода не совпадают.
Как отвечать
Residual блок вычисляет не H(x), а F(x) + x: слои учат только поправку к входу, а сам вход идёт в обход по короткому пути (shortcut) и складывается с выходом поэлементно.
Мотивация из статьи He et al. 2015 про ResNet: обычная сеть на 56 слоёв давала ошибку выше, чем на 20 слоёв, причём на обучающей выборке. Это не переобучение, а проблема оптимизации, её назвали деградацией. Если лишним слоям выгодно ничего не делать, в residual блоке достаточно свести F к нулю, а выучить тождественное отображение стопкой нелинейных слоёв трудно. Заодно градиент по shortcut доходит до ранних слоёв без затухания: производная суммы по x содержит единичное слагаемое.
Разновидности:
- basic block: две свёртки 3×3 с BatchNorm и ReLU, так устроены ResNet-18 и ResNet-34;
- bottleneck: 1×1 сжимает каналы, 3×3 работает на узком представлении, 1×1 расширяет обратно (в первой стадии ResNet-50 с 64 до 256 каналов). Так глубокая сеть остаётся дешёвой по FLOPs;
- projection shortcut: если блок меняет число каналов или делает stride 2, вход приводят к нужной форме свёрткой 1×1;
- pre-activation (ResNet v2): BatchNorm и ReLU стоят до свёрток, и shortcut остаётся чистым тождеством.
Идея давно вышла за пределы свёрточных сетей: в каждом слое трансформера attention и MLP обёрнуты residual соединением.
Где спотыкаются
Объясняют всё затухающим градиентом. Авторы ResNet прямо писали, что с BatchNorm градиенты уже не затухали, а главной бедой была деградация точности.
Путают сложение с конкатенацией. Сумма у ResNet, конкатенация у DenseNet и в skip-связях U-Net: это разные блоки с разным числом каналов на выходе.
Не могут ответить, как сложить тензоры разной формы. Без projection shortcut или дополнения каналов код упадёт на несовпадении размерностей.