ConvNetJS — это компактная, полностью клиентская библиотека для построения и обучения нейронных сетей на языке JavaScript. Одним из её ключевых достоинств является гибкость при определении функций потерь, что позволяет адаптировать обучение к специфическим задачам.
Функция потерь (loss function) измеряет расхождение между предсказанным значением сети и ожидаемым результатом. В ConvNetJS каждая функция потерь представлена как отдельный объект с методами для прямого и обратного распространения:
Встроенные функции потерь в ConvNetJS включают:
Каждая из этих функций реализована как отдельный класс, наследующий базовую структуру с методами forward и backward.
Кастомные функции потерь создаются путём определения нового класса с обязательными методами forward и backward. Пример структуры кастомной функции потерь:
function CustomLoss() {
this.loss = 0.0;
this.grad = null;
}
CustomLoss.prototype.forward = function(V, y) {
// Пример: взвешенная среднеквадратичная ошибка
var diff = [];
var lossSum = 0.0;
for (var i = 0; i < V.w.length; i++) {
diff[i] = V.w[i] - y[i];
lossSum += 0.5 * diff[i] * diff[i]; // 0.5 для удобства при вычислении градиента
}
this.loss = lossSum;
this.diff = diff;
return this.loss;
};
CustomLoss.prototype.backward = function() {
this.grad = new convnetjs.Vol(this.diff.length, 1, 1, 0.0);
for (var i = 0; i < this.diff.length; i++) {
this.grad.w[i] = this.diff[i]; // градиент L2Loss равен разнице между предсказанием и эталоном
}
};
В данном примере реализована модификация стандартной L2 функции потерь, где возможно добавление весовых коэффициентов к отдельным компонентам ошибки.
Для использования кастомной функции потерь в ConvNetJS необходимо:
convnetjs.Net().convnetjs.SGDTrainer.var net = new convnetjs.Net();
net.makeLayers([
{type:'input', out_sx:1, out_sy:1, out_depth:2},
{type:'fc', num_neurons:10, activation:'relu'},
{type:'softmax', num_classes:3}
]);
var trainer = new convnetjs.SGDTrainer(net, {
learning_rate:0.01,
momentum:0.9,
batch_size:1,
l2_decay:0.001
});
var lossLayer = new CustomLoss();
var x = new convnetjs.Vol([0.5, -1.2]);
var y = [1.0, 0.0]; // эталонное значение
var loss = lossLayer.forward(x, y);
lossLayer.backward();
Кастомные функции потерь в ConvNetJS позволяют реализовывать:
Можно реализовать функцию потерь, учитывающую как ошибку предсказания, так и симметрию результата:
function SymmetricLoss(alpha) {
this.alpha = alpha || 0.5;
this.loss = 0.0;
}
SymmetricLoss.prototype.forward = function(V, y) {
var loss = 0.0;
for (var i = 0; i < V.w.length; i++) {
var diff = V.w[i] - y[i];
loss += (1-this.alpha) * diff*diff + this.alpha * Math.abs(diff);
}
this.loss = loss;
this.diff = V.w.map((v, i) => (1-this.alpha)*2*(v-y[i]) + this.alpha * Math.sign(v-y[i]));
return this.loss;
};
SymmetricLoss.prototype.backward = function() {
this.grad = new convnetjs.Vol(this.diff.length, 1, 1, 0.0);
for (var i = 0; i < this.diff.length; i++) {
this.grad.w[i] = this.diff[i];
}
};
Эта реализация объединяет L1 и L2 потери с настраиваемым коэффициентом, что позволяет гибко регулировать чувствительность к большим выбросам.
Кастомизация функций потерь в ConvNetJS обеспечивает широкие возможности адаптации нейронных сетей под задачи, которые невозможно эффективно решить стандартными встроенными функциями. Это делает библиотеку удобным инструментом для экспериментов и прототипирования сложных моделей на стороне клиента.