Структура и архитектура библиотеки

ConvNetJS — это чисто клиентская JavaScript-библиотека для построения и обучения нейронных сетей, специализирующаяся на свёрточных нейронных сетях (CNN) и многослойных перцептронах (MLP). Основной акцент библиотеки сделан на лёгкость интеграции в браузерные проекты и на визуализацию обучения. Архитектура ConvNetJS организована вокруг нескольких ключевых компонентов: моделей, слоёв, тренеров, тензоров и обработки данных.


Слои сети

ConvNetJS использует объектно-ориентированную модель слоев. Каждый слой — это отдельный объект, который инкапсулирует:

  • параметры слоя, такие как количество нейронов, размер фильтров, шаг свёртки, паддинг;
  • веса и смещения, хранящиеся в виде массивов;
  • методы прямого и обратного прохода (forward и backward);
  • активаторы (по необходимости), включая ReLU, Sigmoid, Tanh.

Слои классифицируются следующим образом:

  1. Свёрточные (Convolutional Layer) — применяют свёртку фильтров к входным данным, поддерживают stride и padding.
  2. Пулинговые (Pooling Layer) — снижают размерность признакового пространства с помощью операций max или average pooling.
  3. Полносвязные (Fully Connected / Dense Layer) — соединяют каждый нейрон предыдущего слоя со всеми нейронами текущего слоя.
  4. Функции активации (Activation Layer) — применяют нелинейные преобразования, необходимые для обучения сложных функций.
  5. Dropout Layer — используется для регуляризации, случайно обнуляя часть нейронов на каждом шаге тренировки.
  6. Softmax Layer — специализированный слой для классификационных задач, преобразующий выходные значения в вероятности.

Каждый слой имеет метод forward(V), который принимает объект Vol (тензор) и возвращает выходные данные, и метод backward(), который вычисляет градиенты относительно входных данных и параметров.


Объект Vol

Основной структурный элемент данных в ConvNetJS — объект Vol. Он представляет собой трёхмерный массив (ширина × высота × глубина), который хранит как значения нейронов, так и градиенты для обратного распространения ошибки.

Ключевые свойства объекта Vol:

  • w — одномерный массив, содержащий значения нейронов;
  • dw — массив градиентов;
  • sx, sy, depth — размеры по осям;
  • методы для индексирования и доступа к элементам в 3D-формате.

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


Архитектура модели

Сеть в ConvNetJS создаётся через объект Net, который хранит последовательность слоёв. Основные методы объекта Net:

  • addLayer(layer) — добавляет слой в сеть;
  • forward(V, isTraining) — выполняет прямой проход по всем слоям;
  • backward(dout) — запускает обратное распространение ошибки;
  • getParamsAndGrads() — возвращает все параметры сети с соответствующими градиентами для тренера.

Такой подход делает архитектуру сети модульной и расширяемой, позволяя комбинировать свёрточные, пулинговые и полносвязные слои в одной модели.


Тренеры и оптимизация

Для обучения ConvNetJS предоставляет класс Trainer, который инкапсулирует алгоритмы оптимизации. Основные возможности:

  • Поддержка SGD с моментумом, Adagrad, RMSProp, Nesterov momentum.
  • Настройка скорости обучения, регуляризации (L2, decay), batch size.
  • Метод train(x, y) для обновления весов на основе одного или нескольких примеров.

Trainer отделён от структуры сети, что позволяет использовать один и тот же Net с разными стратегиями оптимизации.


Формат данных и обработка

ConvNetJS не имеет встроенных сложных средств загрузки изображений, но предоставляет:

  • Удобные функции для нормализации данных;
  • Поддержку одномерных, двумерных и трёхмерных входов;
  • Прямую работу с массивами JavaScript для создания Vol.

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


Особенности архитектуры

  1. Все вычисления на CPU — библиотека полностью написана на чистом JavaScript, не использует WebGL по умолчанию.
  2. Прямой и обратный проходы реализованы на уровне слоёв — это упрощает отладку и визуализацию.
  3. Модульность — любой слой можно заменить или расширить, создавая собственные функции активации или методы регуляризации.
  4. Низкая зависимость от внешних библиотек — ConvNetJS не требует Node.js или сторонних пакетов, что делает её полностью браузерной.

Взаимодействие компонентов

Архитектура строится по принципу “связанных Vol и слоёв”:

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

Такое строение упрощает эксперименты с различными архитектурами без изменения ядра библиотеки.