Класс NeuralNetwork и его создание

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

Создание экземпляра NeuralNetwork

Создание новой сети выполняется через конструктор:

const brain = require('brain.js');
const net = new brain.NeuralNetwork(options);

Параметры options:

  • inputSize — количество входных нейронов. Если не указано, размер входа определяется автоматически при первой подаче данных.
  • hiddenLayers — массив, задающий количество и размер скрытых слоев. Например, [10, 20] создаст два скрытых слоя с 10 и 20 нейронами.
  • outputSize — количество выходных нейронов. Определяется автоматически при подаче данных, если не указано.
  • learningRate — скорость обучения. Значение по умолчанию 0.3.
  • activation — функция активации, поддерживаемые значения: 'sigmoid', 'relu', 'leaky-relu', 'tanh'.
const net = new brain.NeuralNetwork({
  hiddenLayers: [16, 16],
  activation: 'relu',
  learningRate: 0.1
});

Структура сети

Сеть состоит из последовательных слоев:

  1. Входной слой — принимает вектор признаков. Размер определяется по данным.
  2. Скрытые слои — производят нелинейные преобразования входных сигналов через функции активации.
  3. Выходной слой — формирует прогноз или классификацию.

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

Методы обучения

train(data, options) — основной метод обучения сети.

Параметры data:

  • Массив объектов вида { input: [...], output: [...] }.
  • input — числовой массив входных признаков.
  • output — числовой массив выходов (для классификации обычно используются one-hot кодировки).

Параметры options:

  • iterations — максимальное число итераций обучения (по умолчанию 20000).
  • errorThresh — порог ошибки, при достижении которого обучение прекращается (по умолчанию 0.005).
  • log — логирование прогресса обучения. Может быть булевым значением или функцией.
  • logPeriod — частота логирования, количество итераций между выводом прогресса.
  • learningRate — скорость обучения для этой сессии (переопределяет глобальный параметр).

Пример обучения:

net.train([
  { input: [0, 0], output: [0] },
  { input: [0, 1], output: [1] },
  { input: [1, 0], output: [1] },
  { input: [1, 1], output: [0] }
], {
  iterations: 5000,
  errorThresh: 0.005,
  log: true,
  logPeriod: 100
});

Прогнозирование

Метод run(input) используется для получения результата сети:

const output = net.run([1, 0]); // Возвращает массив значений на выходе

В случае бинарной классификации результат — число от 0 до 1, которое можно интерпретировать как вероятность класса.

Сохранение и загрузка сети

Сеть можно сериализовать и восстановить:

const json = net.toJSON(); // Сохранение структуры и весов

const restoredNet = new brain.NeuralNetwork();
restoredNet.fromJSON(json); // Восстановление

Это позволяет обучать сеть один раз и использовать её в других проектах или на сервере.

Настройка функций активации

Функции активации определяют нелинейность нейронов:

  • 'sigmoid' — классическая S-образная функция, возвращает значения от 0 до 1. Подходит для бинарной классификации.
  • 'relu' — возвращает 0 для отрицательных значений и само значение для положительных. Ускоряет обучение глубоких сетей.
  • 'leaky-relu' — модификация ReLU, позволяет отрицательным значениям проходить с малым коэффициентом.
  • 'tanh' — возвращает значения от -1 до 1, улучшает сходимость для данных с отрицательными значениями.

Особенности использования

  • Для больших наборов данных рекомендуется нормализовать входные значения в диапазон [0, 1] или [-1, 1].
  • Выбор количества нейронов и слоёв напрямую влияет на способность сети к обобщению и переобучению.
  • Brain.js реализует простую версию нейросетей, удобную для быстрых прототипов, но не оптимизированную для огромных данных или глубоких сверточных сетей.

Поддержка GPU

Brain.js может ускорять обучение с помощью GPU через пакет brain.js GPU. Для этого достаточно изменить класс при создании:

const net = new brain.NeuralNetworkGPU({
  hiddenLayers: [20, 20],
  activation: 'relu'
});

Это особенно эффективно при больших объемах данных и сложных сетевых архитектурах.

Пример комплексной сети

const net = new brain.NeuralNetwork({
  hiddenLayers: [32, 16, 8],
  activation: 'tanh',
  learningRate: 0.05
});

const trainingData = [
  { input: [0, 0, 0], output: [0] },
  { input: [0, 1, 1], output: [1] },
  { input: [1, 0, 1], output: [1] },
  { input: [1, 1, 0], output: [0] }
];

net.train(trainingData, {
  iterations: 10000,
  errorThresh: 0.001,
  log: true,
  logPeriod: 500
});

const result = net.run([1, 0, 0]); // [0.982] — вероятность класса

Эта конфигурация демонстрирует гибкость NeuralNetwork для работы с многомерными входными данными и сложными логическими зависимостями.