Ячейка LSTM: входной, забывающий и выходной вентиль

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

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


Основные компоненты LSTM

Ячейка LSTM

Ячейка LSTM хранит состояние c_t, которое представляет собой внутреннюю память сети. Состояние ячейки обновляется с каждым шагом последовательности и регулируется через три вентиля:

  • Входной вентиль (input gate) управляет тем, какая часть новой информации будет добавлена в память.
  • Забывающий вентиль (forget gate) решает, какая часть предыдущей памяти будет сохранена или сброшена.
  • Выходной вентиль (output gate) контролирует, какая часть состояния ячейки поступит на выход сети.

Формально для временного шага (t) эти операции выглядят следующим образом:

  1. Забывающий вентиль: [ f_t = (W_f + b_f)]

  2. Входной вентиль: [ i_t = (W_i + b_i)] [ *t = (W_C + b_C)]

  3. Обновление состояния ячейки: [ C_t = f_t * C_{t-1} + i_t * _t]

  4. Выходной вентиль: [ o_t = (W_o + b_o)] [ h_t = o_t * (C_t)]

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


Реализация LSTM в Synaptic

В Synaptic LSTM реализован через класс Layer с предопределёнными связями и функциями активации. Конфигурация LSTM слоя включает количество входных нейронов, количество скрытых нейронов и тип используемой функции активации для вентилей.

Пример создания слоя LSTM:

const synaptic = require('synaptic');
const { Layer, Network } = synaptic;

let inputLayer = new Layer(5);       // 5 входных признаков
let lstmLayer = new Layer(10);       // 10 нейронов LSTM
let outputLayer = new Layer(2);      // 2 выхода

inputLayer.project(lstmLayer);
lstmLayer.project(outputLayer);

let myNetwork = new Network({
    input: inputLayer,
    hidden: [lstmLayer],
    output: outputLayer
});

Каждая LSTM ячейка в Synaptic автоматически включает управление всеми тремя вентилями. При обучении с помощью backpropagation through time (BPTT) веса этих вентилей обновляются, позволяя сети оптимально запоминать и забывать информацию.


Настройка вентилей

  • Забывающий вентиль (forget gate) часто инициализируют близко к единице, чтобы память ячейки на первых шагах сохранялась максимально долго.
  • Входной вентиль (input gate) регулирует «дозировку» новой информации. Малые значения входного вентиля позволяют постепенно накапливать знание.
  • Выходной вентиль (output gate) управляет экспозицией состояния ячейки наружу. Ограничение выхода предотвращает резкие изменения сигнала на последующих слоях.

В Synaptic нет прямой необходимости вручную задавать веса каждого вентиля, но возможно программно модифицировать веса через объект connections, если требуется кастомизация.


Работа с последовательными данными

LSTM слоями удобно обрабатывать временные ряды, текст и аудио. Каждый входной вектор подаётся поэтапно:

let sequence = [
    [0, 1, 0, 1, 0],
    [1, 0, 1, 0, 1],
    [0, 0, 1, 1, 0]
];

sequence.forEach(input => {
    myNetwork.activate(input);
});

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


Важные особенности LSTM в Synaptic

  • Автоматическое управление внутренним состоянием и вентилями.
  • Полная совместимость с другими слоями Synaptic, включая обычные Layer и Network.
  • Возможность обучения через стандартный метод train с функцией ошибки и оптимизацией градиентов.
  • Поддержка многослойных рекуррентных архитектур и глубоких LSTM сетей.
  • Гибкая интеграция с произвольными входными и выходными размерами.

Практические советы

  • Для стабилизации обучения рекомендуется нормализовать входные данные.
  • Инициализация забывающего вентиля близко к 1 уменьшает вероятность потери информации на длинных последовательностях.
  • При работе с больших временных рядов следует контролировать размер скрытого состояния LSTM, чтобы не переполнять память.
  • Использование функций активации tanh и sigmoid обеспечивает плавность градиентов и предотвращает взрывы или исчезновение сигналов.