Проекция слоя на другой слой

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

Понятие проекции

Проекция в Synaptic — это объект класса Layer или Connection, который связывает два слоя сети. Она определяет направление передачи сигнала и весовые коэффициенты, влияющие на обучение и активацию нейронов. Проекции могут быть:

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

Создание слоев и базовые проекции

Для работы с проекциями сначала создаются слои с помощью конструктора Layer:

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

let inputLayer = new Layer(3);  // слой из 3 нейронов
let hiddenLayer = new Layer(4); // слой из 4 нейронов
let outputLayer = new Layer(2); // слой из 2 нейронов

Проекция между слоями создается методом project:

let inputToHidden = inputLayer.project(hiddenLayer);
let hiddenToOutput = hiddenLayer.project(outputLayer);

Метод project возвращает объект Connection, который содержит матрицу весов между слоями и позволяет контролировать их свойства.

Настройка параметров проекции

При создании проекции можно указать дополнительные параметры:

let connection = inputLayer.project(hiddenLayer, Layer.connectionType.ALL_TO_ALL, {
    weights: [0.1, -0.2, 0.3, 0.4, 0.5, -0.1, 0.2, 0.0, -0.3, 0.1, 0.05, -0.05]
});
  • connectionType — тип соединений между слоями (ALL_TO_ALL, ONE_TO_ONE или пользовательские функции).
  • weights — массив начальных весов. Если массив не задан, веса инициализируются случайными значениями.
  • mask — массив булевых значений для создания частично связанных слоев.

Управление весами

Весовая матрица, содержащая связи между нейронами, доступна через свойства проекции:

console.log(connection.connections); // массив объектов с from, to, weight

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

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

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

Проекции с пользовательскими схемами соединений

Помимо стандартных ALL_TO_ALL и ONE_TO_ONE, Synaptic позволяет создавать проекции по собственной логике:

let customConnection = inputLayer.project(hiddenLayer, Layer.connectionType.CUSTOM, {
    selector: function(fromIndex, toIndex) {
        return (fromIndex + toIndex) % 2 === 0; // соединяем только четные индексы
    }
});

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

Рекуррентные проекции

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

hiddenLayer.project(hiddenLayer); // слой соединяется сам с собой

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

Практическое использование

Проекции широко используются для:

  1. Создания глубоких сетей: последовательное соединение нескольких скрытых слоев через project.
  2. Организации сложных топологий: объединение нескольких слоев в параллельные ветви с последующей агрегацией.
  3. Реализации рекуррентных сетей: слои с самопроекциями или проекциями на предыдущие слои.
  4. Тонкой настройки обучения: ручная инициализация весов, создание частично связанных сетей для уменьшения переобучения.

Методы взаимодействия проекций

Synaptic предоставляет ключевые методы для работы с проекциями:

  • activate(input) — передает входной сигнал через проекцию.
  • propagate(rate, target) — обновляет веса по алгоритму обратного распространения ошибки.
  • clear() — сбрасывает накопленные состояния нейронов.
  • set({ weight }) — массовое изменение весов соединений.

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

Взаимодействие с другими слоями и сетями

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


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