Проход данных через всю сеть

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

Структура сети в Brain.js

Нейронная сеть в Brain.js создается с помощью класса NeuralNetwork или его расширений, таких как NeuralNetworkGPU. Каждый объект сети хранит следующие ключевые элементы:

  • Входные нейроны (input layer): принимают исходные данные. Размер входного слоя определяется числом признаков во входных данных.
  • Скрытые слои (hidden layers): выполняют промежуточные вычисления и формируют представление данных. Количество скрытых слоев и нейронов в каждом может быть указано при инициализации.
  • Выходные нейроны (output layer): возвращают окончательный результат сети. Размер выходного слоя зависит от задачи: классификация, регрессия или многоклассовая задача.

Пример инициализации сети с указанием скрытых слоев:

const brain = require('brain.js');

const net = new brain.NeuralNetwork({
  hiddenLayers: [10, 20] // два скрытых слоя: первый 10 нейронов, второй 20
});

Процесс прямого распространения (forward propagation)

Прямое распространение — это этап, когда входные данные проходят через всю сеть и вычисляется выходной сигнал.

  1. Передача данных на входной слой Входной массив или объект с признаками передается через метод net.run(input). Каждый нейрон входного слоя получает соответствующее значение входного признака.

  2. Вычисление активации скрытых слоев Каждый нейрон скрытого слоя вычисляет взвешенную сумму входов и применяет функцию активации. В Brain.js по умолчанию используется сигмоида:

    [ y = ]

    где ( x = _{i} w_i x_i + b ), ( w_i ) — вес связи, ( x_i ) — входной сигнал, ( b ) — смещение (bias).

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

  4. Формирование выходного сигнала На выходном слое также вычисляется взвешенная сумма и функция активации. Для многоклассовых задач часто используется softmax, которая преобразует значения в вероятности.

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

const output = net.run({ red: 0.5, green: 0.2, blue: 0.9 });
console.log(output);

Структура весов и смещений

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

В Brain.js доступ к внутренним весам возможен через свойство net.toJSON(), что полезно для анализа или сохранения модели:

const json = net.toJSON();
console.log(json.layers);

Особенности передачи данных

  • Нормализация входных данных. Для эффективной работы сети входные значения обычно масштабируются в диапазоне [0,1] или [-1,1]. Без нормализации сеть может обучаться медленно или не сходиться.
  • Последовательность слоев. Каждый слой получает на вход только выход предыдущего слоя, что обеспечивает строго последовательное прохождение сигнала.
  • Активационные функции. Brain.js позволяет задавать разные функции активации (sigmoid, relu, leaky-relu), что влияет на скорость обучения и способность сети моделировать сложные зависимости.

Пример передачи данных через сеть с несколькими слоями

const net = new brain.NeuralNetwork({
  hiddenLayers: [4, 3],
  activation: 'relu'
});

net.train([
  { input: [0, 0], output: [0] },
  { input: [0, 1], output: [1] },
  { input: [1, 0], output: [1] },
  { input: [1, 1], output: [0] }
]);

const result = net.run([1, 0]);
console.log(result); // результат после прохождения через все слои

В этом примере данные [1, 0] проходят через первый скрытый слой из 4 нейронов, затем через второй скрытый слой из 3 нейронов, и на выходе формируется результат сети.

Итоговый принцип работы

Передача данных через сеть в Brain.js представляет собой цепочку последовательных вычислений: вход → взвешенные суммы → функция активации → следующий слой → выход. Каждый слой постепенно преобразует исходный сигнал, формируя сложное нелинейное отображение входных данных в нужный результат, что и делает нейронные сети мощным инструментом для решения задач классификации, регрессии и прогнозирования.