Слои для работы с последовательностями: SimpleRNN, LSTM, GRU

Keras.js предоставляет возможность запускать модели, созданные с помощью Keras, прямо в браузере на языке JavaScript. Особое внимание уделяется работе с последовательными данными, такими как временные ряды, текстовые данные или сигналы. Для этого используются специализированные рекуррентные слои: SimpleRNN, LSTM и GRU.


SimpleRNN

SimpleRNN — базовый рекуррентный слой, реализующий стандартную рекуррентную нейронную сеть. Он обрабатывает последовательность по шагам времени, поддерживая внутреннее скрытое состояние.

Основные параметры:

  • units — число нейронов в скрытом состоянии.
  • activation — функция активации, применяемая к выходу слоя (tanh по умолчанию).
  • use_bias — использование смещения (по умолчанию true).
  • return_sequences — если true, слой возвращает полную последовательность выходов, а не только последний шаг.
  • return_state — возвращает скрытое состояние последнего временного шага.
  • go_backwards — обработка последовательности в обратном порядке.

Пример использования в Keras.js:

const modelConfig = {
  layers: [
    {
      type: 'simpleRNN',
      config: {
        units: 50,
        activation: 'tanh',
        returnSequences: true
      }
    }
  ]
};

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

  • Быстро вычисляется, но подвержен проблеме затухающего градиента на длинных последовательностях.
  • Подходит для коротких последовательностей или как часть более сложной модели.

LSTM (Long Short-Term Memory)

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

Основные параметры:

  • units — число нейронов в скрытом состоянии.
  • activation — функция активации для выхода (tanh по умолчанию).
  • recurrent_activation — функция активации для рекуррентных ворот (sigmoid по умолчанию).
  • use_bias — использование смещения.
  • return_sequences — возвращает всю последовательность выходов.
  • return_state — возвращает скрытое и ячейковое состояния.
  • go_backwards — обработка последовательности в обратном порядке.
  • unit_forget_bias — добавление единицы к забывающему вороту, улучшает обучение.

Структура LSTM:

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

Пример конфигурации для Keras.js:

const lstmLayer = {
  type: 'lstm',
  config: {
    units: 100,
    activation: 'tanh',
    recurrentActivation: 'sigmoid',
    returnSequences: true
  }
};

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

  • Эффективен для длинных последовательностей.
  • Более сложная архитектура требует больше вычислительных ресурсов.
  • Снижает эффект затухающих градиентов по сравнению с SimpleRNN.

GRU (Gated Recurrent Unit)

GRU — упрощённая версия LSTM с объединёнными входными и забывающими воротами, что уменьшает число параметров и ускоряет обучение.

Основные параметры:

  • units — число нейронов в скрытом состоянии.
  • activation — функция активации для выхода.
  • recurrent_activation — функция активации для ворот.
  • use_bias — использование смещения.
  • return_sequences — возвращение полной последовательности выходов.
  • return_state — возвращает скрытое состояние последнего временного шага.
  • go_backwards — обработка последовательности в обратном порядке.

Пример конфигурации GRU в Keras.js:

const gruLayer = {
  type: 'gru',
  config: {
    units: 64,
    activation: 'tanh',
    recurrentActivation: 'sigmoid',
    returnSequences: true
  }
};

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

  • Меньше параметров по сравнению с LSTM.
  • Эффективен на коротких и средних последовательностях.
  • Часто достигает сопоставимых с LSTM результатов при меньших вычислительных затратах.

Отличия и рекомендации

Слой Плюсы Минусы Применение
SimpleRNN Простая реализация, быстро обучается Затухающий градиент, слаб для длинных последовательностей Короткие последовательности, тестовые модели
LSTM Сохраняет долгосрочные зависимости Сложнее, больше вычислений Длинные последовательности, тексты, временные ряды
GRU Быстрее LSTM, меньше параметров Иногда хуже LSTM на очень длинных данных Средние и длинные последовательности, быстрые модели

Особенности интеграции в Keras.js

  1. Импорт модели из Keras: модель в Python/Keras сохраняется в формате JSON и весах HDF5. Keras.js загружает JSON-конфиг и бинарные веса для выполнения в браузере.
  2. Поддержка рекуррентных слоев: все основные рекуррентные слои (SimpleRNN, LSTM, GRU) можно использовать, включая их ключевые параметры (return_sequences, return_state, go_backwards).
  3. Производительность: при работе в браузере предпочтительно использовать GRU для ускорения вычислений, LSTM для сложных последовательностей, SimpleRNN только для демонстрационных или простых задач.
  4. Построение модели: Keras.js не поддерживает динамическое создание моделей на лету, все слои конфигурируются заранее через JSON.

Эти рекуррентные слои являются фундаментом работы с последовательными данными в Keras.js и позволяют переносить сложные модели нейронных сетей в браузер с минимальными изменениями.