CNN: архитектура свёрточной нейронной сети

Свёрточные нейронные сети (CNN) стали стандартом в задачах компьютерного зрения: распознавание изображений, детекция объектов, сегментация. В основе их эффективности лежат два ключевых принципа - разделение весов (один фильтр проходит по всему изображению) и локальная связность (нейрон «видит» только небольшой патч входа). Вместе они резко сокращают число параметров по сравнению с полносвязной сетью и делают признаки инвариантными к сдвигу объекта. Прежде чем разбирать математику, подвигайте ползунки в калькуляторе ниже: вы сразу увидите, как меняется размер карты признаков от слоя к слою и сколько параметров накапливается в архитектуре.
Операция свёртки и формула размера карты признаков
Сердце CNN - свёрточный слой (convolutional layer). Фильтр (ядро) размера скользит по входной карте шириной пикселей с шагом и паддингом . Выходной размер по каждой оси:
Например, вход , фильтр , , : . Карта признаков после свёртки - . Добавьте паддинг - и размер сохранится: . Это называют «same padding» - он популярен, когда нельзя терять пространственное разрешение.
Один фильтр порождает одну двумерную карту признаков. Если в слое фильтров, на выходе карт - трёхмерный тензор . Параметров в одном свёрточном слое (без учёта входных каналов ):
где последнее слагаемое - смещения (bias). При , , : параметров. Это ничтожно по сравнению с полносвязным слоем, который при входе и нейронах потребовал бы параметров.
Пулинговые слои и рецептивное поле
После свёртки обычно ставят слой субдискретизации (pooling). Самый распространённый - MaxPooling: окно со сдвигом берёт максимум из четырёх пикселей, уменьшая карту вдвое по каждой оси:
Пулинг решает три задачи: уменьшает число вычислений, подавляет незначительные флуктуации и увеличивает рецептивное поле - область входного изображения, на которую «смотрит» один нейрон в глубоких слоях. После двух свёрток рецептивное поле равно ; с каждым пулингом оно удваивается, позволяя глубоким фильтрам реагировать на крупные структуры (контуры, части объектов).

