25 VGG
Контекст
После AlexNet (#16) — гонка архитектур CNN. Симонян и Зиссерман (Oxford) проверяют роль чистой ГЛУБИНЫ при предельно простом, однородном дизайне.
Идея и механизм
Использовать только маленькие свёртки 3×3 (stride 1) и max-pool 2×2, складывая их в стек глубиной 16–19 слоёв и удваивая число каналов после каждого пулинга. Равномерность дизайна — главная черта VGG.
линейная алгебра Почему стек 3×3 лучше одного большого фильтра
Рецептивное поле. Два 3×3-слоя подряд «видят» область 5×5, три — 7×7: каждый следующий слой расширяет охват на 2.
Параметры. Свёртка 3×3 с C каналами на входе и выходе стоит 3·3·C² = 9C². Сравним при одинаковом рецептивном поле:
Стек маленьких фильтров даёт то же рецептивное поле дешевле по параметрам и с большим числом нелинейностей (между свёртками стоят ReLU). Глубина с маленькими фильтрами выигрывает по обоим параметрам — это и есть главный урок VGG.
PyTorch Блок VGG
import torch.nn as nn
# два 3×3 (рецептивное поле как 5×5) + ReLU + пулинг
block = nn.Sequential(
nn.Conv2d(C, C, 3, padding=1), nn.ReLU(inplace=True),
nn.Conv2d(C, C, 3, padding=1), nn.ReLU(inplace=True),
nn.MaxPool2d(2),
)
Почему это важно
VGG-16/19 — очень регулярная архитектура. Хоть тяжёлая (138M параметров) и проигравшая классификацию GoogLeNet на ILSVRC-2014, её равномерность сделала её любимым backbone для feature extraction и perceptual loss (стиль-перенос, метрики качества) на годы.
Связи
VGG продолжает линию AlexNet, но систематизирует её: вместо разнокалиберных фильтров — однообразные 3×3, и больше глубины. Это «причёсанный» AlexNet, доведённый до ясного принципа «глубина + маленькие фильтры».
VGG довела глубину до 19 слоёв, но дальше простое наращивание перестало работать (деградация). ResNet через год решит эту стену skip-связями и доведёт глубину до 152 — прямое продолжение вопроса «как сделать сети ещё глубже».
VGG — апофеоз «зашитого» индуктивного смещения (локальность свёртки, иерархия). Transformer и ViT идут в противоположную сторону — минимум встроенных предположений, всё выучивается из данных. История качается между этими полюсами.
Вопросы пытливого ума
Если глубина с маленькими фильтрами так хороша, почему не строить сети из 3×3 бесконечной глубины?
Потому что простое наращивание упирается в проблему оптимизации: у очень глубоких сетей растёт даже ошибка обучения (деградация, не переобучение). VGG-19 близка к пределу того, что обучается «в лоб». Стену пробьёт ResNet skip-связями — без них глубина за ~20 слоёв перестаёт помогать.
VGG проиграла GoogLeNet — почему её всё равно так любят?
За простоту и однородность. GoogLeNet с его inception-модулями сложнее и капризнее как backbone. VGG предсказуема: ровный стек 3×3 легко резать на признаки разного уровня, поэтому она стала стандартом для transfer learning, perceptual loss и стиль-переноса — победа в удобстве, а не в метрике конкурса.
Откуда 138M параметров, если все фильтры маленькие?
Почти все они — в полносвязных слоях в конце (fc-4096), а не в свёртках. Это позже исправили: global average pooling вместо больших FC-слоёв срезает параметры на порядок при том же качестве. VGG — наглядный пример, что «тяжесть» сети часто не там, где кажется.
Что читать в оригинале
Идея простая — конспекта достаточно. Главное усвоить принцип «глубина + маленькие фильтры» и почему стек 3×3 эффективнее (мат-блок).