Backpropagation (обратное распространение ошибки) является ключевым механизмом обучения нейронных сетей. В библиотеке Synaptic реализована поддержка как прямого, так и обратного распространения сигналов, что позволяет создавать гибкие и обучаемые модели. Центральными объектами для работы являются Neuron, Layer и Network.
Neuron отвечает за отдельный нейрон, включая его веса и смещение (bias). Layer объединяет нейроны в слой, поддерживает методы активации и передачи сигналов. Network управляет всей топологией сети и процессом обучения.
Backpropagation в Synaptic используется для корректировки весов нейронов на основе разницы между желаемым выходом и фактическим результатом.
Создание сети начинается с определения слоев:
const synaptic = require('synaptic');
const { Layer, Network, Trainer } = synaptic;
let inputLayer = new Layer(2);
let hiddenLayer = new Layer(3);
let outputLayer = new Layer(1);
inputLayer.project(hiddenLayer);
hiddenLayer.project(outputLayer);
let myNetwork = new Network({
input: inputLayer,
hidden: [hiddenLayer],
output: outputLayer
});
Ключевой момент: проектирование связей между слоями
обязательно для корректного распространения сигналов. Методы
project создают полносвязные слои по умолчанию, но также
возможны более сложные топологии.
Первым шагом является forward pass — прохождение входных данных через сеть:
let input = [0, 1];
let output = myNetwork.activate(input);
Функция activate возвращает массив значений выходного
слоя.
Ошибка вычисляется как разница между ожидаемым выходом и фактическим:
let target = [1];
let error = target[0] - output[0];
Для проверки корректности backpropagation важно наблюдать, как эта ошибка распространяется обратно через слои.
Обратное распространение осуществляется методом
propagate. Он принимает коэффициент
обучения и массив целевых значений:
let learningRate = 0.3;
myNetwork.propagate(learningRate, target);
Важно: Synaptic автоматически вычисляет градиенты для всех слоев и корректирует веса нейронов на основе функции активации (по умолчанию это сигмоидальная функция).
Процесс состоит из двух шагов:
Вычисление локальной ошибки для каждого нейрона:
Обновление весов: новый вес = старый вес + (коэффициент обучения × ошибка × входное значение)
Для детальной проверки можно зафиксировать веса перед и после вызова
propagate:
console.log("Вес до обучения:", hiddenLayer.list[0].connections.projected[0].weight);
myNetwork.propagate(learningRate, target);
console.log("Вес после обучения:", hiddenLayer.list[0].connections.projected[0].weight);
Если значения изменяются, backpropagation работает корректно. Для более системной проверки создаются тестовые наборы с известными выходами, чтобы убедиться, что ошибка уменьшается с каждой итерацией.
Synaptic предоставляет объект Trainer, который упрощает процесс обучения с backpropagation:
let trainer = new Trainer(myNetwork);
trainer.train([
{ input: [0,0], output: [0] },
{ input: [0,1], output: [1] },
{ input: [1,0], output: [1] },
{ input: [1,1], output: [0] }
], {
rate: 0.3,
iterations: 20000,
error: 0.005,
shuffle: true
});
Особенности:
rate — коэффициент обучения;iterations — максимальное количество итераций;error — целевой порог ошибки;shuffle — случайная перестановка данных для лучшей
генерализации.Trainer также позволяет наблюдать динамику ошибки, что облегчает визуальную проверку эффективности backpropagation.
Правильная проверка backpropagation требует наблюдения:
Для наглядного тестирования сети можно использовать:
network.toJSON() — сохраняет веса и топологию для
сравнения;Эти методы позволяют убедиться, что backpropagation не только вызывается, но и действительно обновляет параметры сети в соответствии с математической моделью.