LSTM (Long Short-Term Memory) — это разновидность рекуррентных нейронных сетей (RNN), предназначенная для работы с последовательными данными, такими как текст. В отличие от стандартных RNN, LSTM способны эффективно запоминать длинные зависимости в последовательностях, что делает их идеальными для задач генерации текста посимвольно.
Brain.js предоставляет возможность создавать LSTM-сети для работы с
текстом через объект recurrent.LSTM. Эти сети обучаются на
последовательностях символов, а затем могут генерировать новые
последовательности на основе изученного контекста.
Для начала необходимо импортировать библиотеку и создать объект LSTM:
const brain = require('brain.js');
const lstm = new brain.recurrent.LSTM();
Основные параметры, которые можно настроить при создании LSTM:
Пример с пользовательскими скрытыми слоями:
const lstm = new brain.recurrent.LSTM({
hiddenLayers: [128, 128], // два скрытых слоя по 128 нейронов
learningRate: 0.005
});
Для LSTM важно, чтобы данные представляли собой последовательности
символов. В Brain.js это достигается через массив объектов с полями
input и output:
const trainingData = [
{ input: "привет", output: "привет" },
{ input: "мир", output: "мир" },
{ input: "hello", output: "hello" }
];
Особенности подготовки:
input должен содержать последовательность, которую сеть
должна научиться предсказывать.Обучение LSTM выполняется методом train, принимающим
массив данных и объект конфигурации обучения:
lstm.train(trainingData, {
iterations: 2000,
log: true,
logPeriod: 100,
learningRate: 0.01,
errorThresh: 0.005
});
Ключевые параметры обучения:
Примечание: посимвольные модели требуют больше итераций и меньшего
learningRate, чем модели, обучающиеся на словах, так как
алфавит может быть большим, а контекст сложным.
После обучения сеть способна генерировать текст посимвольно. Метод
run принимает начальную последовательность (seed) и
возвращает предсказанную последовательность:
const output = lstm.run('прив');
console.log(output); // Например: "ет"
Для генерации более длинного текста необходимо циклически подавать сгенерированные символы обратно в сеть:
let seed = 'п';
let result = seed;
for (let i = 0; i < 50; i++) {
const next = lstm.run(seed);
result += next;
seed = next; // следующий шаг строится на последнем символе
}
console.log(result);
После обучения сеть можно сохранить в JSON и загрузить позже без повторного обучения:
const json = lstm.toJSON(); // экспорт модели
const lstm2 = new brain.recurrent.LSTM();
lstm2.fromJSON(json); // восстановление модели
Это позволяет использовать одну и ту же модель на разных устройствах или в разных сессиях.
const trainingData = [
{ input: "мир", output: "мир" },
{ input: "машина", output: "машина" },
{ input: "марс", output: "марс" }
];
const lstm = new brain.recurrent.LSTM({
hiddenLayers: [128, 128],
learningRate: 0.005
});
lstm.train(trainingData, {
iterations: 3000,
log: true,
logPeriod: 200,
errorThresh: 0.005
});
const seed = 'м';
let text = seed;
for (let i = 0; i < 20; i++) {
const next = lstm.run(seed);
text += next;
seed = next;
}
console.log(text); // Возможная генерация: "ирмашинамарс..."
Такая структура позволяет создавать посимвольные модели, способные генерировать последовательности текста, предсказывать следующий символ и постепенно строить осмысленные строки.