Свёрточные сети (CNN)
Свёрточные нейросети (convolutional neural networks, CNN) десятилетие правили компьютерным зрением — и до сих пор их идеи (локальность, разделяемые веса, иерархия признаков) обязательны к пониманию, даже если сегодня вы обучаете трансформеры.
Интуиция: почему полносвязная сеть плоха для картинок
Возьмём скромную картинку 224×224×3 и полносвязный (fully connected) слой на 1000 нейронов: 224·224·3·1000 ≈ 150 миллионов весов в одном слое. Мало того, что это дорого — сеть должна отдельно выучить «кошачье ухо в левом верхнем углу» и «то же ухо чуть правее»: у полносвязного слоя нет никакой инвариантности к сдвигу (translation invariance), каждый пиксель для него — независимый признак.
Свёртка чинит обе проблемы одним приёмом: вместо того чтобы соединять каждый нейрон со всеми пикселями, мы берём маленькое ядро (kernel, фильтр) — например 3×3 — и скользим им по всей картинке. В каждой позиции считаем скалярное произведение окна пикселей и ядра — получаем одно число. Пройдя все позиции, получаем карту признаков (feature map): «карту откликов» детектора на каждом участке изображения.
Как это работает
Ключевые свойства и параметры:
- Разделяемые веса (weight sharing): одно и то же ядро используется во всех позициях. Вместо миллионов весов — 9 чисел, а признак «вертикальная граница» детектируется где угодно на картинке.
- Каналы и фильтры: у входа несколько каналов (RGB — три), ядро на самом деле имеет размер 3×3×Cin. Фильтров в слое много (32, 64, 128…), каждый ищет свой признак и выдаёт свою карту — выход имеет Cout каналов.
- Stride — шаг скольжения: stride 2 уменьшает карту вдвое.
- Padding — рамка нулей по краям: без неё карта уменьшается (16×16 при ядре 3×3 → 14×14), с padding «same» размер сохраняется.
- Pooling — агрегация соседних значений (обычно max по окну 2×2): уменьшает карту, добавляет устойчивость к мелким сдвигам.
Иерархия признаков и типовая архитектура
Магия CNN — в стопке свёрточных слоёв. Первый слой видит окна 3×3 и учит простейшие признаки: края, градиенты яркости. Второй слой смотрит уже на карты первого — его «поле зрения» (receptive field) шире, и он собирает края в текстуры и углы. Дальше — части объектов (глаз, колесо), а на верхних слоях — целые объекты. Эта иерархия края → текстуры → части → объекты не запрограммирована: она возникает сама при обучении, и её реально видно при визуализации фильтров.
Типовая архитектура классификатора:
# [conv 3×3 → ReLU → conv 3×3 → ReLU → maxpool 2×2] × N
# затем flatten → полносвязный слой → softmax
x = pool(relu(conv2(relu(conv1(img))))) # блок повторяется, каналов всё больше
logits = fc(flatten(x)) # классификация по сжатому представлению
С глубиной пространственный размер карт падает (pooling/stride), а число каналов растёт: сеть обменивает «где» на «что».
CNN сегодня
В классификации изображений визуальные трансформеры (ViT, vision transformer) потеснили CNN: они режут картинку на патчи и обрабатывают их вниманием, выигрывая на больших датасетах. Но хоронить свёртки рано: они по-прежнему сильны при небольших данных (локальность и разделяемые веса — это встроенное знание о природе изображений, inductive bias), живут в мобильных и realtime-системах, а понимание receptive field, stride и weight sharing спрашивают на собеседованиях независимо от того, что нынче в моде.
- «Посчитайте параметры свёрточного слоя» — (K·K·Cin + 1)·Cout: например, ядро 3×3, 3 входных и 16 выходных каналов → (9·3+1)·16 = 448. Сравните со 150M у полносвязного — эффектный аргумент.
- «Каким станет выход 16×16 после свёртки 3×3 без padding?» — 14×14: формула (N − K)/stride + 1.
- «Зачем pooling?» — уменьшить карты (дешевле), расширить receptive field, добавить устойчивость к мелким сдвигам.
- «Чем CNN лучше/хуже ViT?» — CNN: сильный inductive bias, хороши при малых данных и на слабом железе; ViT: гибче и лучше масштабируются на больших датасетах.