LSTM (Long Short-Term Memory) — это разновидность рекуррентных нейронных сетей (RNN), специально разработанная для решения проблемы исчезающего градиента при обучении на длинных последовательностях. Основной элемент LSTM — ячейка памяти, которая позволяет сети хранить информацию на протяжении большого числа временных шагов, контролируя её через три ключевых механизма: входной, выходной и забывающий гейты.
Входной гейт управляет тем, какая информация из текущего входа будет добавлена в память. Забывающий гейт решает, какая часть старой памяти будет удалена. Выходной гейт определяет, какая информация из памяти будет передана на следующий временной шаг или в следующий слой сети.
Двунаправленная LSTM (Bidirectional LSTM, BiLSTM) расширяет стандартный LSTM, добавляя второй LSTM, который обрабатывает последовательность в обратном порядке. Основная идея заключается в том, что контекст как предыдущих, так и последующих слов важен для задач анализа текста.
Особенности BiLSTM:
Для задач анализа тональности требуется подготовить текстовые данные следующим образом:
padSequences.Пример кода на JavaScript (подготовка последовательностей):
const { padSequences, Tokenizer } = require('keras-js-preprocessing');
const texts = ['Этот фильм потрясающий', 'Фильм был скучным'];
const tokenizer = new Tokenizer({ num_words: 1000 });
tokenizer.fitOnTexts(texts);
let sequences = tokenizer.textsToSequences(texts);
sequences = padSequences(sequences, { maxlen: 10 });
В Keras.js модель создаётся через экспорт из Keras (Python), так как Keras.js в основном используется для инференса в браузере, а не для обучения.
Пример структуры BiLSTM для анализа тональности:
Пример кода Python (экспортируемого в Keras.js):
from keras.models import Sequential
from keras.layers import Embedding, Bidirectional, LSTM, Dense
model = Sequential()
model.add(Embedding(input_dim=1000, output_dim=128, input_length=10))
model.add(Bidirectional(LSTM(64)))
model.add(Dense(1, activation='sigmoid'))
model.save('bilstm_model.h5')
Экспортированная модель затем может быть загружена в Keras.js для выполнения в браузере:
const KerasJS = require('keras-js');
const model = new KerasJS.Model({ filepath: 'bilstm_model.bin', gpu: true });
await model.ready();
const inputData = { input_1: new Float32Array(sequences[0]) };
const outputData = await model.predict(inputData);
console.log(outputData);
Ключевые параметры BiLSTM, влияющие на точность анализа тональности:
output_dim): обычно
100–300 для небольших текстов, до 768 для предобученных векторов.units): 64–256
в зависимости от объёма данных.input_length): оптимально выбирать среднюю длину
предложений корпуса.sigmoid для
бинарной тональности (позитив/негатив), softmax для
многоклассовой (позитив/негатив/нейтрально).Keras.js не поддерживает обучение моделей, поэтому BiLSTM загружается уже обученной. Для анализа тональности процесс выглядит так:
Float32Array или
Int32Array для подачи в модель.Постобработка:
Двунаправленные LSTM особенно эффективны на следующих задачах:
Использование BiLSTM значительно повышает точность по сравнению с обычными LSTM, особенно в языках с богатой морфологией и свободным порядком слов.