Установка связи между нейронами вручную

В библиотеке Synaptic для JavaScript нейронная сеть строится из отдельных объектов нейронов и синапсов, которые соединяют эти нейроны. Каждый нейрон представляет собой независимый вычислительный блок с функцией активации, весами и порогом срабатывания. Синапс хранит весовое значение соединения, которое влияет на силу передачи сигнала от одного нейрона к другому.

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

Создание нейронов

Нейроны создаются через конструктор Neuron:

const { Neuron } = require('synaptic');

let inputNeuron = new Neuron();
let hiddenNeuron = new Neuron();
let outputNeuron = new Neuron();

Каждый нейрон имеет следующие ключевые свойства:

  • activation — текущее значение активации нейрона, изменяется после вызова activate().
  • bias — порог срабатывания нейрона. Может быть положительным или отрицательным.
  • connections — объект, хранящий все входящие и исходящие синапсы.

Функцию активации можно менять через метод set:

inputNeuron.set({ squash: Neuron.squash.LOGISTIC });

Доступные варианты функции активации: LOGISTIC, TANH, IDENTITY, HENON и другие.

Ручное соединение нейронов

Связь между нейронами создается через метод project или напрямую через объект connections. На практике чаще используется project:

inputNeuron.project(hiddenNeuron, 0.5); // соединение с весом 0.5
hiddenNeuron.project(outputNeuron, 1.0); // соединение с весом 1.0

Параметры:

  • target — нейрон или слой, с которым создается соединение.
  • weight — начальный вес синапса (по умолчанию случайный).

Метод project возвращает объект синапса, что позволяет далее изменять его свойства вручную:

let synapse = inputNeuron.project(hiddenNeuron);
synapse.weight = 0.75;

Входные и выходные сигналы

После соединения нейронов передача данных происходит через метод activate:

inputNeuron.activate(1); // подается сигнал 1
hiddenNeuron.activate();  // рассчитывает активацию на основе входов
outputNeuron.activate();  // получает финальный результат

Формула активации нейрона в Synaptic:

[ y = squash(_i (input_i weight_i) + bias)]

Где:

  • (input_i) — входной сигнал от i-го нейрона
  • (weight_i) — вес соответствующего синапса
  • (bias) — смещение нейрона
  • (squash) — функция активации

Изменение весов вручную

Для настройки сети без обучения можно изменять веса напрямую. Это полезно при моделировании определенных паттернов:

inputNeuron.connections.projected[hiddenNeuron.ID].weight = 0.9;

В Synaptic каждое соединение хранится в виде объекта:

  • from — исходный нейрон
  • to — целевой нейрон
  • weight — значение веса
  • gain — коэффициент усиления синапса

Обратная связь между нейронами

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

hiddenNeuron.project(hiddenNeuron, 0.4); // самоподключение
hiddenNeuron.project(inputNeuron, 0.2);  // обратная связь к входу

При использовании таких схем важно контролировать порядок активации, чтобы избежать непредсказуемого поведения сети. Рекомендуется вызывать activate() последовательно, начиная с нейронов без входных связей.

Настройка смещения нейронов (bias)

Смещение позволяет нейрону активироваться при слабых или отрицательных входных сигналах:

hiddenNeuron.bias = -0.3;
outputNeuron.bias = 0.5;

Изменение bias напрямую влияет на итоговую активацию и позволяет тонко подстраивать поведение сети при ручной настройке.

Итоговая схема ручного соединения

  1. Создаются нейроны (Neuron).
  2. Устанавливаются функции активации (squash) и смещения (bias).
  3. Нейроны соединяются через project с указанием начального веса.
  4. Сигналы передаются через activate.
  5. Весовые коэффициенты и смещения могут изменяться вручную для моделирования нужного поведения.
  6. При необходимости создаются циклические соединения для обратной связи.

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