Обучение сети прямо в браузере

Установка и подключение библиотеки

Для работы с Brain.js в веб-среде достаточно подключить библиотеку через CDN. Это позволяет сразу использовать функционал без необходимости установки через npm:

<script src="https://cdn.jsdelivr.net/npm/brain.js@2.0.0/dist/brain.min.js"></script>

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

Основные типы сетей

Brain.js предоставляет несколько классов нейронных сетей, наиболее часто используемые:

  • NeuralNetwork – стандартная полносвязная сеть для задач классификации и регрессии.
  • NeuralNetworkGPU – аналогичная сеть, но с использованием WebGL для ускорения вычислений на GPU.
  • recurrent.LSTM и recurrent.GRU – рекуррентные сети для работы с последовательностями данных (текст, временные ряды).

Выбор типа сети зависит от задачи: для простых бинарных классификаций достаточно NeuralNetwork, для обработки текста и последовательных данных – LSTM или GRU.

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

Нейронная сеть Brain.js ожидает данные в формате объектов с ключами input и output. Для бинарной классификации:

const trainingData = [
  { input: { red: 1, green: 0, blue: 0 }, output: { color: 1 } },
  { input: { red: 0, green: 1, blue: 0 }, output: { color: 0 } },
];

Для числовых и категориальных значений важно нормализовать данные в диапазон [0, 1]. Это повышает точность обучения и ускоряет сходимость.

Создание и настройка сети

const net = new brain.NeuralNetwork({
  hiddenLayers: [3],   // один скрытый слой с 3 нейронами
  activation: 'sigmoid' // функция активации: 'sigmoid', 'relu', 'tanh'
});

Ключевые параметры:

  • hiddenLayers – массив, задающий количество скрытых слоев и число нейронов в каждом.
  • activation – функция активации, определяющая нелинейность. relu обычно быстрее обучается, sigmoid подходит для бинарных задач.
  • learningRate – скорость обучения, значение по умолчанию 0.3. Уменьшение замедляет обучение, но повышает стабильность.

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

Brain.js поддерживает синхронное и асинхронное обучение. Простейший синхронный пример:

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

Особенности параметров обучения:

  • iterations – количество проходов по обучающей выборке. Слишком большое значение может привести к переобучению.
  • errorThresh – целевой уровень ошибки. Обучение остановится, когда средняя ошибка опустится ниже этого порога.
  • log и logPeriod – полезны для отслеживания прогресса в браузере.

Для асинхронного обучения используется метод trainAsync, который возвращает промис и не блокирует интерфейс:

await net.trainAsync(trainingData, { iterations: 10000 });

Тестирование сети

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

const output = net.run({ red: 1, green: 0, blue: 0 });
console.log(output);

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

const predicted = output.color > 0.5 ? 1 : 0;

Работа с последовательными данными

Рекуррентные сети используют другой формат:

const net = new brain.recurrent.LSTM();
net.train([
  { input: "hello", output: "hi" },
  { input: "how are you", output: "fine" }
]);

const response = net.run("hello");

Для LSTM важно, чтобы данные представляли логические или временные последовательности, иначе обучение не будет эффективным.

Сохранение и восстановление модели

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

const json = net.toJSON();
localStorage.setItem('myNetwork', JSON.stringify(json));

Для восстановления:

const saved = JSON.parse(localStorage.getItem('myNetwork'));
const net = new brain.NeuralNetwork();
net.fromJSON(saved);

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

Применение GPU для ускорения

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

const net = new brain.NeuralNetworkGPU();
net.train(trainingData, { iterations: 5000 });

WebGL позволяет ускорить матричные операции, особенно на больших выборках. Однако для малых сетей разница может быть незаметной.

Визуализация процесса обучения

Brain.js предоставляет возможность отслеживать прогресс обучения через функцию log. Для более наглядного анализа можно использовать графики:

const trainingErrors = [];
net.train(trainingData, {
  iterations: 20000,
  log: (err) => trainingErrors.push(err),
  logPeriod: 100
});

// Затем строится график ошибок с помощью canvas или библиотек типа Chart.js

Это помогает определить момент переобучения и оценить динамику снижения ошибки.

Особенности работы в браузере

  • В браузере сеть ограничена ресурсами устройства, поэтому обучение больших сетей может быть медленным.
  • Использование trainAsync предотвращает блокировку интерфейса и позволяет одновременно выполнять другие задачи.
  • Данные лучше загружать и нормализовать заранее, чтобы не перегружать память.

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