Предсказание непрерывных значений

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

Настройка сети для регрессии

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

var layer_defs = [];
layer_defs.push({type:'input', out_sx:1, out_sy:1, out_depth:NUM_FEATURES});
layer_defs.push({type:'fc', num_neurons:20, activation:'relu'});
layer_defs.push({type:'fc', num_neurons:10, activation:'relu'});
layer_defs.push({type:'regression', num_neurons:1}); // Выходной слой для регрессии

Ключевой момент: последний слой имеет тип regression, а количество нейронов соответствует числу предсказываемых непрерывных величин.

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

Данные должны быть представлены в виде массивов числовых векторов (Vol объекты в ConvNetJS). Каждый объект включает признаки (x) и целевое значение (y):

var x = new convnetjs.Vol([feature1, feature2, feature3]);
var y = [target_value];
trainer.train(x, y);

Для задач с несколькими целевыми величинами y может быть массивом длины, равной числу выходных нейронов.

Настройка функции потерь и оптимизатора

Для регрессии обычно используется mean squared error (MSE) или mean absolute error (MAE). В ConvNetJS это задается типом тренера:

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

Параметры тренера:

  • learning_rate — скорость обучения, регулирует величину шагов градиентного спуска.
  • momentum — ускоряет сходимость и уменьшает колебания.
  • batch_size — размер пакета данных для обновления весов.
  • l2_decay — коэффициент регуляризации для предотвращения переобучения.
  • loss — тип функции потерь (mse для регрессии).

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

Обучение проходит итеративно через все объекты данных:

for(var i=0;i

Примечания по обучению:

  • Данные рекомендуется нормализовать, чтобы признаки имели одинаковый масштаб.
  • Для ускорения обучения и повышения устойчивости к локальным минимумам полезно перемешивать данные на каждой эпохе.

Предсказание непрерывных значений

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

var x = new convnetjs.Vol(test_features[i]);
var predicted = net.forward(x).w[0]; // Получение числового предсказания

Для многомерной регрессии w будет массивом значений:

var predicted_array = net.forward(x).w;

Тонкости архитектуры

  1. Количество скрытых слоев и нейронов напрямую влияет на способность сети моделировать сложные зависимости.
  2. Выбор функции активации в скрытых слоях влияет на скорость обучения и экспрессию модели: ReLU обеспечивает быстрое обучение и предотвращает затухание градиентов.
  3. Регуляризация через L2 или дропаут помогает уменьшить переобучение, особенно на небольших наборах данных.

Визуализация обучения

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

Расширенные возможности

  • Использование адаптивных оптимизаторов (adagrad, adam) может повысить эффективность обучения на сложных функциях.
  • Возможность сохранять и загружать модель через JSON позволяет интегрировать обучение в веб-приложения без повторного обучения при каждом запуске.

Пример полной модели для регрессии

var layer_defs = [];
layer_defs.push({type:'input', out_sx:1, out_sy:1, out_depth:3});
layer_defs.push({type:'fc', num_neurons:64, activation:'relu'});
layer_defs.push({type:'fc', num_neurons:32, activation:'relu'});
layer_defs.push({type:'regression', num_neurons:1});

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, loss:'mse'});

// Обучение
for(var i=0;i

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

javascript42 — изучаем JavaScript вместе