Когда стоит мигрировать

ConvNetJS — это полностью клиентская библиотека для построения, обучения и тестирования нейронных сетей в браузере на JavaScript. Она реализует как полносвязные сети (Fully Connected / Dense), так и сверточные сети (Convolutional Neural Networks, CNN). Основная идея заключается в представлении нейронной сети как последовательности слоев, каждый из которых выполняет трансформацию входных данных и передает результат следующему.

Каждый слой в ConvNetJS характеризуется набором параметров: размерность входа, количество нейронов или фильтров, функции активации и параметры регуляризации. Для сверточных слоев важны размер фильтра, шаг свертки (stride) и паддинг (padding), которые определяют пространственное уменьшение и сохранение информации о границах изображения.

Структура нейронной сети

В ConvNetJS нейронная сеть строится как объект Net, к которому последовательно добавляются слои:

var net = new convnetjs.Net();
net.makeLayers([
  {type:'input', out_sx:28, out_sy:28, out_depth:1},
  {type:'conv', sx:5, filters:8, stride:1, pad:2, activation:'relu'},
  {type:'pool', sx:2, stride:2},
  {type:'softmax', num_classes:10}
]);
  • input — слой входных данных. Параметры out_sx, out_sy и out_depth задают размеры входного объема.
  • conv — сверточный слой. sx — размер фильтра, filters — количество фильтров.
  • pool — слой подвыборки (subsampling), уменьшает пространственные размеры с сохранением наиболее значимых признаков.
  • softmax — выходной слой для классификации с вероятностной интерпретацией.

Каждый слой возвращает объект Vol (volume), содержащий данные и градиенты для обратного распространения ошибки.

Прямое и обратное распространение

Прямое распространение (forward pass) вычисляет выход сети на основе входных данных:

var x = new convnetjs.Vol(28, 28, 1); // создаем входной объем
var prob = net.forward(x); // получаем выход сети

Результат prob — это массив вероятностей классов. Для сверточных сетей каждый элемент Vol содержит значения активаций после применения фильтров и функций активации.

Обратное распространение (backward pass) используется для вычисления градиентов и обновления весов:

var trainer = new convnetjs.SGDTrainer(net, {learning_rate:0.01, momentum:0.9, batch_size:10});
trainer.train(x, y); // y — истинный класс

Объект trainer управляет процедурой обучения, учитывая параметры: скорость обучения (learning_rate), моментум (momentum) и размер пакета (batch_size).

Настройка и оптимизация

ConvNetJS поддерживает различные функции активации (relu, sigmoid, tanh) и метрики потерь (softmax, squared loss). Важные аспекты при построении сети:

  • Инициализация весов: по умолчанию используется небольшое случайное распределение, что предотвращает симметричное обучение нейронов.
  • Регуляризация: L1 и L2 регуляризация помогает избегать переобучения.
  • Подбор гиперпараметров: размер фильтров, глубина сети, шаг обучения и размер пакета напрямую влияют на качество обучения.

Работа с изображениями и многомерными данными

ConvNetJS использует объекты Vol, которые представляют данные в виде трёхмерных тензоров (width × height × depth). Сверточные операции выполняются по этим объемам:

  • Свертка (convolution): скользящий фильтр по входному объему, вычисляющий скалярное произведение с локальной областью.
  • Пулинг (pooling): агрегация значений фильтров на небольших участках для уменьшения размерности.
  • Flattening: преобразование объемов в одномерные векторы перед подачей в полносвязные слои.

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

Интеграция в браузере и производительность

ConvNetJS полностью реализован на JavaScript и не требует серверной поддержки. Прямое использование в браузере позволяет:

  • Быстро визуализировать обучение сети на пользовательских данных.
  • Проводить интерактивные эксперименты без настройки среды Python или CUDA.

Однако при больших сетях производительность ограничена CPU браузера. Для ускорения можно уменьшить размер слоев или использовать меньшие пакеты данных. Для экспериментальной работы с реальными изображениями размером 28×28–64×64 этого достаточно.

Использование сетей в режиме обучения и предсказаний

ConvNetJS поддерживает два основных режима работы:

  1. Тренировка сети (training) — вычисление градиентов, обновление весов с использованием стохастического градиентного спуска.
  2. Предсказание (inference) — вычисление выходов сети на новых данных без изменения весов.

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

Пример применения для классификации цифр

var net = new convnetjs.Net();
net.makeLayers([
  {type:'input', out_sx:28, out_sy:28, out_depth:1},
  {type:'conv', sx:5, filters:8, stride:1, pad:2, activation:'relu'},
  {type:'pool', sx:2, stride:2},
  {type:'fc', num_neurons:64, activation:'relu'},
  {type:'softmax', num_classes:10}
]);

var trainer = new convnetjs.SGDTrainer(net, {learning_rate:0.01, momentum:0.9, batch_size:20});

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