Объяснение схемы сети LSTM - PullRequest
1 голос
/ 09 марта 2019

Я работаю с 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? Я понятия не имею. Могут ли некоторые дать общий пример такого рода структуры сети?

Ответы [ 2 ]

1 голос
/ 09 марта 2019

По этим вопросам

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

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

enter image description here

В вашей модели входная форма определена как (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 голос
/ 09 марта 2019

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

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

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

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

Весам W1 и W2 необходимо иметь одно измерение, равноеРазмеры каждого временного шага x_t-20... для умножения матрицы на работу.Это измерение равно 1 в вашем случае, так как каждый из 20 входов представляет собой 1d вектор (или число), который умножается на W1.Тем не менее, мы можем установить второе измерение весов по своему усмотрению - 300 в вашем случае.Таким образом, W1 имеет размер 1x300 и умножается 20 раз, один раз для каждого временного шага.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...