Класс ConvLayer

ConvLayer — это основной строительный блок сверточных нейронных сетей в библиотеке ConvNetJS. Он реализует сверточный слой, который выполняет локальное свёртывание входного объёма с набором фильтров, позволяя извлекать пространственные признаки из данных, таких как изображения. Сверточные слои являются ключевыми элементами в обработке изображений и видео, а также в задачах распознавания паттернов.


Инициализация слоя

Создание ConvLayer происходит через передачу конфигурационного объекта:

var layer = new convnetjs.ConvLayer({
    in_sx: 32,    // ширина входного изображения
    in_sy: 32,    // высота входного изображения
    in_depth: 3,  // количество каналов (например, RGB)
    sx: 5,        // размер фильтра по ширине и высоте (5x5)
    filters: 16,  // количество фильтров
    stride: 1,    // шаг свёртки
    pad: 2,       // нулевая подкладка по краям
    activation: 'relu' // функция активации (опционально)
});

Ключевые параметры:

  • in_sx, in_sy, in_depth — размеры входного объёма.
  • sx — размер ядра свёртки. Обычно ядро квадратное, например 3×3, 5×5.
  • filters — количество фильтров (выходных каналов), определяющих объём выходного слоя.
  • stride — шаг перемещения фильтра по входу.
  • pad — количество пикселей нулевой подкладки по краям входного объёма.
  • activation — функция активации, применяемая после свёртки (ReLU, tanh, sigmoid и т.д.).

Прямое распространение (forward)

Функция forward(V) вычисляет выходной объём слоя, применяя каждый фильтр к входному объёму. Для каждого положения фильтра вычисляется скалярное произведение фильтра и соответствующей области входа, после чего применяется функция активации.

Особенности реализации:

  • Обработка паддинга: при использовании pad > 0 вход расширяется нулями, что сохраняет размерность.
  • Шаг свёртки: определяет, на сколько пикселей смещается фильтр при каждой итерации.
  • Выходной объём: размерность вычисляется по формуле:

[ out_sx = + 1] [ out_sy = + 1]

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

Обратное распространение (backward)

Метод backward() вычисляет градиенты по входу и фильтрам на основе ошибки от следующего слоя. Алгоритм включает следующие шаги:

  1. Распространение градиента по фильтрам (весам): [ dW = {x,y} V{patch} dY_{x,y}]

  2. Распространение градиента по входу:

    • Для каждой позиции фильтра ошибка распространяется обратно на соответствующую область входа.
    • Если используется паддинг, градиент корректно распределяется на расширенный вход, затем обрезается до исходного размера.
  3. Обновление смещений:

    • Градиент смещения вычисляется как сумма градиентов выхода по всем позициям.

ConvNetJS поддерживает различные функции активации, и backward автоматически учитывает их производные при распространении ошибки.


Параметры и веса

Каждый фильтр слоя хранит:

  • Веса (filters[i].w) — массив чисел для свёртки.
  • Градиенты весов (filters[i].dw) — накопленные градиенты во время обучения.
  • Смещение (filters[i].bias) и его градиент (filters[i].bias_grad).

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


Применение ConvLayer

  • Извлечение признаков: фильтры слоя обучаются распознавать локальные структуры (края, текстуры, углы).
  • Слои в последовательности: ConvLayer часто используется перед слоями подвыборки (PoolingLayer) для уменьшения пространственной размерности.
  • Гибкость: можно строить сети любой глубины, управляя размером фильтров, количеством каналов и функцией активации.

Пример последовательности:

var layer_defs = [];
layer_defs.push({type:'input', sx:32, sy:32, depth:3});
layer_defs.push({type:'conv', sx:5, filters:16, stride:1, pad:2, activation:'relu'});
layer_defs.push({type:'pool', sx:2, stride:2});
layer_defs.push({type:'conv', sx:5, filters:32, stride:1, pad:2, activation:'relu'});

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


Особенности оптимизации

  • SGD: стандартный градиентный спуск с накоплением градиентов dw.
  • Momentum: ConvNetJS поддерживает моментум для ускорения сходимости.
  • Регуляризация: веса фильтров могут быть ограничены через L2-регуляризацию.
  • Использование пакетов данных (minibatch): вычисления градиентов выполняются по каждому мини-батчу, что увеличивает стабильность обучения.

Взаимодействие с другими слоями

ConvLayer тесно интегрируется с другими слоями:

  • PoolingLayer: уменьшает размер выходного объёма ConvLayer, предотвращая переобучение и уменьшая вычислительные затраты.
  • FullyConnectedLayer: после нескольких сверточных и подвыборочных слоев выход может быть передан в полносвязный слой для классификации.
  • SoftmaxLayer: используется на финальном слое для задач многоклассовой классификации.

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

  • Использовать размер фильтра 3×3 или 5×5 для эффективного извлечения признаков.
  • Подбирать stride и padding так, чтобы размер выходного объёма соответствовал архитектуре сети.
  • Начинать с небольшого количества фильтров (16–32) и увеличивать глубину сети постепенно.
  • Использовать ReLU как функцию активации для ускорения сходимости.

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