Эпоха 3 · Взрыв deep learning · 2014

25 VGG

Very Deep Convolutional Networks for Large-Scale Image Recognition · Simonyan & Zisserman · ICLR 2015
🟦 хватит конспекта~20–30 миноригинал ↗
Суть за 20 секунд. Очень глубокая CNN с предельно простым дизайном: только свёртки 3×3 и пулинг 2×2, стопкой до 16–19 слоёв. Идея: два 3×3 = рецептивное поле 5×5 при меньшем числе параметров и большей нелинейности → глубина важнее размера фильтра.

Контекст

После 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². Сравним при одинаковом рецептивном поле:

два 3×3: 2·9C² = 18C²  vs  один 5×5: 25C²
три 3×3: 27C²  vs  один 7×7: 49C²

Стек маленьких фильтров даёт то же рецептивное поле дешевле по параметрам и с большим числом нелинейностей (между свёртками стоят 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),
)
3×3 один 3×3 видит 3×3, два 3×3 подряд видят 5×5 …дешевле и нелинейнее, чем один 5×5
Стек маленьких свёрток постепенно расширяет рецептивное поле, оставаясь дешевле и «нелинейнее» одного большого фильтра.
Аналогия. Чтобы увидеть большую панораму, не обязательно один гигантский объектив — можно пройти несколько шагов назад, делая по кадру. Каждый «шаг» (слой 3×3) чуть расширяет обзор, и между шагами можно подумать (ReLU). В сумме охват тот же, что у дорогущего широкоугольника, но гибче и дешевле.

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

VGG-16/19 — очень регулярная архитектура. Хоть тяжёлая (138M параметров) и проигравшая классификацию GoogLeNet на ILSVRC-2014, её равномерность сделала её любимым backbone для feature extraction и perceptual loss (стиль-перенос, метрики качества) на годы.

Связи

← опирается на16. AlexNet

VGG продолжает линию AlexNet, но систематизирует её: вместо разнокалиберных фильтров — однообразные 3×3, и больше глубины. Это «причёсанный» AlexNet, доведённый до ясного принципа «глубина + маленькие фильтры».

→ упирается в27. ResNet

VGG довела глубину до 19 слоёв, но дальше простое наращивание перестало работать (деградация). ResNet через год решит эту стену skip-связями и доведёт глубину до 152 — прямое продолжение вопроса «как сделать сети ещё глубже».

↔ контраст32. Transformer

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 эффективнее (мат-блок).