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

Зачем нужны свёртки, если есть полносвязные сети

Полносвязная сеть на изображении 224×224×3 уже на первом слое потребует миллионы параметров. Это не только медленно, но и приводит к переобучению. Свёрточный слой решает две задачи: локальная связность (каждый нейрон смотрит на небольшой участок изображения) и разделение весов (одно и то же ядро скользит по всей картинке). Благодаря этому сеть учится распознавать простые паттерны — границы, углы, текстуры — независимо от их положения. Глубокие слои комбинируют эти паттерны в более сложные объекты.

Из чего состоит типичная CNN

Большинство современных свёрточных архитектур строятся по одной схеме: несколько блоков «свёртка → активация → пулинг», затем несколько полносвязных слоёв для классификации. Вот основные компоненты:

  • Свёрточный слой — набор фильтров (ядер), каждый из которых выделяет свой признак. Размер ядра обычно 3×3 или 5×5, количество фильтров — гиперпараметр.
  • Функция активации — чаще всего ReLU (или её варианты), добавляет нелинейность.
  • Пулинг — уменьшает пространственные размеры, снижая вычислительную сложность и обеспечивая инвариантность к небольшим сдвигам. Max-pooling 2×2 — стандартный выбор.
  • Полносвязные слои — в конце преобразуют карты признаков в вектор для классификации или регрессии.
  • Нормализация — Batch Normalization или Layer Normalization помогают стабилизировать обучение.

Современные архитектуры (ResNet, EfficientNet) добавляют skip-connections и более сложные блоки, но базовая логика остаётся той же.

Как выбрать архитектуру под задачу

Не стоит сразу бросаться в сложные модели. Начните с простого бейзлайна и постепенно усложняйте. Вот критерии выбора:

  • Размер датасета. Для небольших наборов (менее 10–20 тыс. изображений) лучше использовать предобученные модели (transfer learning) и замораживать свёрточные слои.
  • Домен. Для медицинских снимков или спутниковых изображений может потребоваться адаптация архитектуры (например, изменение размера ядер или использование 3D-свёрток).
  • Ресурсы. Если нет GPU, выбирайте лёгкие модели (MobileNet, SqueezeNet).
  • Интерпретируемость. Если важно понимать, на что смотрит сеть, используйте методы визуализации (Grad-CAM) и архитектуры с вниманием.

Практический совет: начните с ResNet-18 или EfficientNet-B0, обученных на ImageNet, и дообучите на своих данных. Это часто даёт лучший результат, чем обучение с нуля.

Типичные ошибки и как их избежать

Даже опытные практики иногда допускают досадные промахи. Вот несколько распространённых:

  • Неправильная нормализация данных. Если вы используете предобученную модель, приводите изображения к тому же распределению, на котором она обучалась (например, вычитание среднего и деление на стандартное отклонение ImageNet).
  • Слишком большой learning rate. Свёрточные сети чувствительны к скорости обучения. Начните с 1e-3 и используйте scheduler (например, ReduceLROnPlateau).
  • Игнорирование аугментации. Повороты, сдвиги, изменения яркости — простой способ улучшить обобщение без сбора новых данных.
  • Переобучение из-за малого датасета. Добавьте dropout, weight decay и раннюю остановку. Следите за валидационной метрикой.
  • Неправильная интерпретация пулинга. Max-pooling может терять информацию о точном положении объектов. В задачах сегментации или детекции часто используют stride-свёртки вместо пулинга.

Пример из практики: при классификации дефектов на производстве одна команда забыла про аугментацию и получила точность 95% на валидации, но 60% на реальных данных. Добавление поворотов и изменения контраста подняло реальную точность до 85%.

Что дальше

Свёрточные сети — это фундамент для многих современных приложений: от распознавания лиц до анализа медицинских изображений. Освоив базовые компоненты и типичные ошибки, вы сможете уверенно экспериментировать с архитектурами и применять transfer learning. В следующей части серии имеет смысл перейти к рекуррентным сетям и трансформерам, которые дополняют CNN в задачах обработки последовательностей. Практикуйтесь на открытых датасетах (CIFAR-10, ImageNet) и не бойтесь начинать с простых моделей.