Сеть с GPU-ускорением NeuralNetworkGPU

NeuralNetworkGPU — это специализированная версия классической нейронной сети NeuralNetwork библиотеки Brain.js, оптимизированная для работы на графических процессорах (GPU). Использование GPU позволяет существенно ускорить обучение и обработку больших массивов данных, особенно при многослойных сетях или при работе с высокоразмерными входными данными.

Ключевые особенности:

  • Поддержка многослойных перцептронов с любым количеством скрытых слоёв.
  • Высокая скорость обучения на GPU по сравнению с CPU.
  • Совместимость с существующим API Brain.js, что упрощает миграцию с NeuralNetwork.
  • Поддержка бинарных и вещественных входных и выходных значений.

Инициализация и конфигурация сети

Создание сети осуществляется через конструктор NeuralNetworkGPU. Основные параметры конфигурации:

const { NeuralNetworkGPU } = require('brain.js');

const net = new NeuralNetworkGPU({
  hiddenLayers: [64, 32],  // массив, определяющий количество нейронов в каждом скрытом слое
  learningRate: 0.01,      // скорость обучения
  activation: 'relu',       // функция активации ('sigmoid', 'relu', 'leaky-relu', 'tanh')
});

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

  • hiddenLayers — определяет структуру сети. Чем больше нейронов и слоёв, тем выше способность сети моделировать сложные функции, но увеличивается время обучения.
  • learningRate — влияет на скорость обновления весов. Слишком высокое значение может привести к нестабильности обучения, слишком низкое — к медленному сходимости.
  • activation — функция активации, влияющая на нелинейность модели. Для GPU рекомендуется relu или leaky-relu из-за их эффективной реализации.

Подготовка данных

NeuralNetworkGPU поддерживает входные данные в формате числовых массивов или объектов с бинарными/вещественными значениями.

Примеры форматов данных:

  1. Массив объектов:
const trainingData = [
  { input: [0, 0], output: [0] },
  { input: [0, 1], output: [1] },
  { input: [1, 0], output: [1] },
  { input: [1, 1], output: [0] },
];
  1. Объекты с ключами:
const trainingData = [
  { input: { a: 0, b: 1 }, output: { result: 1 } },
];

Важные моменты:

  • Все входные значения должны быть нормализованы в диапазоне [0, 1]. Это критично для стабильного обучения на GPU.
  • Выходные данные также должны быть нормализованы, если используются вещественные значения.

Обучение сети на GPU

Функция train имеет схожий синтаксис с CPU-версией, но внутренние вычисления происходят на GPU:

net.train(trainingData, {
  iterations: 20000,     // количество эпох
  errorThresh: 0.005,    // порог ошибки для остановки обучения
  log: true,             // вывод логов прогресса
  logPeriod: 100,        // частота логирования
});

Рекомендации по обучению:

  • Для больших сетей и объёмных данных лучше увеличить iterations и уменьшить learningRate.
  • GPU особенно эффективен при обучении сетей с большим количеством скрытых слоёв и нейронов.
  • Можно комбинировать с ранней остановкой, контролируя errorThresh, чтобы избежать переобучения.

Применение сети и предсказания

После обучения сеть можно использовать для получения предсказаний с помощью метода run:

const output = net.run([1, 0]);
console.log(output); // вероятностный результат

Особенности:

  • run возвращает значения в диапазоне [0, 1] для каждого выходного нейрона.
  • Для бинарных задач можно применить пороговое преобразование (output > 0.5 ? 1 : 0).

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

NeuralNetworkGPU поддерживает сериализацию модели, что позволяет сохранять её состояние и использовать без повторного обучения:

const json = net.toJSON();
const restoredNet = new NeuralNetworkGPU();
restoredNet.fromJSON(json);

Пояснения:

  • toJSON сохраняет архитектуру сети, веса и конфигурацию.
  • fromJSON позволяет восстановить сеть с сохранёнными параметрами на GPU, готовую к предсказаниям.

Оптимизация производительности

Для максимального ускорения на GPU стоит учитывать следующие моменты:

  • Использовать вещественные массивы вместо объектов, если важна скорость.
  • Минимизировать количество логирования во время обучения.
  • Подбирать оптимальное количество скрытых слоёв — слишком глубокие сети могут не дать линейного прироста производительности на небольших данных.
  • Обновлять драйверы GPU и Node.js версии для корректной работы WebGL или GPU.js, на котором основана реализация.

Поддержка различных функций активации

NeuralNetworkGPU поддерживает несколько функций активации, каждая из которых имеет свои особенности:

  • sigmoid: хорошо подходит для выхода в диапазоне [0, 1], но может страдать от затухающего градиента.
  • relu: быстро обучается и хорошо масштабируется для больших сетей.
  • leaky-relu: предотвращает «умирание» нейронов, обеспечивая небольшой градиент для отрицательных значений.
  • tanh: симметричная функция, полезна для центровки данных вокруг нуля.

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