Brain.js — это библиотека для работы с нейронными сетями в JavaScript, которая позволяет реализовать задачи прогнозирования последовательностей, классификации и регрессии. Одной из типичных задач является предсказание следующего элемента последовательности, что может применяться для анализа текстов, числовых рядов или сигналов.
Для обучения сети предсказанию следующего элемента последовательности важно правильно подготовить данные. Каждая последовательность разбивается на пары: вход → ожидаемый выход.
Например, для числовой последовательности
[1, 2, 3, 4, 5] структура данных для сети может быть
такой:
const trainingData = [
{ input: [1], output: [2] },
{ input: [2], output: [3] },
{ input: [3], output: [4] },
{ input: [4], output: [5] }
];
Для текстовых данных необходимо преобразовать символы или слова в числовой формат. Один из распространённых методов — one-hot encoding, когда каждый символ представляется вектором с единицей в позиции этого символа и нулями в остальных позициях.
Brain.js поддерживает несколько типов сетей:
Для задачи предсказания следующего элемента чаще всего применяются LSTM-сети:
const brain = require('brain.js');
const net = new brain.recurrent.LSTM();
При работе с LSTM важны следующие параметры:
Пример конфигурации:
const net = new brain.recurrent.LSTM({
inputSize: 20,
hiddenLayers: [50, 50],
outputSize: 20,
learningRate: 0.01,
decayRate: 0.999
});
Для обучения сети используется метод train. Для
текстовых данных пример выглядит так:
const trainingData = [
{ input: "hello", output: "e" },
{ input: "hell", output: "l" },
{ input: "hel", output: "l" }
];
net.train(trainingData, {
iterations: 2000,
learningRate: 0.01,
log: true,
logPeriod: 100
});
Важно, чтобы данные охватывали все варианты последовательностей. Недостаток примеров приводит к переобучению или неточным прогнозам.
После обучения сеть может предсказывать следующий элемент:
const nextChar = net.run("hel"); // Вернёт 'l'
Для числовых последовательностей:
const result = net.run([3]); // Вернёт примерно 4
Для многосимвольного или многомерного предсказания возможно
использование метода run с массивами или строками,
соответствующими формату входных данных.
trainAsync: асинхронное
обучение на больших данных предотвращает блокировку основного потока
JavaScript.LSTM-сети Brain.js поддерживают последовательности разной длины. Можно использовать срезы последовательностей с шагом 1–n для генерации обучающих пар:
function createSequences(data, seqLength) {
const sequences = [];
for (let i = 0; i < data.length - seqLength; i++) {
const input = data.slice(i, i + seqLength);
const output = data[i + seqLength];
sequences.push({ input, output });
}
return sequences;
}
const trainingData = createSequences([1,2,3,4,5,6,7], 3);
Такой подход позволяет сети учитывать несколько предыдущих элементов при предсказании следующего.
После обучения сеть может не только предсказывать один элемент, но и генерировать продолжение последовательности:
let sequence = [1, 2, 3];
for (let i = 0; i < 5; i++) {
const next = net.run(sequence.slice(-3));
sequence.push(next);
}
Такой метод подходит для текстов, музыкальных нот или временных рядов, где результат предсказывается по предыдущим элементам.
Для задач типа предсказания следующего символа в тексте, временных рядов и числовых последовательностей LSTM показывает значительное преимущество.