LSTM (Long Short-Term Memory) — разновидность рекуррентных нейронных сетей (RNN), специально разработанная для работы с последовательными данными и устранения проблемы затухающего градиента, характерной для стандартных RNN. Ключевая особенность LSTM — наличие ячейки памяти, которая хранит информацию на протяжении длительных временных интервалов.
Ядро LSTM состоит из трёх основных компонентов:
Архитектура LSTM позволяет сети избирательно запоминать важные данные и игнорировать шумовые или устаревшие сведения, что делает её эффективной для обработки текстов, временных рядов, аудиосигналов и других последовательных данных.
Каждый временной шаг (t) в LSTM включает несколько последовательных операций:
Задача: определить, какую часть информации из предыдущей ячейки памяти (C_{t-1}) следует сохранить.
Формула:
[ f_t = (W_f + b_f)]
Задача: определить, какая новая информация будет добавлена в ячейку памяти.
[ i_t = (W_i + b_i)]
Одновременно создаётся кандидат для обновления состояния ячейки:
[ *t = (W_C + b_C)]
Обновление ячейки памяти выполняется по формуле:
[ C_t = f_t C_{t-1} + i_t _t]
Здесь () обозначает поэлементное умножение. Этот механизм позволяет сбалансировано сочетать старую память и новую информацию.
Задача: выбрать, какая информация из ячейки памяти будет передана на выход сети.
[ o_t = (W_o + b_o)]
Скрытое состояние на текущем шаге:
[ h_t = o_t (C_t)]
Скрытое состояние (h_t) используется как выход LSTM для текущего временного шага и как вход для следующего шага.
TensorFlow.js предоставляет готовые классы для работы с LSTM.
Основной строительный блок — слой tf.layers.lstm. Пример
создания LSTM слоя:
const model = tf.sequential();
model.add(tf.layers.lstm({
units: 50, // количество нейронов в LSTM
inputShape: [10, 1], // [длина последовательности, размерность входа]
returnSequences: true // возвращает последовательность скрытых состояний
}));
model.add(tf.layers.dense({units: 1})); // полносвязный слой для предсказания
[timesteps, features]true слой
возвращает всю последовательность скрытых состояний, при
false — только последнее состояниеКомпиляция модели:
model.compile({
optimizer: 'adam',
loss: 'meanSquaredError'
});
Обучение модели на данных:
await model.fit(trainX, trainY, {
epochs: 100,
batchSize: 32,
validationSplit: 0.2
});
glorotUniform, чтобы ускорить
сходимость.dropout и recurrentDropout.clipnorm).returnSequences) на промежуточных слоях, а на последнем —
только состояние.Эффективность LSTM заключается в способности удерживать контекст на длительных интервалах, что делает её незаменимой для задач, где последовательность информации критична.