Многослойные нейронные сети

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

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


Создание сети

Для определения сети используется объект convnetjs.Net. Сеть строится из последовательности слоев, описанных с помощью объектов типа convnetjs.Layer.

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

var layer_defs = [];
layer_defs.push({type:'input', out_sx:1, out_sy:1, out_depth:4}); // Входной слой
layer_defs.push({type:'fc', num_neurons:10, activation:'relu'});  // Полносвязный скрытый слой
layer_defs.push({type:'fc', num_neurons:3, activation:'softmax'}); // Выходной слой для 3 классов

var net = new convnetjs.Net();
net.makeLayers(layer_defs);

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

  • input задаёт размерность входа: out_sx, out_sy и out_depth.
  • fc (fully connected) — полносвязный слой, где каждый нейрон соединён с нейронами предыдущего слоя.
  • activation определяет функцию активации: relu, sigmoid, tanh, softmax.

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

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

var x = new convnetjs.Vol([0.1, 0.2, 0.3, 0.4]); // Входной вектор
var output = net.forward(x);
console.log(output.w);
  • Vol — объект, представляющий данные слоя. Он хранит массив w значений.
  • На каждом слое выполняется линейная комбинация входов с весами и применение функции активации.

Обратное распространение ошибки

Обучение сети происходит методом обратного распространения (backward) с использованием стохастического градиентного спуска (SGD).

Пример:

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

for(var i=0;i<100;i++){
    var x = new convnetjs.Vol([0.1*i, 0.2*i, 0.3*i, 0.4*i]);
    trainer.train(x, 2); // 2 — индекс правильного класса
}

Объяснение параметров SGDTrainer:

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

Работа с функциями активации

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

  • relu(x) = max(0, x) — ускоряет обучение и предотвращает затухание градиентов.
  • sigmoid(x) = 1/(1+exp(-x)) — ограничивает выход в диапазоне [0,1], подходит для вероятностей.
  • tanh(x) — аналогично sigmoid, но с диапазоном [-1,1], улучшает центрирование данных.
  • softmax — используется на выходном слое для многоклассовой классификации.

Слои и их типы

ConvNetJS поддерживает следующие типы слоев:

  • input — входной слой.
  • fc — полносвязный слой.
  • relu, sigmoid, tanh — слои активации.
  • softmax — слой для классификации.
  • conv — сверточный слой (для изображений), с ядром свёртки и шагом.
  • pool — слой подвыборки, уменьшает размерность карты признаков.
  • dropout — слой регуляризации, случайно обнуляет часть нейронов на обучении.

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


Пример использования сети для классификации

// Создание сети
var layer_defs = [];
layer_defs.push({type:'input', out_sx:1, out_sy:1, out_depth:4});
layer_defs.push({type:'fc', num_neurons:5, activation:'relu'});
layer_defs.push({type:'fc', num_neurons:3, activation:'softmax'});

var net = new convnetjs.Net();
net.makeLayers(layer_defs);

// Обучение
var trainer = new convnetjs.SGDTrainer(net, {learning_rate:0.01, momentum:0.9});

var data = [
    {x:[0.1,0.2,0.3,0.4], y:0},
    {x:[0.5,0.6,0.7,0.8], y:1},
    {x:[0.9,1.0,1.1,1.2], y:2}
];

for(var i=0;i<200;i++){
    data.forEach(d=>{
        var x = new convnetjs.Vol(d.x);
        trainer.train(x, d.y);
    });
}

// Предсказание
var test = new convnetjs.Vol([0.2,0.3,0.4,0.5]);
var result = net.forward(test);
console.log(result.w); // вероятности классов

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

ConvNetJS позволяет сохранять веса сети в JSON и восстанавливать их:

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

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


Рекомендации по эффективному обучению

  • Нормализовать входные данные для ускорения сходимости.
  • Использовать небольшие пакеты (batch_size) при обучении на больших данных.
  • Применять слои регуляризации (dropout, l2_decay) для предотвращения переобучения.
  • Начинать обучение с небольшого learning_rate, постепенно увеличивая при стабилизации.

Заключение по слоям и обучению

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