Создание простой полносвязной сети

ConvNetJS — это библиотека на JavaScript, предназначенная для создания и обучения нейронных сетей прямо в браузере или на Node.js. Она поддерживает различные типы слоёв: полносвязные (fully connected), сверточные, pooling-слои и функции активации. Основу любого обучения составляет корректная конфигурация сети, подготовка данных и настройка параметров обучения.

Инициализация сети

Для создания простой полносвязной сети используется объект convnetjs.Net. Он служит контейнером для слоёв и обеспечивает методы прямого распространения сигнала (forward pass) и обратного распространения ошибки (backward pass).

Пример структуры сети:

var net = new convnetjs.Net();

Далее необходимо добавить слои. Для полносвязной сети ключевые слои:

  • InputLayer — слой входных данных;
  • FullyConnLayer — полносвязный слой;
  • SoftmaxLayer или RegressionLayer — выходной слой в зависимости от задачи.
net.makeLayers([
    {type: 'input', out_sx: 1, out_sy: 1, out_depth: 2}, // два входа
    {type: 'fc', num_neurons: 5, activation: 'relu'},    // скрытый слой с 5 нейронами
    {type: 'fc', num_neurons: 3, activation: 'relu'},    // второй скрытый слой
    {type: 'softmax', num_classes: 3}                   // выходной слой для классификации на 3 класса
]);

Ключевые моменты:

  • out_sx, out_sy, out_depth задают размерность входного вектора;
  • num_neurons — количество нейронов в скрытом слое;
  • activation — функция активации, чаще всего используется 'relu', 'sigmoid' или 'tanh';
  • Выходной слой определяется задачей: softmax для классификации, regression для предсказания непрерывных величин.

Настройка тренера

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

Пример настройки тренера:

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

Параметры:

  • learning_rate — скорость обучения, определяет шаг по градиенту;
  • momentum — ускорение для сглаживания колебаний градиента;
  • batch_size — размер мини-пакета для обновления весов;
  • l2_decay — коэффициент регуляризации для предотвращения переобучения.

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

ConvNetJS работает с объектами convnetjs.Vol, которые представляют собой многомерные тензоры. Для полносвязной сети входной вектор обычно одномерен.

Пример создания входного вектора:

var x = new convnetjs.Vol([0.5, -0.2]); // два признака

Целевая метка для классификации:

var y = 2; // принадлежит к третьему классу (нумерация с 0)

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

Обучение выполняется методом trainer.train, который принимает входной вектор и целевую метку:

trainer.train(x, y);

Для серии итераций можно использовать цикл:

for (var i = 0; i < 1000; i++) {
    var x = new convnetjs.Vol([Math.random(), Math.random()]);
    var y = (x.w[0] + x.w[1] > 1) ? 1 : 0;
    trainer.train(x, y);
}

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

Для получения предсказания используется метод net.forward:

var output = net.forward(new convnetjs.Vol([0.3, 0.7]));
console.log(output.w); // вероятности классов для softmax

Метод forward возвращает объект Vol, где поле w содержит массив значений выходных нейронов.

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

ConvNetJS поддерживает сериализацию структуры и весов сети в JSON:

var json = net.toJSON();         // экспорт в JSON
var net2 = new convnetjs.Net();
net2.fromJSON(json);             // восстановление сети

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

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

  • Для маленьких полносвязных сетей скорость обучения лучше начинать с 0.01–0.05;
  • Регуляризация (l2_decay) снижает переобучение, особенно при малом объёме данных;
  • Mini-batch обучение ускоряет сходимость и стабилизирует градиенты;
  • Использование ReLU в скрытых слоях позволяет избежать затухающих градиентов, особенно в глубоких сетях.

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