Воспроизводимость: фиксация начальных весов

Synaptic — это библиотека для создания нейронных сетей в JavaScript, обеспечивающая гибкость в построении как простых, так и сложных моделей. Она поддерживает архитектуры Feedforward, Recurrent, а также предоставляет возможности для обучения с подкреплением. Ключевыми компонентами библиотеки являются Neuron, Layer, Network и Trainer, которые позволяют строить и обучать нейронные сети на различных задачах.

Архитектура и компоненты

  • Neuron: базовый элемент сети, который хранит веса и вычисляет выходные значения.
  • Layer: слой нейронов, может состоять из произвольного числа нейронов. Позволяет создавать скрытые слои и управлять связями между ними.
  • Network: объединяет слои и нейроны в единую структуру. Позволяет выполнять прямое распространение (forward propagation) и обратное распространение ошибки (backpropagation).
  • Trainer: вспомогательный объект для упрощённого обучения сетей. Поддерживает различные функции потерь и методы оптимизации.

Прямое распространение и обучение

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

Пример прямого распространения:

const { Layer, Network } = require('synaptic');

const inputLayer = new Layer(2);
const hiddenLayer = new Layer(3);
const outputLayer = new Layer(1);

inputLayer.project(hiddenLayer);
hiddenLayer.project(outputLayer);

const network = new Network({
    input: inputLayer,
    hidden: [hiddenLayer],
    output: outputLayer
});

const output = network.activate([0.5, 0.8]);

Воспроизводимость и фиксация начальных весов

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

Методы фиксации начальных весов:

  1. Явная установка весов: после создания сети можно вручную задать значения весов каждого соединения.
network.layers.input.list[0].connections.projected[0].weight = 0.45;
  1. Использование генератора случайных чисел с фиксированным seed: стандартная библиотека Synaptic не поддерживает прямое задание seed, поэтому применяются сторонние генераторы, например, seedrandom:
const seedrandom = require('seedrandom');
Math.random = seedrandom('fixed-seed');

const neuron = new Neuron(); // веса инициализируются с предсказуемыми значениями
  1. Сохранение и загрузка сети: для долгосрочной воспроизводимости можно экспортировать сеть в JSON после инициализации весов и использовать этот JSON для повторного создания сети:
const exported = network.toJSON();
const restoredNetwork = Network.fromJSON(exported);

Практические рекомендации

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

Влияние на обучение

Фиксация начальных весов позволяет:

  • Получить сравнимые результаты при тестировании различных архитектур или параметров обучения.
  • Избежать эффекта случайных отклонений, особенно при малых тренировочных выборках.
  • Обеспечить стабильность при отладке и анализе поведения сети.

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