Long Short-Term Memory (LSTM) — это разновидность рекуррентных нейронных сетей (RNN), предназначенная для работы с последовательными данными. В отличие от обычных RNN, LSTM способны эффективно запоминать информацию на длительных временных интервалах за счёт специально организованных ячеек памяти и управляющих ворот. В библиотеке ConvNetJS реализованы LSTM-слои, которые позволяют строить модели для обработки текста, временных рядов и других последовательностей.
LSTM-слой в ConvNetJS состоит из нескольких ключевых компонентов:
Каждый из этих ворот реализуется с использованием весов, смещений и нелинейной активации (обычно сигмоида для ворот и tanh для ячейки состояния).
Для создания LSTM-слоя используется объект LSTMLayer.
Основные параметры:
var layer = new convnetjs.LSTMLayer({
input_dim: 10, // размерность входного вектора
hidden_dim: 20, // количество нейронов в скрытом состоянии
output_dim: 5 // размерность выхода слоя
});
input_dim — количество признаков во входной
последовательности.hidden_dim — размерность вектора скрытого состояния;
определяет объём памяти LSTM.output_dim — размерность выходного вектора; может
совпадать с hidden_dim для полных LSTM-сетей или быть
меньше для проекционных LSTM.Прямое распространение в LSTM выполняется через метод
forward, принимающий на вход объект Vol
(объект ConvNetJS, представляющий вектор или матрицу данных):
var output = layer.forward(inputVol);
На каждом временном шаге LSTM:
Все вычисления осуществляются в виде операций над объектами
Vol, что позволяет использовать GPU-ускорение при
необходимости.
Обучение LSTM в ConvNetJS реализуется через метод
backward. Он автоматически учитывает зависимости через
время и обновляет градиенты для всех весов ворот. Основные моменты:
Пример использования:
layer.backward(dout); // dout — градиенты по выходу слоя
Для корректной работы LSTM важно управлять состоянием ячейки между
последовательностями. В ConvNetJS предусмотрен метод
reset:
layer.reset(); // обнуляет состояния C и h
Это необходимо, когда начинается новая независимая последовательность данных, чтобы предыдущие состояния не влияли на текущую.
LSTM в ConvNetJS используются для:
Для построения более сложных моделей LSTM можно объединять несколько слоев последовательно, например:
var layer1 = new convnetjs.LSTMLayer({input_dim: 10, hidden_dim: 20});
var layer2 = new convnetjs.LSTMLayer({input_dim: 20, hidden_dim: 15, output_dim: 5});
При таком подходе выход первого слоя автоматически подается на вход второго, создавая многоуровневую LSTM-сеть.
Эффективность LSTM зависит от выбора:
hidden_dim: слишком малое значение приводит к потере
информации, слишком большое — к переобучению.ConvNetJS поддерживает контроль градиентов через
clip_gradients для предотвращения взрыва градиентов.
Vol, что
унифицирует обработку тензоров.input_dim.forward.