Библиотека Synaptic предоставляет гибкие средства для динамического изменения структуры нейронной сети, включая добавление, удаление и модификацию связей между нейронами. Эти операции позволяют адаптировать сеть под новые данные без полной пересборки модели, а также реализовывать алгоритмы с динамической архитектурой, такие как сети с нейропластичностью.
В Synaptic каждый нейрон представлен объектом класса
Neuron, который содержит массивы
connections.projected и connections.gated.
projected — связи, исходящие от данного нейрона к
другим нейронам.gated — связи, на которые данный нейрон оказывает
гейтирование (модуляцию).Для изменения связей необходимо работать с объектами
Connection, которые имеют ключевые свойства:
from — исходный нейрон.to — целевой нейрон.weight — вес связи.gain — множитель влияния для гейтов.Пример получения всех исходящих связей нейрона:
let neuron = layer.neurons()[0];
let outgoing = neuron.connections.projected;
outgoing.forEach(conn => {
console.log(conn.from, conn.to, conn.weight);
});
Удаление связи производится через прямое обращение к массиву
projected или методом disconnect.
Метод disconnect:
// Удаление конкретной связи между двумя нейронами
neuronA.disconnect(neuronB);
Этот метод удаляет объект Connection из исходящего
массива neuronA и из входящего массива
neuronB. После удаления связь полностью исключается из
структуры сети и перестает участвовать в передаче сигналов.
Прямое манипулирование массивами:
neuronA.connections.projected = neuronA.connections.projected.filter(
conn => conn.to !== neuronB
);
При этом следует помнить, что простое удаление объекта из массива не
обновляет гейты и другие внутренние ссылки, поэтому использование
disconnect предпочтительнее.
Связи могут быть изменены динамически во время работы сети:
conn.weight = 0.75; // новое значение веса
let newConn = neuronB.project(neuronA, initialWeight);
neuronA.disconnect(neuronB);
Это позволяет изменить поток сигналов между нейронами без перестройки всей сети.
Нейроны могут модулировать другие связи через гейты. Гейтированная связь содержит ссылку на нейрон-гейт:
conn.gate = gatingNeuron;
Чтобы удалить или изменить такую связь, необходимо:
conn.gate = null;
disconnect.Для изменения большого числа связей можно использовать циклы и фильтры. Например, уменьшение веса всех исходящих связей нейрона на 10%:
neuron.connections.projected.forEach(conn => {
conn.weight *= 0.9;
});
Удаление всех исходящих связей можно выполнить так:
neuron.connections.projected.slice().forEach(conn => {
neuron.disconnect(conn.to);
});
Использование slice() важно для создания копии массива,
чтобы избежать ошибок при удалении элементов во время итерации.
Удаление и изменение связей позволяет:
Например, можно удалять маловажные связи с весом ниже порога, чтобы уменьшить размер сети и ускорить вычисления:
let threshold = 0.1;
neuron.connections.projected.slice().forEach(conn => {
if (Math.abs(conn.weight) < threshold) {
neuron.disconnect(conn.to);
}
});
disconnect вместо простого удаления
из массива.Эти методы делают работу с Synaptic максимально гибкой, позволяя строить динамические, адаптивные и оптимизированные нейронные сети, способные изменять свои соединения во время работы и обучения.