В нейронных сетях функции потерь (loss functions) играют ключевую роль, так как определяют меру ошибки между предсказанными и истинными значениями. В библиотеке Synaptic функции потерь реализуются через отдельные методы и используются в процессе обучения сети с помощью обратного распространения ошибки (backpropagation). Выбор функции потерь напрямую влияет на скорость сходимости и качество обучения.
Формальная запись функции потерь для одного примера выглядит следующим образом:
[ L(y, ) = (y, )]
где (y) — целевое значение, () — предсказание сети.
Synaptic предоставляет несколько стандартных функций потерь:
Mean Squared Error (MSE) Наиболее часто используемая для регрессии. Вычисляется как среднее квадрата разницы между истинным значением и предсказанным:
[ MSE = _{i=1}^{n} (y_i - _i)^2]
Особенности:
Cross-Entropy (для классификации) Используется в задачах классификации, особенно для softmax-выходов. Формула для бинарной классификации:
[ CE = - _{i=1}^{n} (y_i (_i) + (1 - y_i) (1 - _i) )]
Особенности:
Для алгоритма обратного распространения необходимо вычислять градиенты функции потерь относительно выходов сети. Эти производные используются для обновления весов нейронов.
Производная MSE:
Для одного нейрона с выходом () и целевым значением (y):
[ = 2 ( - y)]
Если учитывать среднее по всем примерам, коэффициент (1/n) добавляется в градиент.
Производная Cross-Entropy с сигмоидой:
Для бинарной классификации с выходом ( = (z)):
[ = - y]
Этот результат особенно удобен, так как позволяет напрямую использовать ошибку на выходе нейрона без дополнительных умножений.
В Synaptic функции потерь задаются при обучении через объект
Trainer. Пример настройки для MSE:
const trainer = new synaptic.Trainer(network);
trainer.train(trainingSet, {
rate: 0.1,
iterations: 20000,
error: synaptic.Trainer.cost.MSE,
shuffle: true,
log: 1000
});
Для кросс-энтропии:
trainer.train(trainingSet, {
rate: 0.1,
iterations: 20000,
error: synaptic.Trainer.cost.CROSS_ENTROPY,
shuffle: true,
log: 1000
});
Ключевой момент: Synaptic автоматически вычисляет производные выбранной функции потерь при каждом шаге обратного распространения, поэтому нет необходимости реализовывать их вручную.
Synaptic позволяет создавать свои функции потерь. Для этого требуется определить функцию, принимающую предсказания и целевые значения, а также опционально функцию для вычисления градиента:
const customLoss = {
fn: function(target, output) {
// Например, абсолютная ошибка
let sum = 0;
for (let i = 0; i < target.length; i++) {
sum += Math.abs(target[i] - output[i]);
}
return sum / target.length;
},
derivative: function(target, output) {
let grad = [];
for (let i = 0; i < target.length; i++) {
grad.push(output[i] > target[i] ? 1 : -1);
}
return grad;
}
};
trainer.train(trainingSet, {
rate: 0.05,
iterations: 10000,
error: customLoss,
shuffle: true
});
log в Trainer позволяет отслеживать динамику
функции потерь и оценивать эффективность обучения.Функции потерь и их производные являются фундаментом обучения нейронных сетей в Synaptic. Правильный выбор функции и понимание поведения её производной позволяют контролировать процесс оптимизации, избегать сбоев в сходимости и повышать точность модели.