Regression loss

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

Основные принципы

Регрессионная задача формулируется как минимизация ошибки между предсказанным значением ( ) и истинным значением ( y ). Для этого используется Regression Loss (функция потерь для регрессии). В ConvNetJS реализованы различные варианты функции потерь, наиболее популярные:

  • L2 Loss (Mean Squared Error, MSE) Основная и наиболее часто применяемая функция потерь для регрессии. Вычисляется как среднее квадратичное отклонение предсказаний от целевых значений:

    [ L = _{i=1}^{N} (_i - y_i)^2]

    Где ( N ) — количество наблюдений. L2 Loss чувствительна к выбросам, так как квадратичное возведение ошибок увеличивает влияние больших отклонений.

  • L1 Loss (Mean Absolute Error, MAE) Альтернатива L2 Loss, менее чувствительная к выбросам:

    [ L = _{i=1}^{N} |_i - y_i|]

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

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

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

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

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

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

  • type:'regression' указывает, что слой является регрессионным и будет использовать подходящую функцию потерь.
  • num_neurons задает размер выходного вектора, например, для предсказания одного значения достаточно num_neurons:1.

Настройка Solver для обучения

ConvNetJS использует объект Trainer для обучения сети. Для регрессии также можно выбрать параметры обучения:

var trainer = new convnetjs.SGDTrainer(net, {
    learning_rate:0.01, 
    momentum:0.9, 
    batch_size:20, 
    l2_decay:0.001
});
  • learning_rate — скорость обучения, определяет шаг градиентного спуска.
  • momentum — помогает ускорить сходимость и уменьшить колебания.
  • batch_size — количество примеров, используемых за одну итерацию.
  • l2_decay — регуляризация, предотвращающая переобучение.

Подготовка данных для регрессии

Данные должны быть представлены в виде объектов типа Vol, даже если это скалярное значение:

var x = new convnetjs.Vol([input_value]);
var stats = trainer.train(x, [target_value]);
  • input_value — входное значение (может быть массивом признаков).
  • target_value — соответствующая цель, тоже массив, если предсказывается несколько чисел.

Важно: при регрессии размерность выхода сети должна совпадать с размерностью целевого вектора.

Вычисление ошибки и оценка качества

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

var predicted = net.forward(x);
console.log('Predicted:', predicted.w[0]);

predicted.w содержит массив предсказанных значений. Для анализа ошибки можно вручную вычислить разность с истинными значениями:

var error = predicted.w[0] - target_value[0];

Для более точной оценки используется среднеквадратичная ошибка по всей выборке.

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

  • Масштабирование данных: для регрессии крайне важно нормализовать входные и целевые значения, чтобы градиенты не «взрывались».
  • Выбор функции потерь: L2 Loss лучше подходит для большинства задач, где выбросы не критичны; L1 Loss предпочтителен, когда выбросы присутствуют.
  • Регуляризация: L2 decay помогает контролировать переобучение, особенно при небольших данных.
  • Batch size и сходимость: малые батчи дают шумные градиенты, большие — стабильные, но требуют больше вычислений за итерацию.

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

ConvNetJS позволяет комбинировать регрессионный слой с другими слоями:

  • Связные слои (fc) для построения полносвязной сети.
  • Dropout для регуляризации.
  • Активации relu, tanh, sigmoid для нелинейных преобразований.

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