EssayAI
Блог
Блог
Математика и алгоритмы

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

11 июня 2026Время чтения: 9 минут
#нейронная сеть#CNN#свёртка#глубокое обучение#компьютерное зрение
CNN: архитектура свёрточной нейронной сети

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

Операция свёртки и формула размера карты признаков

Сердце CNN - свёрточный слой (convolutional layer). Фильтр (ядро) размера f×ff \times f скользит по входной карте шириной WW пикселей с шагом ss и паддингом pp. Выходной размер по каждой оси:

out=Wf+2ps+1.\text{out} = \left\lfloor \frac{W - f + 2p}{s} \right\rfloor + 1.

Например, вход 28×2828 \times 28, фильтр 5×55 \times 5, p=0p = 0, s=1s = 1: (285)/1+1=24\lfloor (28 - 5) / 1 \rfloor + 1 = 24. Карта признаков после свёртки - 24×2424 \times 24. Добавьте паддинг p=2p = 2 - и размер сохранится: (285+4)/1+1=28(28 - 5 + 4) / 1 + 1 = 28. Это называют «same padding» - он популярен, когда нельзя терять пространственное разрешение.

Фильтр 3x3 скользит по входному изображению: жёлтый патч совпадает с ядром, синий пиксель - результат поэлементного перемножения и суммирования. При stride=2 фильтр делает вдвое меньше шагов, карта признаков сужается вдвое

Один фильтр порождает одну двумерную карту признаков. Если в слое CC фильтров, на выходе CC карт - трёхмерный тензор (out,out,C)(\text{out}, \text{out}, C). Параметров в одном свёрточном слое (без учёта входных каналов CinC_{in}):

params=f×f×Cin×Cout+Cout,\text{params} = f \times f \times C_{in} \times C_{out} + C_{out},

где последнее слагаемое - смещения (bias). При f=5f = 5, Cin=1C_{in} = 1, Cout=16C_{out} = 16: 2516+16=41625 \cdot 16 + 16 = 416 параметров. Это ничтожно по сравнению с полносвязным слоем, который при входе 784784 и 1616 нейронах потребовал бы 78416+16=12560784 \cdot 16 + 16 = 12\,560 параметров.

Пулинговые слои и рецептивное поле

После свёртки обычно ставят слой субдискретизации (pooling). Самый распространённый - MaxPooling: окно 2×22 \times 2 со сдвигом s=2s = 2 берёт максимум из четырёх пикселей, уменьшая карту вдвое по каждой оси:

outpool=W2.\text{out}_\text{pool} = \left\lfloor \frac{W}{2} \right\rfloor.

Пулинг решает три задачи: уменьшает число вычислений, подавляет незначительные флуктуации и увеличивает рецептивное поле - область входного изображения, на которую «смотрит» один нейрон в глубоких слоях. После двух свёрток 3×33 \times 3 рецептивное поле равно 5×55 \times 5; с каждым пулингом оно удваивается, позволяя глубоким фильтрам реагировать на крупные структуры (контуры, части объектов).

Рецептивное поле CNN: чем глубже слой, тем большую область входного изображения покрывает один нейрон - схема для трёх свёрточных слоёв подряд
Рецептивное поле CNN: чем глубже слой, тем большую область входного изображения покрывает один нейрон - схема для трёх свёрточных слоёв подряд

AveragePooling - альтернатива MaxPooling: берёт среднее, а не максимум. Он мягче и применяется, например, в финальном Global Average Pooling (GAP), заменяющем полносвязные слои в современных архитектурах типа ResNet - вход H×W×CH \times W \times C сворачивается до вектора 1×1×C1 \times 1 \times C.

Классическая архитектура LeNet-5

LeNet-5 (Лекун, 1998) - первая успешная CNN для распознавания цифр MNIST. Её архитектура задала канон: чередующиеся свёрточные и пулинговые слои сужают пространственные размеры, но наращивают глубину (число каналов), затем полносвязные слои отображают признаки в классы.

Последовательность слоёв:

  1. Вход 28×28×128 \times 28 \times 1 (градации серого)
  2. Conv1: 6 фильтров 5×55 \times 5, p=0p = 024×24×624 \times 24 \times 6
  3. AvgPool1: 2×22 \times 212×12×612 \times 12 \times 6
  4. Conv2: 16 фильтров 5×55 \times 5, p=0p = 08×8×168 \times 8 \times 16
  5. AvgPool2: 2×22 \times 24×4×16=2564 \times 4 \times 16 = 256 чисел
  6. FC1: 256 → 120, FC2: 120 → 84, FC3: 84 → 10 (классов)

Всего около 60 тысяч параметров - по меркам 1998 года немного, а точность на MNIST - 99,2%. Современные архитектуры (AlexNet, VGG, ResNet) сохраняют ту же логику, лишь масштабируя глубину и ширину.

Нелинейность, функция активации и батч-нормализация

После каждой свёртки применяется функция активации. Исторически использовали tanh\tanh и sigmoid, но сейчас стандарт - ReLU:

ReLU(x)=max(0,x).\text{ReLU}(x) = \max(0,\, x).

ReLU не насыщается при больших значениях (нет исчезающего градиента в положительной области), вычислительно тривиальна и на практике сходится быстрее. Её вариации - Leaky ReLU, ELU, GELU - решают проблему «мёртвых нейронов» (нейрон с постоянным нулевым выходом).

Батч-нормализация (BatchNorm) вставляется между свёрткой и активацией. Она нормирует активации по мини-батчу, ускоряет обучение и позволяет использовать большие шаги обучения без взрыва градиентов. Де-факто обязательный элемент глубоких CNN с 2015 года.

