Диагностика Mock-интервью
Главная · Нейронные сети

Свёрточные сети (CNN)

Свёрточные нейросети (convolutional neural networks, CNN) десятилетие правили компьютерным зрением — и до сих пор их идеи (локальность, разделяемые веса, иерархия признаков) обязательны к пониманию, даже если сегодня вы обучаете трансформеры.

Интуиция: почему полносвязная сеть плоха для картинок

Возьмём скромную картинку 224×224×3 и полносвязный (fully connected) слой на 1000 нейронов: 224·224·3·1000 ≈ 150 миллионов весов в одном слое. Мало того, что это дорого — сеть должна отдельно выучить «кошачье ухо в левом верхнем углу» и «то же ухо чуть правее»: у полносвязного слоя нет никакой инвариантности к сдвигу (translation invariance), каждый пиксель для него — независимый признак.

Свёртка чинит обе проблемы одним приёмом: вместо того чтобы соединять каждый нейрон со всеми пикселями, мы берём маленькое ядро (kernel, фильтр) — например 3×3 — и скользим им по всей картинке. В каждой позиции считаем скалярное произведение окна пикселей и ядра — получаем одно число. Пройдя все позиции, получаем карту признаков (feature map): «карту откликов» детектора на каждом участке изображения.

Как это работает

y[i, j] = Σu Σv K[u, v] · X[i + u, j + v]

Ключевые свойства и параметры:

💡 Ключевая мысль Свёртка — это один маленький детектор, который применяется во всех местах картинки. Отсюда и экономия параметров, и устойчивость к сдвигу: признак ищется везде одними и теми же весами.

Иерархия признаков и типовая архитектура

Магия 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: гибче и лучше масштабируются на больших датасетах.