Понимание LSTM сети

Вопрос или проблема

Привет, я работал над проектом по созданию аппаратной реализации сети LSTM для обнаружения аномалий. Я пытался понять общую структуру сети lstm для прогнозирования одновариантных временных рядов. Я работал над созданием слоя, который в Keras будет реализован как

self.model.add(LSTM(units=num_neurons, return_sequences=False, batch_input_shape=(1, b - 1, 1), stateful=True)).

где b — это фактор обратного запоминания

Я основывался на общей модели ячейки lstm, где она принимает входные значения x_t, c_t-1 и h_t-1. Я думаю, что запутался во всех этих терминах и надеялся, что кто-то сможет прояснить ситуацию и помочь мне подтвердить мою мысленную модель того, как это должно работать.

Начну с num_neurons в коде, я предполагаю, что это количество ячеек lstm в слое. Я предполагаю, что вход для каждой из этих ячеек для термина x_t — это один и тот же вектор, который является вектором [x, x-1, .., x-b]. Честно говоря, я не понимаю, что означают c_t-1 и h_t-1. У меня было две возможные идеи. Идея 1 заключается в том, что каждая единица lstm в одном слое передает данные следующей. Идея 2 заключается в том, что каждая lstm в одном слое вообще не связаны, а слой повторяется несколько раз, то есть выход каждой ячейки возвращается в саму себя несколько раз. В любом случае, я не знаю, каковы базовые значения h и c.

Я нашел одно видео на youtube от StatQuest, которое на самом деле имеет полный смысл, https://www.youtube.com/watch?v=YCzL96nL7j0. Описанная сеть lstm — это серия связанных ячеек LSTM, каждая из которых принимает по одному значению из вектора [x_t, x_t-1, … x_t-b], и это имеет для меня полный смысл. Но затем я не понимаю, как в keras может быть разное количество нейронов и различные размеры входного вектора.

Я нарисовал это изображение модели, которое, как я думаю, демонстрирует, как работает lstm. Мог бы кто-то подтвердить, что это правильный путь или что это совершенно неверно?
LSTM drawing

Я не знаю, каковы базовые значения h и c.

Начальные значения для состояния ячейки и предыдущего выхода обычно равны 0.

Если вы запутались в том, что на самом деле представляют собой $c$ и $h$, то $h_{t-1}$ представляет собой выход предыдущего нейрона, который как бы является его кратковременной памятью. А $c_{t-1}$ представляет собой состояние ячейки предыдущего нейрона, которое как бы является его долговременной памятью, отсюда и название: длинная краткосрочная память.

Я не понимаю, как в keras может быть разное количество нейронов и разные размеры входного вектора.

Я думаю, вы путаете временные шаги с входами. Имейте в виду, что значения, такие как $x_t$, представляют собой целые векторы, которые передаются каждому нейрону на этом временном шаге. Это означает, что вы можете передавать входной вектор размером 26 в 16 нейронов LSTM.

PS: Странно называть “входной вектор” вектором всех входных векторов на каждом временном шаге, что, вероятно, и стало причиной вашей путаницы. Входной вектор — это вектор каждого входа на определенном временном шаге.

Что касается диаграммы…

Она почти правильная. Когда вы рисовали линии, соединяющие вход с каждым нейроном, я надеюсь, вы понимаете, что эти линии представляют собой целые векторы входных данных, которые передаются каждому нейрону. Кроме того, вы, возможно, попались на заблуждение, что на каждом временном шаге каждый нейрон LSTM обновляется независимо. Как я вижу, вы обвели каждый нейрон LSTM рамкой. Это неверно. Так же, как целый входной вектор передается каждому нейрону LSTM, выход предыдущего нейрона передается в каждый нейрон LSTM. Это означает, что выход предыдущего нейрона в верхнем нейроне LSTM может повлиять на выход нижнего нейрона LSTM на следующем временном шаге.

Ответ или решение

Понимание LSTM-сети для обнаружения аномалий

Введение в LSTM-архитектуру

Долгая краткосрочная память (LSTM) является дополнением к традиционным рекуррентным нейронным сетям (RNN), предназначенным для обработки последовательных данных, таких как временные ряды. Она была специально разработана для преодоления проблем с "размыванием" и "взрывом" градиентов, что позволяет LSTM эффективно запоминать информацию на длительных интервалах времени.

Структура LSTM

Каждая LSTM ячейка структурирована следующим образом:

  1. Входное состояние (x_t): На каждом временном шаге (t) LSTM получает на вход вектор признаков, который может состоять из текущего значения временного ряда и (или) предшествующих значений.
  2. Состояния памяти:
    • h_t: Это скрытое состояние (output), которое хранит краткосрочную память ячейки и передается на следующий временной шаг.
    • c_t: Это состояние ячейки, представляющее длинную память, используемое для хранения информации на более длительных временных интервалах.

Каждая ячейка, таким образом, обновляется с учетом предыдущих состояний (h_t-1 и c_t-1), что позволяет учитывать контекст появляющихся данных.

Необходимые параметры для LSTM в Keras

В вашей реализации на Keras код

self.model.add(LSTM(units=num_neurons, return_sequences=False, batch_input_shape=(1, b - 1, 1), stateful=True))

означает следующее:

  • units=num_neurons: Здесь num_neurons – это количество LSTM ячеек в слое. Каждая ячейка будет обрабатывать входящие данные.
  • return_sequences=False: Это указывает на то, что мы хотим получить только финальное состояние после обработки всей последовательности, а не список выходов для всех временных шагов.
  • batch_input_shape=(1, b – 1, 1): Этот параметр задает форму входного тензора, где 1 – это размер мини-батча, b - 1 – количество временных шагов (lookback), и 1 – число признаков на временной шаг (например, одномерный временной ряд).

Описание терминов и их значения

Ваша путаница относительно параметров h_t и c_t может быть устранена следующими пояснениями:

  • h_t-1: Предыдущее скрытое состояние LSTM в момент времени (t-1). Оно отражает краткосрочную память и используется для принятия решения о текущем состоянии.

  • c_t-1: Предыдущее состояние ячейки, которое хранит важную информацию на протяжении более длительных периодов времени. Оно используется, чтобы решать, какую информацию сохранить или забыть.

Взаимодействие между ячейками LSTM

Важно отметить, что в LSTM-сетях все ячейки в пределах одного слоя работают совместно и взаимосвязаны. Когда вы передаете вектор входных данных на текущий временной шаг (x_t), он будет распределен между всеми LSTM ячейками текущего слоя. Текущий выход принимается из каждой ячейки, и следующим временным шагом эти выходы (h_t) также становятся входами для всех LSTM ячеек.

Начальные условия для состояний h и c

Как правило, начальные значения h и c инициализируются нулями, что позволяет LSTM правильно стартовать при первой обработке последовательности.

Заключение

Таким образом, ваш подход к пониманию LSTM структуры и её функционирования в контексте Keras требует точно соблюдаемых терминов и взаимосвязей. Убедитесь, что вы учитываете все важные понятия и их взаимосвязи при реализации вашей архитектуры для детекции аномалий, что обеспечит корректность вашей модели и её работоспособность. Если есть необходимость в доработке визуализации, постарайтесь донести, что каждый LSTM требует полной информации для работы.

Оцените материал
Добавить комментарий

Капча загружается...