Базовые понятия машинного обучения

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

Библиотека работает полностью на стороне клиента, не требуя серверной поддержки, что делает её удобной для экспериментов и образовательных проектов. Она поддерживает обучение как с использованием стохастического градиентного спуска (SGD), так и с более продвинутыми оптимизаторами, такими как Adagrad и Adam.


Архитектура сети

Сеть в ConvNetJS строится из последовательности слоев, каждый из которых выполняет конкретную функцию:

  1. Input Layer — слой ввода, определяет форму входных данных.
  2. Fully Connected Layer (Dense) — полносвязный слой, где каждый нейрон соединён со всеми нейронами предыдущего слоя.
  3. Convolutional Layer — сверточный слой, применяющий фильтры к входным данным для выделения признаков.
  4. Pooling Layer — слой пулинга, уменьшающий размерность данных с сохранением ключевых признаков.
  5. Activation Layer — слой активации, применяет нелинейную функцию (ReLU, Sigmoid, Tanh и др.).
  6. Softmax Layer — слой для многоклассовой классификации, преобразующий выходные значения в вероятности.

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


Создание и инициализация сети

Для создания сети используется объект convnetjs.Net, в который последовательно добавляются слои:

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

Ключевые моменты инициализации:

  • out_sx, out_sy, out_depth задают ширину, высоту и глубину входного изображения.
  • sx в сверточных и пулинговых слоях определяет размер фильтра.
  • stride — шаг свертки или пулинга.
  • pad позволяет добавлять отступы для сохранения размеров.
  • activation задаёт функцию активации для сверточного слоя.
  • num_classes — количество классов для классификации на выходе.

Подготовка данных

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

Пример создания входного объёма:

var x = new convnetjs.Vol(28, 28, 1); // создаёт Vol размером 28x28x1
for(var i=0;i<28*28;i++) {
  x.w[i] = Math.random(); // заполнение случайными значениями
}

В задачах классификации изображения обычно нормализуются, чтобы значения пикселей находились в диапазоне [0,1] или [-1,1]. Это ускоряет обучение и повышает стабильность градиентного спуска.


Обучение сети

ConvNetJS использует объект convnetjs.SGDTrainer для обучения сети методом стохастического градиентного спуска. Настройки тренера позволяют управлять скоростью обучения, регуляризацией и типом оптимизации.

Пример создания тренера:

var trainer = new convnetjs.SGDTrainer(net, {
  method: 'adam', 
  learning_rate: 0.001, 
  l2_decay: 0.001
});

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

  • method — тип оптимизатора (sgd, adagrad, adam).
  • learning_rate — скорость обучения, определяет величину корректировки весов на каждом шаге.
  • l2_decay — коэффициент L2-регуляризации, предотвращающий переобучение.

Обучение выполняется вызовом метода train для каждого примера:

trainer.train(x, target_index);
  • x — входной объект Vol.
  • target_index — индекс правильного класса (целое число от 0 до N-1).

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

ConvNetJS автоматически выполняет forward pass и backward pass:

  • Forward pass: данные проходят через все слои, на выходе формируется прогноз.
  • Backward pass: вычисляются градиенты ошибки по весам, необходимые для обновления параметров в шаге оптимизации.

Пример получения предсказания после прямого прохода:

var output = net.forward(x);
console.log(output.w); // массив вероятностей классов

Сохранение и загрузка сети

Сеть можно сохранять в JSON и загружать для дальнейшего использования:

var json = net.toJSON();
var net2 = new convnetjs.Net();
net2.fromJSON(json);

Это особенно удобно для тестирования обученных моделей без повторного обучения.


Важные особенности ConvNetJS

  • Работает полностью в браузере, не требует установки сторонних библиотек.
  • Поддерживает как CPU, так и WebGL (ограниченно).
  • Простая интеграция с HTML5 Canvas для визуализации данных.
  • Идеально подходит для образовательных целей и небольших проектов, но не оптимизирован для больших промышленных моделей.

Рекомендации по построению сетей

  • Использовать небольшие сверточные ядра (3x3, 5x5) и последовательные слои для извлечения сложных признаков.
  • Применять пулинг после нескольких сверточных слоев для уменьшения размерности.
  • Для задач классификации всегда заканчивать сеть слоем softmax.
  • Начинать с простой архитектуры и постепенно увеличивать сложность, контролируя переобучение через L2-регуляризацию или dropout.

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