Доступ к весам сети и их ручное изменение

Synaptic — это мощная JavaScript-библиотека для создания, обучения и управления нейронными сетями. Одной из ключевых возможностей, отличающих её от многих других библиотек, является прямой доступ к структуре сети: нейронам, синапсам и весам. Этот подход открывает полный контроль над процессом обучения и позволяет реализовывать нетривиальные алгоритмы настройки сети.

Структура сети

В Synaptic нейронная сеть состоит из нейронов (Neuron) и синапсов (Connection). Каждый нейрон имеет несколько свойств:

  • bias — смещение нейрона, влияющее на его активацию.
  • activation — текущее значение активации.
  • incoming — массив входящих синапсов.
  • outgoing — массив исходящих синапсов.

Каждый синапс хранит ключевые данные:

  • from — нейрон, с которого идёт сигнал.
  • to — нейрон, на который направлен сигнал.
  • weight — вес синапса, влияющий на величину передаваемого сигнала.

Прямой доступ к весам

Для изменения поведения сети иногда требуется вмешательство на уровне отдельных весов. В Synaptic это реализуется через свойства синапсов. Пример доступа к весам:

// Получение первого слоя сети
let layer = myNetwork.layers.input;

// Проход по нейронам слоя
layer.list.forEach(neuron => {
    // Проход по исходящим синапсам нейрона
    neuron.outgoing.forEach(connection => {
        console.log(connection.weight); // Текущий вес
    });
});

Здесь layer.list содержит массив всех нейронов слоя, а connection.weight предоставляет значение веса для каждого соединения.

Ручное изменение весов

Изменение весов позволяет корректировать сеть без повторного обучения или использовать нестандартные методы адаптации. Пример установки нового веса:

neuron.outgoing.forEach(connection => {
    connection.weight = Math.random() * 2 - 1; // случайное значение от -1 до 1
});

Можно также изменять веса пропорционально текущему значению, например, для имплементации метода momentum:

let learningRate = 0.1;
neuron.outgoing.forEach(connection => {
    connection.weight += learningRate * deltaWeight;
});

Массовое изменение весов сети

Для крупных сетей удобнее использовать универсальные функции для обхода всех слоёв и нейронов:

function modifyWeights(network, modifierFunction) {
    network.layers.input.list.concat(
        network.layers.hidden.flat(),
        network.layers.output.list
    ).forEach(neuron => {
        neuron.outgoing.forEach(connection => {
            connection.weight = modifierFunction(connection.weight);
        });
    });
}

// Пример: уменьшить все веса в два раза
modifyWeights(myNetwork, weight => weight * 0.5);

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

Изменение смещений нейронов

Не только веса, но и смещения (bias) нейронов можно изменять вручную. Они хранятся в neuron.bias и влияют на порог активации. Пример изменения смещений:

network.layers.hidden.list.forEach(neuron => {
    neuron.bias = Math.random() * 0.2 - 0.1; // случайное смещение
});

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

Практические сценарии применения

  1. Инициализация весов нестандартным распределением — вместо случайной инициализации по умолчанию можно задать нормальное распределение с определённой дисперсией.
  2. Заморозка части сети — зафиксировать определённые веса, чтобы при дальнейшем обучении они не изменялись.
  3. Эксперименты с нестандартными алгоритмами обучения — например, градиентный спуск с индивидуальными коэффициентами для каждого синапса.
  4. Адаптация сети на лету — корректировка весов на основе дополнительных сигналов или метрик без полного повторного обучения.

Итоговые рекомендации по работе с весами

  • Использовать прямой доступ к connection.weight для точного контроля.
  • При массовых изменениях применять обход всех слоёв и нейронов через универсальные функции.
  • Совместно менять веса и смещения для более гибкой настройки.
  • Документировать изменения, чтобы не нарушить структуру сети.

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