Использование RNN (LSTM) для прогнозирования векторов временных рядов (Theano)

19

У меня очень простая проблема, но я не могу найти правильный инструмент для ее решения.

У меня есть некоторая последовательность векторов одинаковой длины. Теперь я хотел бы обучить LSTM RNN на выборке из этих последовательностей, а затем сделать это для предсказания новой последовательности векторов длины на основе нескольких векторов праймирования .N

Я не могу найти простую реализацию, которая бы сделала это. Мой базовый язык - Python, но все, что не устанавливается в течение нескольких дней, сохранится.

Я пытался использовать Lasagne , но реализация RNN еще не готова, и он находится в отдельном пакете nntools . Во всяком случае, я попробовал последний, но я не могу понять, как его обучить, затем проиллюстрировать его некоторыми тестовыми векторами и позволить ему предсказать новые. Блоки - та же самая проблема - нет никакой документации для LSTM RNN, хотя кажется, что есть некоторые классы и функции, которые могли бы работать (например blocks.bricks.recurrent).

Есть несколько реализация РНН LSTM в Theano, как GroundHog, theano-rnn, theano_lstmи код для некоторых работ, но не из них имеют учебник или руководство , как сделать то , что я хочу.

Единственное полезное решение, которое я нашел, - это использование Pybrain. Но, к сожалению, ему не хватает возможностей Theano (в основном вычислений на GPU) и он потерян (нет новых функций и поддержки).

Кто-нибудь знает, где я могу найти то, что я прошу? Легко ли работать с RNN LSTM для прогнозирования последовательностей векторов?

Редактировать:

Я попробовал Керас так:

from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.layers.embeddings import Embedding
from keras.layers.recurrent import LSTM

model = Sequential()
model.add(Embedding(12, 256))
model.regularizers = []
model(LSTM(256, 128, activation='sigmoid', 
               inner_activation='hard_sigmoid'))
model.add(Dropout(0.5))
model.add(Dense(128, 12))
model.add(Activation('sigmoid'))
model.compile(loss='mean_squared_error', optimizer='rmsprop')

но я получаю эту ошибку при попытке подогнать ее model.fit(X_train, y_train, batch_size=16, nb_epoch=10)

IndexError: index 800 is out of bounds for axis 1 with size 12

while X_trainи y_trainявляются массивами массивов (длиной 12), например[[i for i in range(12)] for j in range(1000)]

kotrfa
источник
1
Зачем вам нужен RNN, если все ваши последовательности имеют одинаковую длину? Обучить статический входной вектор через ANN будет проще и быстрее.
itdxer
Векторы приходят из временных рядов. Значит РНН нужен?
Котрфа
1
RNN отлично подходит для задач, когда вы не знаете размер входного или выходного вектора. Например, вы хотите построить сеть, которая будет описывать на английском языке то, что вы видите на картинке, поэтому ваш ввод может быть статическим изображением, но вывод будет зависеть от того, что вы видите на рисунке. Другой пример, когда вы хотите получить перевод текста, там ваш ввод и вывод оба неизвестны.
itdxer
Спасибо за разъяснения. Поэтому нет причин использовать RNN в этой задаче. Ok.
Котрфа
2
Комментарий @ itdxer вводит в заблуждение. Даже если ваши данные везде одинаковы, использование RNN может быть полезным. RNN вводит предположение о данных, главным образом, что они имеют последовательный характер. Например, трансляция по оси времени изящно обрабатывается RNN, но не методами прямой связи - им нужно гораздо больше обучающих данных, чтобы понять это, и иметь гораздо больше параметров для оценки. Есть еще много случаев, когда ANN просто аварийно завершает работу и горит, если используется вместо RNN.
Bayerj

Ответы:

10

Я наконец нашел способ и задокументировал его в своем блоге здесь .

Существует сравнение нескольких фреймворков, а затем и одна реализация в Keras.

kotrfa
источник
5

Я бы предложил следующее:

0) Theano действительно мощный, но да, треска может быть трудной для начала

1) Я бы предложил вам проверить breze: https://github.com/breze-no-salt/breze/blob/master/notebooks/recurrent-networks/RNNs%20for%20Piano%20music.ipynb, что немного проще быть понятым и имеет модуль LSTM. Кроме того, интересным выбором является автоград в Гарварде, который выполняет автоматическую символьную дифференциацию функций numpy https://github.com/HIPS/autograd/blob/master/examples/lstm.py, и поэтому вы можете легко понять, что происходит.

2) Я фанат питона, но это мое личное предпочтение. Рассматривали ли вы использование Torch7 - наиболее удобной среды для нейронных сетей, которую также используют Google Deepmind и Facebook AI? Вы можете проверить это очень интересное сообщение в блоге о RNNs http://karpathy.github.io/2015/05/21/rnn-effectiveness/ . Кроме того, реализация LSTM доступна в репозитории github, в то время как альтернативой является пакет rnn https://github.com/Element-Research/rnn .

Яннис Ассаэль
источник
1
Я успешно использовал работу Карпати в течение последних нескольких недель. К сожалению, я не могу настроить его алгоритм для предсказания векторов, а не последовательностей символов. Это также потому, что я не очень знаком с Луа. Следовательно, я также пассивно использовал Torch7, но я не считаю его очень дружелюбным. Спасибо
kotrfa
SNN
У меня есть вектор из 12 элементов из измерения за каждую секунду. Я хотел бы натренировать сеть, затем проиллюстрировать ее, например, 5 векторами (длиной 12) и позволить ей предсказать следующий вектор. Ничего больше. Я обновил свой вопрос, попробовав использовать Keras.
Котрфа
для этого вы также можете использовать простую обратную связь, даже если ваши векторы взяты из временного ряда. Просто убедитесь, что количество последовательностей является постоянным.
Яннис Ассаэль
Из тех немногих статей, которые я прочитал, например, Карпати, я понимаю, что LSTM - лучший выбор для последовательностей, не так ли? Имеет ли простая прямая связь NN «особенность памяти»?
Котрфа
0

Я проверил LSTM, предсказывающий некоторую временную последовательность с Theano. Я обнаружил, что для некоторой плавной кривой это можно предсказать правильно. Однако для некоторой зигзагообразной кривой. Трудно предсказать. Подробная статья представлена ​​ниже: Прогнозирование временной последовательности с помощью LSTM

Прогнозируемый результат может быть показан следующим образом:

кленовый
источник