Скалярное произведение и матричное умножение

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

Класс Neuron

Каждый нейрон представлен объектом Neuron. Нейрон содержит следующие ключевые элементы:

  • Входные веса (incoming), которые определяют влияние каждого входа на активацию нейрона.
  • Сигнал активации (activation), который вычисляется через функцию активации.
  • Функции активации (squash), поддерживающие сигмоиду, тангенс или ReLU.
  • Обратное распространение ошибки (propagate), использующее градиентный спуск для корректировки весов.

Пример создания нейрона:

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

let neuron = new Neuron();

Класс Layer

Слой (Layer) представляет собой группу нейронов и инкапсулирует обработку сигналов между ними. Основные методы слоя:

  • project(targetLayer): создает связи к другому слою.
  • activate(inputs): вычисляет активацию всех нейронов слоя по входным данным.
  • propagate(learningRate, targetValues): корректирует веса всех нейронов слоя на основе ошибки.
const { Layer } = require('synaptic');

let inputLayer = new Layer(3);  // 3 нейрона
let hiddenLayer = new Layer(4); // 4 нейрона
inputLayer.project(hiddenLayer);

Класс Network

Объединяет слои в единую сеть. Позволяет запускать обучение и прогнозирование:

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

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

let output = myNetwork.activate([0.1, 0.5, 0.9]);

Скалярное произведение в Synaptic

Скалярное произведение (dot product) лежит в основе вычисления активации нейронов. Для нейрона с входами (x_1, x_2, …, x_n) и весами (w_1, w_2, …, w_n) активация до применения функции активации вычисляется как:

[ z = x_1 w_1 + x_2 w_2 + + x_n w_n]

В коде Synaptic это реализуется через метод activate слоя или нейрона. Пример ручного вычисления:

let inputs = [1, 0.5, -0.5];
let weights = [0.4, -0.6, 0.8];

let z = inputs.reduce((sum, val, idx) => sum + val * weights[idx], 0);

Ключевое свойство скалярного произведения — линейность, которая обеспечивает корректное распространение сигналов в сети.

Матричное умножение и слои сети

Слои нейронной сети обрабатывают векторные данные через матричное умножение. Для слоя с (m) входами и (n) нейронами веса формируют матрицу размером (n m), а входной вектор размером (m ). Выходной вектор слоя вычисляется как:

[ = W ]

где (W) — матрица весов, () — входной вектор. В Synaptic этот процесс скрыт внутри метода activate слоя, но его можно симулировать вручную:

function matrixMultiply(weights, inputs) {
  return weights.map(row =>
    row.reduce((sum, w, idx) => sum + w * inputs[idx], 0)
  );
}

let weights = [
  [0.2, -0.4, 0.5],
  [-0.3, 0.8, -0.1],
  [0.6, -0.2, 0.1]
];

let inputs = [1, 0.5, -0.5];
let output = matrixMultiply(weights, inputs);

Связь скалярного произведения и матричного умножения

Матричное умножение слоя на входной вектор — это набор скалярных произведений для каждого нейрона слоя. Если слой имеет (n) нейронов, каждый нейрон вычисляет своё скалярное произведение, формируя итоговый выходной вектор. Это обеспечивает параллельную обработку сигналов и ускоряет вычисления.

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

  • Feedforward-сети: каждый слой активируется последовательно, используя матричное умножение для вычисления активаций.
  • Backpropagation: градиенты вычисляются через производные скалярных произведений, что позволяет корректировать веса всей сети.
  • Оптимизация: эффективное использование массивов и матриц снижает вычислительные затраты при работе с большими сетями.

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