Двунаправленные LSTM для анализа тональности

Основы LSTM

LSTM (Long Short-Term Memory) — это разновидность рекуррентных нейронных сетей (RNN), специально разработанная для решения проблемы исчезающего градиента при обучении на длинных последовательностях. Основной элемент LSTM — ячейка памяти, которая позволяет сети хранить информацию на протяжении большого числа временных шагов, контролируя её через три ключевых механизма: входной, выходной и забывающий гейты.

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

Двунаправленные LSTM

Двунаправленная LSTM (Bidirectional LSTM, BiLSTM) расширяет стандартный LSTM, добавляя второй LSTM, который обрабатывает последовательность в обратном порядке. Основная идея заключается в том, что контекст как предыдущих, так и последующих слов важен для задач анализа текста.

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

  • Позволяет учитывать как левый, так и правый контекст слова в последовательности.
  • Улучшает точность моделей анализа тональности, особенно на сложных текстах с двойным отрицанием или сарказмом.
  • В Keras.js реализуется путем объединения двух LSTM слоёв с противоположными направлениями и последующей конкатенации их выходов.

Подготовка данных для анализа тональности

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

  1. Токенизация текста — разбиение текста на слова или подсловные токены.
  2. Приведение слов к индексам — сопоставление каждому слову уникального числового идентификатора.
  3. Паддинг последовательностей — все последовательности должны иметь одинаковую длину для подачи в LSTM. В Keras.js используется метод padSequences.
  4. Разделение на обучающую и тестовую выборки — рекомендуется выделять 80% данных для обучения и 20% для тестирования.

Пример кода на 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 });

Построение модели BiLSTM в Keras.js

В Keras.js модель создаётся через экспорт из Keras (Python), так как Keras.js в основном используется для инференса в браузере, а не для обучения.

Пример структуры BiLSTM для анализа тональности:

  1. Входной слой: последовательность токенов фиксированной длины.
  2. Эмбеддинг слой: преобразует индексы слов в плотные векторы фиксированной размерности.
  3. Двунаправленный LSTM слой: два LSTM слоя с противоположным направлением.
  4. Полносвязный слой (Dense): применяется для классификации тональности.
  5. Выходной слой с активацией softmax или sigmoid: для бинарной или многоклассовой классификации.

Пример кода 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 для предобученных векторов.
  • Количество LSTM единиц (units): 64–256 в зависимости от объёма данных.
  • Слои Dropout и Recurrent Dropout: предотвращают переобучение, особенно на небольших корпусах.
  • Длина последовательности (input_length): оптимально выбирать среднюю длину предложений корпуса.
  • Функция активации выхода: sigmoid для бинарной тональности (позитив/негатив), softmax для многоклассовой (позитив/негатив/нейтрально).

Инференс в Keras.js

Keras.js не поддерживает обучение моделей, поэтому BiLSTM загружается уже обученной. Для анализа тональности процесс выглядит так:

  1. Подготовка текста (токенизация и паддинг).
  2. Преобразование в массив Float32Array или Int32Array для подачи в модель.
  3. Получение предсказания, которое возвращает вероятность каждого класса.

Постобработка:

  • Для бинарной классификации: порог 0.5 для определения позитивной/негативной тональности.
  • Для многоклассовой классификации: выбор класса с максимальной вероятностью.

Применение BiLSTM для анализа тональности

Двунаправленные LSTM особенно эффективны на следующих задачах:

  • Анализ отзывов пользователей, где порядок слов критичен для понимания смысла.
  • Обработка саркастических выражений, где контекст после ключевых слов меняет тональность.
  • Классификация новостных заголовков или твитов, где информация ограничена по длине, но важна последовательность слов.

Использование BiLSTM значительно повышает точность по сравнению с обычными LSTM, особенно в языках с богатой морфологией и свободным порядком слов.

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

  • Использовать Float32Array вместо обычных массивов JavaScript для входных данных.
  • Загружать модель с GPU-поддержкой, если браузер и устройство позволяют.
  • Минимизировать размер модели при необходимости — уменьшение числа LSTM единиц и слоев эмбеддинга без критической потери точности.