Частичное сохранение и горячая замена весов

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


Структура весов в Synaptic

Каждая нейронная сеть в Synaptic состоит из слоев, нейронов и связей. Веса представляют собой объекты, содержащие следующие свойства:

  • weight: числовое значение связи между нейронами.
  • from: ссылка на нейрон, от которого исходит сигнал.
  • to: нейрон, принимающий сигнал.
  • gater: нейрон, управляющий усилением связи (опционально).

Для сохранения весов используется метод toJSON(), который возвращает полное представление сети:

const networkJSON = myNetwork.toJSON();

Результат содержит информацию о:

  • слоях и их типах;
  • нейронах;
  • связях и весах;
  • активационных функциях.

Частичное сохранение весов

Полное сохранение сети не всегда необходимо. Часто требуется сохранить только определённые слои или выбранные связи. Для этого используется фильтрация объекта JSON.

Пример сохранения весов скрытого слоя:

const networkJSON = myNetwork.toJSON();
const hiddenLayerWeights = networkJSON.connections.filter(conn =>
    conn.from.layer === 1 && conn.to.layer === 2
);
const savedWeights = hiddenLayerWeights.map(conn => ({
    from: conn.from.index,
    to: conn.to.index,
    weight: conn.weight
}));

Такой подход позволяет:

  • хранить только критически важные параметры;
  • уменьшить объём данных для сериализации;
  • ускорить последующую загрузку сети.

Горячая замена весов

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

  • онлайн-обучения;
  • адаптивных систем, подстраивающихся под новые данные;
  • постепенной оптимизации весов после частичного обучения.

Процесс горячей замены состоит из нескольких шагов:

  1. Подготовка структуры весов для замены (JSON с индексами и значениями).
  2. Поиск соответствующих соединений в сети.
  3. Присвоение новых значений.

Пример реализации:

function hotSwapWeights(network, newWeights) {
    const connections = network.connections;
    newWeights.forEach(newConn => {
        const conn = connections.find(c =>
            c.from.index === newConn.from && c.to.index === newConn.to
        );
        if (conn) {
            conn.weight = newConn.weight;
        }
    });
}

Вызов функции:

hotSwapWeights(myNetwork, savedWeights);

После этого сеть будет использовать новые веса без пересоздания или полного переобучения.


Сохранение и восстановление отдельных слоев

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

function saveLayerWeights(network, layerIndex) {
    return network.connections
        .filter(conn => conn.from.layer === layerIndex)
        .map(conn => ({ from: conn.from.index, to: conn.to.index, weight: conn.weight }));
}

function loadLayerWeights(network, layerIndex, weights) {
    weights.forEach(w => {
        const conn = network.connections.find(c => c.from.index === w.from && c.to.index === w.to);
        if (conn) conn.weight = w.weight;
    });
}

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


Рекомендации по управлению весами

  1. Использовать индексы нейронов и слоёв, а не полные объекты, для экономии памяти.
  2. Сохранять веса в отдельных файлах или локальном хранилище при работе с браузером, чтобы облегчить переносимость.
  3. Версионировать весовые файлы, если планируется экспериментация с различными конфигурациями сети.
  4. При горячей замене следить за активационными функциями, чтобы новые веса не приводили к нестабильной работе сети.

Применение в реальных проектах

  • Системы рекомендаций: корректировка весов отдельных слоёв после анализа новых данных.
  • Робототехника: адаптация поведения робота без остановки всей системы.
  • Игровой ИИ: динамическая подстройка стратегии на основе действий игрока.

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