Библиотека Synaptic предоставляет гибкие механизмы для построения нейронных сетей различной архитектуры. Одной из продвинутых возможностей является совместное использование весов между слоями, что позволяет экономить память, ускорять обучение и реализовывать необычные архитектурные решения.
В Synaptic слои реализованы через объект Layer, который содержит массив нейронов и связи между ними. Каждый нейрон хранит свои входные и выходные веса в виде объектов connections. Стандартно каждый слой имеет собственные веса, но их можно разделять между слоями, создавая ссылки на один и тот же объект весов.
Совместное использование весов обычно применяется в следующих случаях:
В Synaptic веса между нейронами представлены объектами Connection, который хранит:
from — исходный нейронto — целевой нейронweight — значение весаgain — коэффициент усиленияДля совместного использования создается один объект Connection, который присваивается сразу нескольким нейронам или слоям. Например:
const Layer = require('synaptic').Layer;
// Создание слоя-источника
const inputLayer = new Layer(3);
// Создание слоя-получателя
const hiddenLayer = new Layer(3);
// Создание единого веса
const sharedWeight = { weight: Math.random(), gain: 1 };
// Связь всех нейронов inputLayer с hiddenLayer через один sharedWeight
inputLayer.list.forEach(fromNeuron => {
hiddenLayer.list.forEach(toNeuron => {
fromNeuron.connections.projected[toNeuron.ID] = { ...sharedWeight, from: fromNeuron, to: toNeuron };
});
});
В этом примере каждый нейрон второго слоя использует одни и те же веса, что обеспечивает синхронное обновление во время обучения.
При использовании общих весов важно учитывать, что:
Совместное использование весов особенно эффективно при:
Пример рекуррентного применения:
const hidden = new Layer(5);
const output = new Layer(2);
// Использование hidden слоя повторно для рекуррентного шага
hidden.list.forEach(h => {
output.list.forEach(o => {
const connection = { weight: Math.random(), gain: 1, from: h, to: o };
h.connections.projected[o.ID] = connection;
});
});
Здесь каждый рекуррентный шаг использует одни и те же веса, что позволяет сети эффективно сохранять информацию о предыдущих состояниях.
Совместное использование весов является мощным инструментом, расширяющим возможности Synaptic, позволяя строить оптимизированные и компактные сети без дублирования параметров. Это особенно важно при работе с ограниченными ресурсами и при проектировании сложных рекуррентных или многоветвевых архитектур.