VGG, ResNet и современные тенденции

VGG (2014) показала, что глубина важнее ширины фильтров: набор из маленьких ядер 3×33 \times 3 эффективнее одного большого - рецептивное поле то же, а параметров меньше. Три слоя Conv 3×33 \times 3 дают рецептивное поле 7×77 \times 7, но параметров 39C2=27C23 \cdot 9 C^2 = 27 C^2 против 49C249 C^2 у одного ядра 7×77 \times 7.

ResNet (2015) ввела остаточные соединения (skip connections): выход блока - сумма входа и преобразования входа. Это позволяет обучать сети глубиной сотни слоёв без деградации:

y=F(x,W)+x.y = F(x, W) + x.

Если блок не нужен, он обнуляется, и градиент течёт напрямую через тождественное отображение. EfficientNet (2019) масштабирует глубину, ширину и разрешение одновременно по единой формуле - и достигает рекордной точности при минимальном числе параметров.

Остаточный блок ResNet: входной тензор x складывается с выходом двух свёрточных слоёв F(x). При нулевых весах блок вырождается в тождественное отображение, что позволяет градиенту течь без затухания

Практические тонкости: инициализация и регуляризация

Инициализация весов критична. Случайные малые числа из нормального распределения (по Гауссу) приводят к исчезающему или взрывному градиенту в глубоких сетях. Инициализация He (для ReLU): WN(0,2/nin)W \sim \mathcal{N}(0,\, 2/n_{in}), где ninn_{in} - число входных связей нейрона. Для tanh\tanh/sigmoid - инициализация Xavier: WN(0,1/nin)W \sim \mathcal{N}(0,\, 1/n_{in}). Нулевая инициализация полностью запрещена: все нейроны одного слоя получат одинаковые градиенты и навсегда останутся симметричными - это называется «проблемой симметрии».

Dropout (выключение случайных нейронов с вероятностью pp во время обучения) - классический регуляризатор. В свёрточных слоях эффективнее Dropout2D: выключается целый канал, а не отдельный нейрон. L2-регуляризация (weight decay) добавляет к функции потерь штраф λW2\lambda \|W\|^2 и препятствует переобучению на маленьких датасетах.

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

Частые ошибки

  • Неучёт паддинга при расчёте размера. Применив формулу без паддинга, получают неверный размер карты - особенно при нескольких слоях подряд. Всегда подставляйте pp явно.
  • Забытый bias в подсчёте параметров. Параметров в свёрточном слое f2CinCout+Coutf^2 \cdot C_{in} \cdot C_{out} + C_{out}, а не f2CinCoutf^2 \cdot C_{in} \cdot C_{out}. При Cout=128C_{out} = 128 разница - 128 параметров; незначительно для одного слоя, но складывается.
  • Stride > 1 вместо пулинга. Stride позволяет уменьшать размер без пулинга, но удаляет информацию о локальных максимумах. В задачах классификации это допустимо; в задачах детекции - нет.
  • Слишком мало фильтров в первом слое. Первый свёрточный слой должен иметь достаточно фильтров, чтобы уловить базовые текстуры (грани, углы). Меньше 8-16 фильтров - информационное узкое место.
  • Применение Dropout к свёрточным слоям без Dropout2D. Обычный Dropout хуже работает в свёрточных слоях: соседние пиксели коррелированы, и нейросеть легко восстанавливает «выбитый» нейрон по соседям.

FAQ

Чем отличается свёрточный слой от полносвязного? В полносвязном слое каждый нейрон связан со всеми входами - число параметров пропорционально произведению размеров входа и выхода. В свёрточном нейрон видит только локальный патч, а веса фильтра разделяются по всей карте. При входе 224×224224 \times 224 полносвязный слой с 512 выходами имеет около 25 млн параметров; свёрточный с фильтром 3×33 \times 3 и 512 каналами - лишь 4608.

Что происходит с размером карты при stride = 2? Формула та же: (Wf+2p)/2+1\lfloor (W - f + 2p) / 2 \rfloor + 1. При W=32W = 32, f=3f = 3, p=1p = 1: (323+2)/2+1=16\lfloor (32 - 3 + 2) / 2 \rfloor + 1 = 16. Размер уменьшается примерно вдвое - эффект аналогичен MaxPooling, но без явного пулингового слоя.

Зачем нужна батч-нормализация, если есть Dropout? Это разные механизмы. BatchNorm нормирует распределение активаций и ускоряет сходимость; Dropout - регуляризатор, снижающий переобучение случайным «глушением» нейронов. Современные сети обычно используют оба - BatchNorm после свёртки, Dropout перед полносвязными слоями.

Коротко

Свёрточная нейронная сеть строится из чередующихся свёрточных слоёв (локальные фильтры f×ff \times f со сдвигом ss и паддингом pp), пулинговых слоёв (уменьшение карты вдвое) и полносвязного классификатора. Размер карты признаков после свёртки: (Wf+2p)/s+1\lfloor (W - f + 2p) / s \rfloor + 1. Параметров в слое: f2CinCout+Coutf^2 \cdot C_{in} \cdot C_{out} + C_{out}. Глубокие слои видят более крупные структуры благодаря накоплению рецептивного поля. Остаточные соединения ResNet и батч-нормализация позволяют обучать сети глубиной сотни слоёв без деградации градиента.

Доверьте текст нейросети EssayAI

Открыть EssayAI

Бесплатно, на русском языке и без VPN

Читайте также