Удаление и изменение связей в процессе работы

Библиотека Synaptic предоставляет гибкие средства для динамического изменения структуры нейронной сети, включая добавление, удаление и модификацию связей между нейронами. Эти операции позволяют адаптировать сеть под новые данные без полной пересборки модели, а также реализовывать алгоритмы с динамической архитектурой, такие как сети с нейропластичностью.


1. Доступ к связям нейрона

В 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);
});

2. Удаление связей

Удаление связи производится через прямое обращение к массиву projected или методом disconnect.

Метод disconnect:

// Удаление конкретной связи между двумя нейронами
neuronA.disconnect(neuronB);

Этот метод удаляет объект Connection из исходящего массива neuronA и из входящего массива neuronB. После удаления связь полностью исключается из структуры сети и перестает участвовать в передаче сигналов.

Прямое манипулирование массивами:

neuronA.connections.projected = neuronA.connections.projected.filter(
    conn => conn.to !== neuronB
);

При этом следует помнить, что простое удаление объекта из массива не обновляет гейты и другие внутренние ссылки, поэтому использование disconnect предпочтительнее.


3. Изменение весов и направлений связей

Связи могут быть изменены динамически во время работы сети:

  • Изменение веса:
conn.weight = 0.75; // новое значение веса
  • Инверсия направления: Synaptic не предоставляет готового метода для инверсии связи, поэтому необходимо создавать новую связь и удалять старую:
let newConn = neuronB.project(neuronA, initialWeight);
neuronA.disconnect(neuronB);

Это позволяет изменить поток сигналов между нейронами без перестройки всей сети.


4. Работа с гейтированными связями

Нейроны могут модулировать другие связи через гейты. Гейтированная связь содержит ссылку на нейрон-гейт:

conn.gate = gatingNeuron;

Чтобы удалить или изменить такую связь, необходимо:

  1. Разорвать гейтирование:
conn.gate = null;
  1. При необходимости удалить саму связь через disconnect.

5. Массовое изменение связей

Для изменения большого числа связей можно использовать циклы и фильтры. Например, уменьшение веса всех исходящих связей нейрона на 10%:

neuron.connections.projected.forEach(conn => {
    conn.weight *= 0.9;
});

Удаление всех исходящих связей можно выполнить так:

neuron.connections.projected.slice().forEach(conn => {
    neuron.disconnect(conn.to);
});

Использование slice() важно для создания копии массива, чтобы избежать ошибок при удалении элементов во время итерации.


6. Динамическая перестройка сети

Удаление и изменение связей позволяет:

  • Реализовать обучение с изменяющейся архитектурой (нейропластичность).
  • Адаптировать сеть к новым условиям без полной переинициализации.
  • Экспериментировать с различными топологиями для оптимизации производительности.

Например, можно удалять маловажные связи с весом ниже порога, чтобы уменьшить размер сети и ускорить вычисления:

let threshold = 0.1;
neuron.connections.projected.slice().forEach(conn => {
    if (Math.abs(conn.weight) < threshold) {
        neuron.disconnect(conn.to);
    }
});

7. Важные рекомендации

  • Всегда использовать disconnect вместо простого удаления из массива.
  • При изменении структуры учитывать гейтированные связи.
  • Перед массовыми изменениями создавать копию массива связей.
  • Следить за консистентностью сети, чтобы не оставалось «висячих» ссылок на удалённые нейроны.

Эти методы делают работу с Synaptic максимально гибкой, позволяя строить динамические, адаптивные и оптимизированные нейронные сети, способные изменять свои соединения во время работы и обучения.