Библиотека Synaptic представляет собой фреймворк для построения нейронных сетей в JavaScript, обеспечивающий гибкость в создании различных типов архитектур: от простых однослойных перцептронов до сложных рекуррентных сетей. Основой работы с нейронной сетью является определение структуры, инициализация весов и настройка функции обучения.
В Synaptic сеть строится из нейронов, объединённых в слои. Ключевые элементы:
Пример создания слоя из трёх нейронов:
const { Layer } = require('synaptic');
let inputLayer = new Layer(3);
Процесс forward propagation заключается в последовательном вычислении выходных значений нейронов каждого слоя на основе входных данных и текущих весов:
Обучение сети в Synaptic осуществляется методом backpropagation, основанным на вычислении градиентов функции ошибки по каждому весу. Для нейрона (j) на слое (l) частная производная функции ошибки (E) по весу (w_{ij}) вычисляется по формуле:
[ = _j a_i]
где:
(a_i) — активация нейрона на предыдущем слое,
(_j) — локальный градиент нейрона (j), который зависит от выбранной функции активации:
Ключевое отличие: частная производная по весу учитывает как ошибку на выходе, так и влияние конкретного входа на эту ошибку. Это позволяет корректно корректировать веса для минимизации функции потерь.
Для эффективного обучения необходимо точно вычислять производные активационных функций, так как они напрямую участвуют в формуле градиента:
Производная используется в вычислении локального градиента (_j), что позволяет корректно обновлять веса на каждом шаге обучения:
[ w_{ij}^{new} = w_{ij}^{old} - ]
где () — коэффициент обучения.
В многослойной архитектуре ошибка на выходном слое распространяется обратно через скрытые слои. Для нейрона (h) скрытого слоя локальный градиент вычисляется как сумма взвешенных градиентов нейронов следующего слоя:
[ _h = a_h (1 - a_h) j w{hj} _j]
Это позволяет корректно учитывать влияние каждого скрытого нейрона на итоговую ошибку сети.
Пример ручного обновления весов с использованием частных производных:
const { Layer, Network } = require('synaptic');
let inputLayer = new Layer(2);
let hiddenLayer = new Layer(3);
let outputLayer = new Layer(1);
inputLayer.project(hiddenLayer);
hiddenLayer.project(outputLayer);
let network = new Network({
input: inputLayer,
hidden: [hiddenLayer],
output: outputLayer
});
// Прямое распространение
let output = network.activate([0.5, 0.8]);
// Ошибка и обратное распространение
let target = [1];
network.propagate(0.3, target);
Метод propagate Synaptic автоматически вычисляет
локальные градиенты () для каждого нейрона с учётом производных
активационных функций и корректирует веса по формуле градиентного
спуска.
Сочетание прямого распространения, вычисления частных производных и обратного распространения составляет ядро обучения нейронной сети в Synaptic, обеспечивая точную настройку весов и успешное приближение к целевой функции.