AveragePooling - альтернатива MaxPooling: берёт среднее, а не максимум. Он мягче и применяется, например, в финальном Global Average Pooling (GAP), заменяющем полносвязные слои в современных архитектурах типа ResNet - вход сворачивается до вектора .
Классическая архитектура LeNet-5
LeNet-5 (Лекун, 1998) - первая успешная CNN для распознавания цифр MNIST. Её архитектура задала канон: чередующиеся свёрточные и пулинговые слои сужают пространственные размеры, но наращивают глубину (число каналов), затем полносвязные слои отображают признаки в классы.
Последовательность слоёв:
- Вход (градации серого)
- Conv1: 6 фильтров , →
- AvgPool1: →
- Conv2: 16 фильтров , →
- AvgPool2: → чисел
- FC1: 256 → 120, FC2: 120 → 84, FC3: 84 → 10 (классов)
Всего около 60 тысяч параметров - по меркам 1998 года немного, а точность на MNIST - 99,2%. Современные архитектуры (AlexNet, VGG, ResNet) сохраняют ту же логику, лишь масштабируя глубину и ширину.
Нелинейность, функция активации и батч-нормализация
После каждой свёртки применяется функция активации. Исторически использовали и sigmoid, но сейчас стандарт - ReLU:
ReLU не насыщается при больших значениях (нет исчезающего градиента в положительной области), вычислительно тривиальна и на практике сходится быстрее. Её вариации - Leaky ReLU, ELU, GELU - решают проблему «мёртвых нейронов» (нейрон с постоянным нулевым выходом).
Батч-нормализация (BatchNorm) вставляется между свёрткой и активацией. Она нормирует активации по мини-батчу, ускоряет обучение и позволяет использовать большие шаги обучения без взрыва градиентов. Де-факто обязательный элемент глубоких CNN с 2015 года.
VGG, ResNet и современные тенденции
VGG (2014) показала, что глубина важнее ширины фильтров: набор из маленьких ядер эффективнее одного большого - рецептивное поле то же, а параметров меньше. Три слоя Conv дают рецептивное поле , но параметров против у одного ядра .
ResNet (2015) ввела остаточные соединения (skip connections): выход блока - сумма входа и преобразования входа. Это позволяет обучать сети глубиной сотни слоёв без деградации:
Если блок не нужен, он обнуляется, и градиент течёт напрямую через тождественное отображение. EfficientNet (2019) масштабирует глубину, ширину и разрешение одновременно по единой формуле - и достигает рекордной точности при минимальном числе параметров.
Практические тонкости: инициализация и регуляризация
Инициализация весов критична. Случайные малые числа из нормального распределения (по Гауссу) приводят к исчезающему или взрывному градиенту в глубоких сетях. Инициализация He (для ReLU): , где - число входных связей нейрона. Для /sigmoid - инициализация Xavier: . Нулевая инициализация полностью запрещена: все нейроны одного слоя получат одинаковые градиенты и навсегда останутся симметричными - это называется «проблемой симметрии».
Dropout (выключение случайных нейронов с вероятностью во время обучения) - классический регуляризатор. В свёрточных слоях эффективнее Dropout2D: выключается целый канал, а не отдельный нейрон. L2-регуляризация (weight decay) добавляет к функции потерь штраф и препятствует переобучению на маленьких датасетах.
Аугментация данных - отдельный мощный инструмент регуляризации. Случайные повороты, отражения, кроп, изменение яркости и контраста «умножают» обучающую выборку без сбора новых данных. Для медицинских изображений типичная аугментация включает упругие деформации, имитирующие анатомическую вариабельность. При обучении с нуля на маленьком датасете (менее 10 000 примеров) аугментация дешевле и эффективнее, чем добавление слоёв. Transfer learning (перенос весов предобученной модели, например ImageNet) ещё эффективнее: первые слои CNN детектируют универсальные признаки - грани, текстуры, - и почти не требуют дообучения.
Частые ошибки
- Неучёт паддинга при расчёте размера. Применив формулу без паддинга, получают неверный размер карты - особенно при нескольких слоях подряд. Всегда подставляйте явно.
- Забытый bias в подсчёте параметров. Параметров в свёрточном слое , а не . При разница - 128 параметров; незначительно для одного слоя, но складывается.
- Stride > 1 вместо пулинга. Stride позволяет уменьшать размер без пулинга, но удаляет информацию о локальных максимумах. В задачах классификации это допустимо; в задачах детекции - нет.
- Слишком мало фильтров в первом слое. Первый свёрточный слой должен иметь достаточно фильтров, чтобы уловить базовые текстуры (грани, углы). Меньше 8-16 фильтров - информационное узкое место.
- Применение Dropout к свёрточным слоям без Dropout2D. Обычный Dropout хуже работает в свёрточных слоях: соседние пиксели коррелированы, и нейросеть легко восстанавливает «выбитый» нейрон по соседям.
FAQ
Чем отличается свёрточный слой от полносвязного? В полносвязном слое каждый нейрон связан со всеми входами - число параметров пропорционально произведению размеров входа и выхода. В свёрточном нейрон видит только локальный патч, а веса фильтра разделяются по всей карте. При входе полносвязный слой с 512 выходами имеет около 25 млн параметров; свёрточный с фильтром и 512 каналами - лишь 4608.
Что происходит с размером карты при stride = 2? Формула та же: . При , , : . Размер уменьшается примерно вдвое - эффект аналогичен MaxPooling, но без явного пулингового слоя.
Зачем нужна батч-нормализация, если есть Dropout? Это разные механизмы. BatchNorm нормирует распределение активаций и ускоряет сходимость; Dropout - регуляризатор, снижающий переобучение случайным «глушением» нейронов. Современные сети обычно используют оба - BatchNorm после свёртки, Dropout перед полносвязными слоями.
Коротко
Свёрточная нейронная сеть строится из чередующихся свёрточных слоёв (локальные фильтры со сдвигом и паддингом ), пулинговых слоёв (уменьшение карты вдвое) и полносвязного классификатора. Размер карты признаков после свёртки: . Параметров в слое: . Глубокие слои видят более крупные структуры благодаря накоплению рецептивного поля. Остаточные соединения ResNet и батч-нормализация позволяют обучать сети глубиной сотни слоёв без деградации градиента.
Читайте также

Архитектура VGG: как устроена сеть из блоков 3x3
Разбор архитектуры VGG: почему свёртки 3x3, как считать число параметров, чем отличаются VGG-16 и VGG-19 и где сеть применяют как backbone для transfer learning.

Преобразование Фурье: ключевые свойства
Свойства преобразования Фурье - линейность, сдвиг по времени, масштабирование, свёртка - с формулами, доказательствами и примерами задач. Интерактивный спектральный калькулятор.

Абстрактный класс и интерфейс: в чём отличие
Абстрактный класс и интерфейс: чем отличаются в ООП, когда наследовать поведение, а когда задавать контракт, как выбрать на примерах Java, C# и Python.