#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?