Synaptic — это мощная библиотека для построения и обучения нейронных сетей на языке JavaScript. Одной из ключевых возможностей является гибкое соединение слоев с помощью проекций, позволяющих создавать сложные архитектуры сети, включая многослойные перцептроны, рекуррентные сети и кастомные топологии.
Проекция в Synaptic — это объект класса Layer или
Connection, который связывает два слоя сети. Она определяет
направление передачи сигнала и весовые
коэффициенты, влияющие на обучение и активацию нейронов.
Проекции могут быть:
Для работы с проекциями сначала создаются слои с помощью конструктора
Layer:
const { Layer } = require('synaptic');
let inputLayer = new Layer(3); // слой из 3 нейронов
let hiddenLayer = new Layer(4); // слой из 4 нейронов
let outputLayer = new Layer(2); // слой из 2 нейронов
Проекция между слоями создается методом
project:
let inputToHidden = inputLayer.project(hiddenLayer);
let hiddenToOutput = hiddenLayer.project(outputLayer);
Метод project возвращает объект Connection,
который содержит матрицу весов между слоями и позволяет контролировать
их свойства.
При создании проекции можно указать дополнительные параметры:
let connection = inputLayer.project(hiddenLayer, Layer.connectionType.ALL_TO_ALL, {
weights: [0.1, -0.2, 0.3, 0.4, 0.5, -0.1, 0.2, 0.0, -0.3, 0.1, 0.05, -0.05]
});
ALL_TO_ALL, ONE_TO_ONE или пользовательские
функции).Весовая матрица, содержащая связи между нейронами, доступна через свойства проекции:
console.log(connection.connections); // массив объектов с from, to, weight
Каждое соединение имеет ключевые свойства:
from — нейрон исходного слояto — нейрон целевого слояweight — числовой коэффициент связиИзменение весов возможно как вручную, так и в процессе обучения сети. Прямое изменение весов позволяет реализовать собственные правила обновления и эксперименты с нестандартными методами обучения.
Помимо стандартных ALL_TO_ALL и ONE_TO_ONE,
Synaptic позволяет создавать проекции по собственной логике:
let customConnection = inputLayer.project(hiddenLayer, Layer.connectionType.CUSTOM, {
selector: function(fromIndex, toIndex) {
return (fromIndex + toIndex) % 2 === 0; // соединяем только четные индексы
}
});
В этом случае метод selector определяет, создается ли
соединение между конкретными нейронами. Это удобно для реализации
сверточных или частично связанных слоев без необходимости создавать
новый класс слоя.
Проекции могут быть рекуррентными, позволяя слоям учитывать своё прошлое состояние:
hiddenLayer.project(hiddenLayer); // слой соединяется сам с собой
Рекуррентные соединения создают память в сети, что критично для работы с временными последовательностями. Synaptic автоматически обрабатывает рекуррентные проекции при активации и обратном распространении ошибки.
Проекции широко используются для:
project.Synaptic предоставляет ключевые методы для работы с проекциями:
activate(input) — передает входной сигнал через
проекцию.propagate(rate, target) — обновляет веса по алгоритму
обратного распространения ошибки.clear() — сбрасывает накопленные состояния
нейронов.set({ weight }) — массовое изменение весов
соединений.Использование этих методов позволяет строить кастомные циклы обучения и активации, включая многопоточные или асинхронные вычисления, сохраняя контроль над каждым уровнем сети.
Проекции не ограничиваются одним модулем сети. Можно соединять слои из разных сетей или создавать субсети, которые затем объединяются через проекции. Это облегчает модульное проектирование и повторное использование компонентов.
Проекции в Synaptic — это фундаментальный инструмент, позволяющий управлять архитектурой сети на уровне соединений между слоями. Они обеспечивают гибкость и расширяемость, открывая возможности для экспериментов с нестандартными нейронными структурами и рекуррентными топологиями.