Функция потерь для регрессии

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

Среднеквадратичная ошибка (Mean Squared Error, MSE)

Наиболее распространённой функцией потерь для регрессии является среднеквадратичная ошибка. Она определяется формулой:

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

где (y_i) — истинное значение, (_i) — предсказанное сетью значение, (N) — количество объектов в батче.

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

  • RegressionLayer автоматически вычисляет MSE при вызове метода forward.
  • Градиенты вычисляются по правилу:

[ = 2(_i - y_i)]

  • MSE чувствительна к выбросам, так как квадратичная функция усиливает влияние больших ошибок.

Пример создания слоя регрессии в ConvNetJS:

var layer_defs = [];
layer_defs.push({type:'input', out_sx:1, out_sy:1, out_depth:1});
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);

В данном примере выходной слой regression предсказывает одно непрерывное значение для каждого входного объекта.

Средняя абсолютная ошибка (Mean Absolute Error, MAE)

Менее чувствительным к выбросам является средняя абсолютная ошибка:

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

  • Градиенты MAE вычисляются как знак разности между предсказанным и истинным значением:

[ = (_i - y_i)]

  • В ConvNetJS нет встроенной MAE, но её можно реализовать через кастомный слой, наследующий функциональность RegressionLayer и переопределяющий метод backward.
function MAELayer() {
    this.num_inputs = 1;
    this.out_depth = 1;
}
MAELayer.prototype.forward = function(V, is_training) {
    this.out_act = V;
    return this.out_act;
}
MAELayer.prototype.backward = function(y) {
    this.in_act.dw = this.in_act.w.map((v,i) => (v - y[i]) >= 0 ? 1 : -1);
}

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

ConvNetJS поддерживает несколько оптимизаторов: SGD, AdaGrad, RMSProp, Adam. Для регрессии важна корректная настройка learning rate, так как ошибка предсказаний напрямую влияет на величину градиента.

Пример настройки тренировки сети на регрессию:

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

Предсказания и вычисление ошибки

После обучения сети регрессии важно проверять её точность на тестовом наборе данных:

var loss = 0;
for(var i=0;i<test_data.length;i++){
    var x = test_data[i].input;
    var y = test_data[i].output;
    var pred = net.forward(x);
    loss += Math.pow(pred.w[0] - y[0], 2);
}
loss /= test_data.length;
console.log('MSE на тесте: ' + loss);

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

Важные моменты при работе с регрессией в ConvNetJS

  • Нормализация данных: входные и выходные значения желательно масштабировать, чтобы градиенты не стали слишком большими или слишком маленькими.
  • Выбор функции потерь: MSE подходит для большинства задач, MAE — для устойчивости к выбросам.
  • Контроль переобучения: использование регуляризации (l2_decay) и ранней остановки при наблюдении за ошибкой на валидации.
  • Глубина сети: слишком глубокие сети для простых регрессий могут приводить к переобучению и затруднениям с обучением из-за исчезающих градиентов.

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