Принципы работы сверточных слоев

Сверточные слои (Convolutional Layers) являются ядром сверточных нейронных сетей (CNN) и предназначены для извлечения признаков из входных данных. ConvNetJS реализует эти слои полностью на JavaScript, обеспечивая возможность создавать и обучать нейросети прямо в браузере или на сервере.


Структура сверточного слоя

Сверточный слой состоит из набора фильтров (kernels), которые сканируют входной тензор, создавая карту признаков (feature map). Каждый фильтр представлен массивом весов, который обновляется в процессе обучения.

Ключевые параметры слоя в ConvNetJS:

  • sx — ширина фильтра (kernel width)
  • sy — высота фильтра (kernel height)
  • stride — шаг перемещения фильтра по входу
  • pad — добавление нулей вокруг входа (padding)
  • filters — количество фильтров (output depth)

Каждый фильтр при свертке с входным изображением вычисляет линейную комбинацию пикселей, что позволяет выявлять локальные паттерны, такие как края, текстуры и углы.


Механизм свертки

Процесс свертки можно описать пошагово:

  1. Фильтр накладывается на область входного тензора размером sx × sy.
  2. Для каждой позиции вычисляется сумма произведений соответствующих элементов фильтра и входа.
  3. Результат помещается в выходной тензор на позиции, соответствующей текущему положению фильтра.
  4. Фильтр сдвигается по шагу stride по горизонтали и вертикали до покрытия всей области входа.

Формула для вычисления одного элемента feature map:

[ y_{i,j,k} = {m=0}^{sx-1} {n=0}^{sy-1} {d=0}^{D-1} w{m,n,d,k} x_{i+m,j+n,d} + b_k]

где:

    1. — входной тензор
    1. — веса фильтра
  • (b_k) — смещение фильтра (k)
    1. — глубина входа
    1. — выход feature map

Padding и stride

Padding позволяет контролировать размер выходной карты признаков. Без padding размер уменьшается после каждой свертки:

[ W_{out} = + 1]

Stride управляет скоростью сканирования фильтра по входу. Больший stride уменьшает размер карты признаков, ускоряет вычисления, но снижает точность локальных деталей.


Инициализация весов и смещений

ConvNetJS использует случайную инициализацию весов фильтров, обычно с нормальным распределением с небольшим дисперсионным отклонением. Смещения (bias) задаются нулями. Инициализация критична для сходимости сети и предотвращения исчезновения градиентов.


Обратное распространение ошибки

Для обучения сверточных слоев применяется стандартный backpropagation, адаптированный к сверткам. Градиенты рассчитываются по формуле:

[ = {i,j} x{i+m,j+n,d}]

[ = {k} {m,n} w_{m,n,d,k} ]

Это позволяет корректно обновлять веса фильтров и смещения через алгоритм стохастического градиентного спуска (SGD).


Практические рекомендации

  • Для распознавания изображений используют фильтры размером 3×3 или 5×5.
  • Стандартный padding часто равен (sx-1)/2 для сохранения исходного размера.
  • Большое количество фильтров на ранних слоях повышает способность выявлять разнообразные признаки.
  • Сверточные слои обычно комбинируют с ReLU для нелинейности и Pooling для снижения размерности.

Организация слоев в ConvNetJS

ConvNetJS представляет сверточный слой как объект convLayer, который можно создавать через:

var layer = new convnetjs.ConvLayer({
    sx: 5,
    filters: 16,
    stride: 1,
    pad: 2,
    activation: 'relu'
});

После этого слой можно подключать к Net, настраивая последовательность слоев для полной CNN. ConvNetJS автоматически управляет вычислением forward и backward pass, храня веса и градиенты внутри структуры vol.