Обучение регрессионной модели

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

Создание регрессионной сети

Структура сети задается с помощью объекта LayerDefs. Для регрессии типичная сеть включает входной слой, несколько скрытых слоев (Dense или Fully Connected), а также регрессионный выходной слой. Пример структуры:

var layer_defs = [];
layer_defs.push({type:'input', out_sx:1, out_sy:1, out_depth:3}); // 3 признака на входе
layer_defs.push({type:'fc', num_neurons:10, activation:'relu'});   // скрытый слой
layer_defs.push({type:'fc', num_neurons:5, activation:'relu'});    // второй скрытый слой
layer_defs.push({type:'regression', num_neurons:1});               // выходной регрессор
  • input — определяет размерность входных данных (out_depth соответствует числу признаков).
  • fc — полностью связанный слой (num_neurons задаёт количество нейронов).
  • activation — функция активации, часто используют 'relu' для скрытых слоев.
  • regression — выходной слой для предсказания числового значения.

Инициализация и оптимизация

После задания слоев создается объект Net и выбирается оптимизатор:

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

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 использует объекты Vol для хранения входных данных:

var x = new convnetjs.Vol([1.2, 0.7, -0.3]); // входной вектор
var y = 2.5;                                 // целевое значение

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

Обучение модели

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

trainer.train(x, y);

Процесс итеративный. Обычно выполняется в цикле по всем примерам или по эпохам:

for(var epoch = 0; epoch < 100; epoch++) {
  for(var i = 0; i < data.length; i++) {
    var x = new convnetjs.Vol(data[i].features);
    var y = data[i].target;
    trainer.train(x, y);
  }
}
  • data[i].features — массив входных признаков.
  • data[i].target — соответствующее числовое значение.

Предсказание

После обучения регрессионная модель предсказывает значения с помощью метода forward:

var x = new convnetjs.Vol([0.5, -1.2, 3.3]);
var predicted = net.forward(x).w[0];

net.forward(x) возвращает объект Vol, содержащий предсказанное число в w[0]. Для многомерной регрессии w будет массивом соответствующей длины.

Оценка качества модели

Для оценки ошибки используется стандартная среднеквадратичная ошибка (MSE):

var error = 0.0;
for(var i = 0; i < data.length; i++) {
  var x = new convnetjs.Vol(data[i].features);
  var y_true = data[i].target;
  var y_pred = net.forward(x).w[0];
  error += Math.pow(y_true - y_pred, 2);
}
error /= data.length;

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

Настройка гиперпараметров

  • Количество слоев и нейронов: больше слоев и нейронов повышает способность модели к сложным зависимостям, но увеличивает риск переобучения.
  • Функция активации: ReLU эффективна для скрытых слоев; для выхода используется линейная активация по умолчанию.
  • Learning rate и momentum: небольшие значения learning rate обеспечивают стабильное обучение, momentum ускоряет сходимость.
  • Регуляризация L2: предотвращает чрезмерное подгонку под тренировочные данные.

Работа с большим объемом данных

Для больших наборов данных рекомендуется использовать мини-батчи, чтобы снизить нагрузку на память и улучшить стабильность градиентов. ConvNetJS позволяет контролировать размер батча через параметр batch_size в SGDTrainer.

Сохранение и загрузка модели

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

var json = net.toJSON();
localStorage.setItem('regression_net', JSON.stringify(json));

Для восстановления:

var json = JSON.parse(localStorage.getItem('regression_net'));
net = new convnetjs.Net();
net.fromJSON(json);

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

Особенности использования ConvNetJS для регрессии

  • Поддерживает как одномерные, так и многомерные регрессии.
  • Минимальный набор зависимостей — чистый JavaScript, не требует серверной части.
  • Простая интеграция в веб-приложения, визуализация обучения и интерактивные эксперименты.
  • Позволяет вручную настраивать каждый параметр сети и оптимизатора для точной подгонки модели.

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