У нас на руках три детали: свёртка ищет локальный признак, нелинейность даёт остроту, пулинг гасит чувствительность к сдвигу. Пора собрать из них машину. Свёрточная сеть — это стопка одинаковых блоков, в которой картинка слой за слоем превращается из пикселей в признаки, а из признаков — в ответ.
От отдельных приёмов к архитектуре
В прошлых уроках мы разобрали части поодиночке: свёртку, нелинейность и пулинг. Каждая делает одно маленькое дело. Сила рождается, когда их складывают в повторяющийся блок и ставят такие блоки друг на друга. Так устроена свёрточная нейронная сеть (CNN) — рабочая лошадь компьютерного зрения.
Идея не нова. Ещё в году Кунихико Фукусима построил неокогнитрон — сеть, чередующую слои, которые выделяют локальный признак, и слои, которые терпят его сдвиг. Это в точности пара «свёртка — пулинг», только веса тогда задавали вручную. Современная CNN — тот же скелет, но веса в ней находятся обучением.
Блок: свёртка, нелинейность, пулинг
Стандартный блок CNN складывается из трёх наших деталей по порядку. Свёртка ищет признаки и выдаёт несколько карт. Нелинейность (обычно ReLU) обрезает отрицательные отклики, оставляя «где признак есть». Пулинг уменьшает карту вдвое и делает её устойчивой к сдвигу.
Поставив несколько блоков подряд, получаем сеть, в которой каждый следующий блок работает уже не с пикселями, а с картами признаков предыдущего. Так простое собирается в сложное. Схематично вся сеть — это composition однотипных блоков и финальной головы:
Именно такую сеть — стопку свёрток и пулингов с полносвязной головой, обучаемую целиком, — Ян ЛеКун собрал в конце -х под именем LeNet и научил читать рукописные цифры на почтовых индексах.
Конус: пространство сжимается, каналы растут
У стопки блоков есть характерная форма. Пулинг раз за разом уменьшает сторону карты, а число каналов, наоборот, растят: чем абстрактнее признак, тем больше их разновидностей нужно. Картинка превращается в узкую, но глубокую колонку признаков.

Слева направо: сторона карты убывает , а каналов становится всё больше (). Синие блоки — свёртки, золотые — пулинг. В конце узкая колонка признаков разворачивается в ответ.
Рецептивное поле растёт вглубь
Одна клетка глубокого слоя «видит» большой кусок исходного изображения, хотя каждое ядро остаётся крошечным. Рецептивное поле растёт по простому правилу: каждый слой прибавляет к нему шагов, а пулинг ещё и удваивает «шаг взгляда»:
Для нашей сети поле растёт : к четвёртому слою один нейрон охватывает уже участок входа — половину картинки.
Иерархия признаков на реальном фото
Что происходит с изображением внутри стопки, видно, если прогнать по ней настоящую фотографию слой за слоем. Мы уже видели на первом слое, как детекторы края превращают пиксели в контуры; теперь посмотрим, что делают с этими контурами следующие слои.

Слева вход, дальше — карты признаков слой за слоем. Первый слой выделяет края, второй собирает из них пятна и углы, глубже карты становятся мельче и абстрактнее. Так пиксели превращаются в признаки, а признаки — в части.
Неокогнитрон: предок
Скелет CNN придумали задолго до её расцвета. Неокогнитрон Фукусимы чередовал два сорта слоёв: S-клетки выделяли локальный признак (наша свёртка), C-клетки собирали отклики соседних S-клеток и потому терпели сдвиг (наш пулинг). Не хватало лишь одного — способа находить веса из данных, который дало обратное распространение.
Где живут веса
У готовой архитектуры есть неожиданная особенность. Свёрточные слои, несмотря на всю работу, почти ничего не весят: их ядра крошечные и общие для всего поля. А вот полносвязная голова в конце — где узкую колонку признаков разворачивают в ответ — хранит львиную долю всех весов.

У классической сети LeNet свёртки хранят лишь веса, а полносвязная голова — : всех параметров сети сидят в голове. Свёртка дёшева по весам именно из-за разделения ядра на всё поле.
Голова: полносвязная или среднее
Раз голова так дорога, нельзя ли её облегчить? Можно. Вместо того чтобы разворачивать всю карту признаков в один длинный вектор, берут по каждому каналу его среднее — глобальное среднее (global average pooling). Карта превращается всего в чисел, и голова худеет драматически: у нашей сети веса головы сменяются на — в триста с лишним раз меньше.
Экономия — не единственная выгода. Полносвязная голова намертво привязана к размеру карты: обучил на — и другой размер уже не подашь, число входов головы не сойдётся. Глобальное среднее усредняет каждый канал независимо от размера карты, поэтому сеть с ним принимает картинки любого разрешения. Оттого современные архитектуры почти отказались от тяжёлых полносвязных голов в пользу глобального среднего — и стали легче, и стали гибче.
Русская линия: слоистые сети Ивахненко
Идею наращивать сеть слой за слоем, добавляя блоки один поверх другого, задолго до расцвета CNN развивал советский учёный Алексей Ивахненко. Его метод группового учёта аргументов () строил многослойные модели снизу вверх: каждый следующий слой собирал новые признаки из выходов предыдущего, а лишние отсеивались. Многие сегодня называют эти самоорганизующиеся слоистые сети одним из первых примеров глубокого обучения.
Разница с CNN в деталях, но идея общая: глубокую сеть собирают из однотипных слоёв, и каждый следующий работает с признаками предыдущего. Ивахненко искал такие слои алгоритмом отбора; свёрточная сеть находит их градиентным спуском. Обе идеи — наращивать глубину и переиспользовать устройство слоя — оказались тем фундаментом, на котором держится всё современное глубокое обучение, от распознавания лиц до языковых моделей. И родились они порознь: в Японии у Фукусимы, в СССР у Ивахненко, во Франции и США у ЛеКуна — там, где для них созрела почва.
Лаборатория архитектора
Порядок опытов. Добавляйте блоки «свёртка + пулинг» и следите за табло: с каждым блоком карта признаков вдвое мельче, каналов больше, а рецептивное поле шире — одна клетка видит всё больший кусок фотографии. Заметьте, как мало весят свёртки. Затем переключите голову с полносвязной на глобальное среднее и посмотрите, как число параметров головы падает в сотни раз. Вы своими руками соберёте конус от пикселей к признакам.
Сборка: стопка блоков от пикселя до ответа
Свёрточная сеть — это стопка одинаковых блоков «свёртка → нелинейность → пулинг», в которой пространство карты слой за слоем сжимается, число каналов растёт, а рецептивное поле одной клетки ширится от пикселя до целого объекта. Так пиксели превращаются в края, края — в части, части — в ответ, и мы видели эту иерархию на настоящей фотографии. Скелет придумал ещё неокогнитрон Фукусимы, а идею растить сеть слой за слоем — Ивахненко; недоставало лишь обучения весов, которое дало обратное распространение. Мы заметили и где в сети живут веса: почти все — в полносвязной голове, которую глобальное среднее облегчает в сотни раз. Полная архитектура зрения собрана. Дальше — как научить её не только видеть тренировочные картинки, но и обобщать на новые: об аугментации, переобучении и переносе знаний.