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 позволяет контролировать сходимость обучения и выбирать оптимальные гиперпараметры.
Для больших наборов данных рекомендуется использовать мини-батчи,
чтобы снизить нагрузку на память и улучшить стабильность градиентов.
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 демонстрирует, что регрессионные нейронные сети могут быть реализованы полностью на клиентской стороне, сохраняя гибкость и контроль над архитектурой и процессом обучения.