Постановка регрессионной задачи

Основы регрессии в нейронных сетях

Регрессия — это задача прогнозирования непрерывного численного значения на основе входных данных. В отличие от классификации, где сеть выбирает один из дискретных классов, регрессия требует, чтобы выходной сигнал нейронной сети был числом, обычно в диапазоне от (-) до (+) или ограниченном определёнными значениями.

В контексте ConvNetJS регрессия реализуется через многослойный перцептрон (MLP) с одной или несколькими скрытыми слоями, где выходной слой имеет один нейрон без функции активации или с линейной активацией. Важным аспектом является выбор функции потерь: для регрессии стандартной является среднеквадратичная ошибка (MSE, mean squared error).

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

ConvNetJS предоставляет объект convnetjs.Net, позволяющий задавать структуру сети через последовательность слоёв, каждый из которых имеет свои параметры. Пример структуры для регрессии:

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

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

Ключевые моменты структуры:

  • input: задаёт размерность входного вектора NUM_INPUTS.
  • fc (fully connected): скрытые слои с функцией активации relu (можно использовать tanh или sigmoid).
  • regression: выходной слой для регрессии, количество нейронов соответствует количеству прогнозируемых чисел (1 для одномерной регрессии).

Выбор функции потерь и тренировка

Для регрессии в ConvNetJS применяется функция потерь типа regression. Тренировщик (Trainer) конфигурируется следующим образом:

var trainer = new convnetjs.SGDTrainer(net, {
    method: 'adadelta',
    batch_size: 16,
    l2_decay: 0.001,
    learning_rate: 0.01
});

Параметры:

  • method: метод оптимизации. Подходят sgd, adadelta, adam.
  • batch_size: количество примеров за одну итерацию градиентного спуска.
  • l2_decay: регуляризация для предотвращения переобучения.
  • learning_rate: шаг градиентного спуска.

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

for(var i=0;i<train_data.length;i++) {
    var x = new convnetjs.Vol(train_data[i].input);
    var y = [train_data[i].target]; // одномерная цель
    trainer.train(x, y);
}

Особенности:

  • Использование массива для цели позволяет расширять модель на многомерную регрессию.
  • Каждый объект Vol представляет собой входной вектор для сети.

Применение обученной модели

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

var x = new convnetjs.Vol(test_input);
var predicted = net.forward(x).w[0]; // получаем численное значение

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

Масштабирование данных и нормализация

Для регрессии особенно важно масштабировать входные и выходные данные:

  • Входные признаки часто нормализуют к диапазону ([0,1]) или стандартизируют (вычитание среднего и деление на стандартное отклонение).
  • Выходные значения также желательно нормализовать, чтобы градиенты оставались устойчивыми и обучение проходило эффективнее.
function normalize(data) {
    var mean = data.reduce((a,b)=>a+b,0)/data.length;
    var std = Math.sqrt(data.map(x => Math.pow(x-mean,2)).reduce((a,b)=>a+b,0)/data.length);
    return data.map(x => (x-mean)/std);
}

Метрики для оценки регрессии

Помимо функции потерь, для оценки модели применяют метрики:

  • MSE (Mean Squared Error) — средний квадрат ошибки.
  • MAE (Mean Absolute Error) — средняя абсолютная ошибка.
  • R² (коэффициент детерминации) — отношение объяснённой дисперсии к полной дисперсии.

Пример вычисления MSE:

function mse(predictions, targets) {
    var n = predictions.length;
    var sum = 0;
    for(var i=0;i<n;i++) {
        sum += Math.pow(predictions[i]-targets[i],2);
    }
    return sum/n;
}

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

Регрессия чувствительна к:

  • Количеству скрытых слоёв и нейронов.
  • Функции активации скрытых слоёв (relu, tanh, sigmoid).
  • Скорости обучения и методу оптимизации.
  • Размеру батча и регуляризации.

Тщательная настройка этих параметров позволяет уменьшить переобучение и ускорить сходимость.

Работа с многомерной регрессией

Если требуется предсказывать несколько зависимых величин одновременно, выходной слой настраивается на нужное количество нейронов:

layer_defs.push({type:'regression', num_neurons:NUM_OUTPUTS});

В этом случае каждая цель представляется массивом значений [y1, y2, ..., yN].

Итоговая структура работы

  1. Определение архитектуры: входной слой, скрытые слои, выходной слой regression.
  2. Инициализация сети и тренера с выбранной функцией потерь.
  3. Предобработка данных: нормализация входов и целей.
  4. Обучение через итеративный градиентный спуск.
  5. Оценка модели по метрикам MSE, MAE, R².
  6. Прогнозирование на новых данных через net.forward.

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