Объяснение схемы сети LSTM

#python #keras #lstm

#python #keras #lstm

Вопрос:

Я работаю с LSTM для моей задачи прогнозирования временных рядов. У меня есть следующая сеть:

 model = Sequential()
model.add(LSTM(units_size=300, activation=activation, input_shape=(20, 1)))
model.add(Dense(20))
  

Моя проблема прогнозирования состоит в том, чтобы спрогнозировать следующие 20 временных шагов, оглядываясь назад на последние 20 временных шагов. Итак, для каждой итерации у меня есть форма ввода типа (x_t-20 … x_t) и прогнозируется следующая (x_t 1 … x_t 20). Для скрытого уровня я использую 300 скрытых блоков.

Поскольку LSTM отличается от простой нейронной сети с прямой связью, я не могу понять, как эти 300 скрытых блоков использовались для ячеек LSTM и как получается результат. Есть ли 20 ячеек LSTM и 300 единиц для каждой ячейки? Как генерируется вывод из этих ячеек? Как я описал выше, у меня есть 20 временных шагов для прогнозирования, и все ли эти шаги сгенерированы из последних ячеек LSTM? Я понятия не имею. Может ли кто-нибудь вообще привести пример схемы такого рода сетевой структуры?

Ответ №1:

Что касается этих вопросов,

Я не могу понять, как эти 300 скрытых блоков использовались для ячеек LSTM и как получается результат. Есть ли 20 ячеек LSTM и 300 единиц для каждой ячейки? Как генерируется вывод из этих ячеек?

Проще рассматривать уровень LSTM, который вы определили, как единый блок. Эта схема в значительной степени заимствована из книги Франсуа Шоле «Глубокое обучение с помощью Python»:

введите описание изображения здесь

В вашей модели форма ввода определяется как (20,1), поэтому у вас есть 20 временных шагов размером 1. На мгновение рассмотрим, что выходной плотный слой отсутствует.

 model = Sequential()
model.add(LSTM(300, input_shape=(20,1)))
model.summary()
  

lstm_7 (LSTM) (Нет, 300) 362400

Форма вывода уровня LSTM равна 300, что означает, что выходные данные имеют размер 300.

 output = model.predict(np.zeros((1, 20, 1)))
print(output.shape)
  

(1, 300)

ввод (1,20,1) => размер пакета = 1, временные шаги = 20, размер входных функций = 1.

вывод (1, 300) => размер пакета = 1, размер выходного элемента = 300

Keras повторно запускал LSTM в течение 20 временных шагов и сгенерировал выходные данные размером (300). На приведенной выше схеме это вывод t 19.

Теперь, если вы добавите плотный слой после LSTM, результат будет иметь размер 20, что является простым.

Комментарии:

1. как я понимаю из рисунка, для каждого входа есть выход. Но в моем случае в первых 19 ячейках LSTM нет выходных данных, а все 300 выходных данных выводятся из последней 20-й ячейки LSTM. Прав ли я в этом понимании?

2. Да, только конечный результат, поскольку return_sequences=False.

Ответ №2:

Чтобы понять LSTM, я бы рекомендовал сначала потратить несколько минут на понимание «простых ванильных» RNN, поскольку LSTM — это просто более сложная версия этого. Я попытаюсь описать, что происходит в вашей сети, если бы это был базовый RNN.

Вы тренируете один набор весов, которые повторно используются для каждого временного шага ( t-20,...,t ). Первый вес (скажем W1 ) предназначен для входных данных. Один за другим, каждый из x_t-20,...,x_t умножается на W1 , затем применяется нелинейная функция активации — такая же, как при любом прямом переходе NN.

Разница с RNNS заключается в наличии отдельного «состояния» (примечание: не обученного веса), которое может начинаться случайным образом или с нуля и переносит информацию о вашей последовательности по временным шагам. Для состояния есть другой вес ( W2 ). Итак, начиная с первого временного шага t-20 , начальное состояние умножается на W2 и применяется функция активации.

Таким образом, в timestep t-20 у нас есть выходные данные из W1 (по входам) и W2 (по состоянию). Мы можем комбинировать эти выходные данные на каждом временном шаге и использовать это для генерации состояния для перехода к следующему временному шагу, т. Е. t-19 . Поскольку состояние должно вычисляться на каждом временном шаге и передаваться следующему, эти вычисления должны выполняться последовательно, начиная с t-20. Чтобы сгенерировать желаемый результат, мы можем использовать каждое состояние вывода на всех временных этапах — или использовать вывод только на последнем временном шаге. Как return_sequences=False по умолчанию в Keras, вы используете выходные данные только на последнем временном шаге, который затем переходит в ваш плотный слой.

Веса W1 и W2 должны иметь одно измерение, равное измерениям каждого входного временного шага x_t-20... , чтобы матричное умножение работало. В вашем случае это измерение равно 1, поскольку каждый из 20 входных данных представляет собой одномерный вектор (или число), который умножается на W1 . Однако мы вольны устанавливать второе измерение весов по своему усмотрению — 300 в вашем случае. So W1 имеет размер 1×300 и умножается 20 раз, по одному разу за каждый временной шаг.

Эта лекция проведет вас через базовую блок-схему RNNS, которую я описал выше, вплоть до более сложных элементов, которые вы можете пропустить. Это известное объяснение LSTM, если вы хотите совершить скачок от базовых RNN к LSTM, что вам, возможно, не понадобится делать — есть просто более сложные веса и состояния.

Комментарии:

1. Спасибо за объяснение. Я не использовал здесь return_sequence=True. Таким образом, по умолчанию это значение равно false. И в этом случае, как я понимаю, я получаю все 300 выходных данных с последнего временного шага. И для 300 устройств, подключенных к последним 20, вывод полностью подключен. Я прав? и, как я понимаю, если я поставлю return_sequence=True, в этом случае я должен получать выходные данные из LSTM для каждого временного шага ввода. Означает ли это, что я получу 300 единиц из каждой ячейки LSTM?