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

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

Раздел: [Нейронные сети](https://ml-book.com/s/neural-nets/) · Страница темы: https://ml-book.com/t/cnn/ · Обновлено: 2026-07-07 · Источник: ml-book.com, учебник делается сообществом

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

Возьмём скромную картинку 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]`

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

- **Разделяемые веса (weight sharing)**: одно и то же ядро используется во всех позициях. Вместо миллионов весов — 9 чисел, а признак «вертикальная граница» детектируется где угодно на картинке.
- **Каналы и фильтры**: у входа несколько каналов (RGB — три), ядро на самом деле имеет размер 3×3×C_{in}. Фильтров в слое много (32, 64, 128…), каждый ищет свой признак и выдаёт свою карту — выход имеет C_{out} каналов.
- **Stride** — шаг скольжения: stride 2 уменьшает карту вдвое.
- **Padding** — рамка нулей по краям: без неё карта уменьшается (16×16 при ядре 3×3 → 14×14), с padding «same» размер сохраняется.
- **Pooling** — агрегация соседних значений (обычно max по окну 2×2): уменьшает карту, добавляет устойчивость к мелким сдвигам.

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

> 🎛 Интерактивная визуализация — на странице темы: https://ml-book.com/t/cnn/

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

Магия 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·C_{in} + 1)·C_{out}: например, ядро 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: гибче и лучше масштабируются на больших датасетах.

## Связанные темы

- [Распознавание цифр из пикселей](https://ml-book.com/t/digits-mnist/)
- [От нейрона к многослойному перцептрону](https://ml-book.com/t/perceptron-mlp/)
- [Как LLM видят изображения](https://ml-book.com/t/multimodal-llm/)
- [Архитектура трансформера](https://ml-book.com/t/transformer/)

---

Интерактив, тест из 12 вопросов и карточки терминов — на странице темы: https://ml-book.com/t/cnn/
Весь учебник в markdown: https://ml-book.com/llms-full.txt · Оглавление для агентов: https://ml-book.com/llms.txt
