Używanie RNN (LSTM) do przewidywania wektorów szeregów czasowych (Theano)

19

Mam bardzo prosty problem, ale nie mogę znaleźć odpowiedniego narzędzia do jego rozwiązania.

Mam sekwencję wektorów o tej samej długości. Teraz chciałbym trenować LSTM RNN na próbce pociągu tych sekwencji, a następnie sprawić, by przewidział nową sekwencję wektorów o długości na podstawie kilku wektorów startowych .n

Nie mogę znaleźć prostej implementacji, która by to zrobiła. Moim podstawowym językiem jest Python, ale wszystko, co nie instaluje się przez kilka dni, będzie działać.

Próbowałem użyć Lasagne , ale implementacja RNN nie jest jeszcze gotowa i znajduje się w osobnym pakiecie nntools . W każdym razie wypróbowałem ten drugi, ale nie mogę wymyślić, jak go wyszkolić, a następnie zalać go kilkoma wektorami testowymi i pozwolić przewidzieć nowy. Bloki są tym samym problemem - brak dokumentacji dla LSTM RNN, chociaż wydaje się, że istnieją pewne klasy i funkcje, które mogłyby działać (np blocks.bricks.recurrent.).

Istnieje kilka realizacja RNN LSTM w Theano, jak GroundHog, theano-rnn, theano_lstmi kod dla niektórych gazetach, ale nie z nich ma poradnik lub przewodnik, jak to zrobić, co chcę.

Jedynym użytecznym rozwiązaniem, jakie znalazłem, było użycie Pybrain. Niestety nie ma w nim funkcji Theano (głównie obliczeń na GPU) i jest osierocony (brak nowych funkcji i wsparcia).

Czy ktoś wie, gdzie mogę znaleźć to, o co proszę? Łatwy w obsłudze z RNN LSTM do przewidywania sekwencji wektorów?

Edytować:

Próbowałem Keras w ten sposób:

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')

ale pojawia się ten błąd, gdy próbuję go dopasować 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

natomiast X_traini y_trainsą tablicami tablic (o długości 12), np[[i for i in range(12)] for j in range(1000)]

kotrfa
źródło
1
Dlaczego potrzebujesz numeru RNN, jeśli wszystkie sekwencje mają tę samą długość? Pociąg statyczny wektor wejściowy przez ANN byłby łatwiejszy i szybszy.
itdxer
Wektory pochodzą z szeregów czasowych. Więc chyba RNN jest konieczne?
kotrfa
1
RNN jest niezbędny do zadań, gdy nie znasz rozmiaru wektora wejściowego lub wyjściowego. Na przykład chcesz zbudować sieć, która będzie opisywać po angielsku to, co widzisz na obrazie, więc twój sygnał wejściowy może być statyczny, ale dane wyjściowe będą się różnić w zależności od tego, co możesz zobaczyć na obrazie. Kolejny przykład, kiedy chcesz uzyskać tłumaczenie tekstu, tam twoje dane wejściowe i wyjściowe są nieznane.
itdxer
Dziękuję za wyjaśnienie. Dlatego nie ma powodu, aby używać RNN w tym zadaniu. Dobrze.
kotrfa
2
Komentarz @ itdxer jest mylący. Nawet jeśli Twoje dane mają wszędzie tę samą długość, korzystanie z RNN może być korzystne. RNN wprowadza założenie danych, głównie że ma one charakter sekwencyjny. Na przykład translacja wzdłuż osi czasu jest obsługiwana z wdziękiem przez RNN, ale nie przez metody przesyłania dalej - potrzebują znacznie więcej danych szkoleniowych, aby to zrozumieć i mają wiele innych parametrów do oszacowania. Istnieje wiele innych przypadków, w których ANN po prostu się zawiesi i spali, jeśli zostanie użyty zamiast RNN.
bayerj

Odpowiedzi:

10

W końcu znalazłem sposób i udokumentowałem go na moim blogu tutaj .

Istnieje porównanie kilku frameworków, a następnie jednej implementacji w Keras.

kotrfa
źródło
5

Sugerowałbym następujące:

0) Theano jest naprawdę potężny, ale tak, czasami dorsz może być trudny

1) Proponuję Ci sprawdzić breze: https://github.com/breze-no-salt/breze/blob/master/notebooks/recurrent-networks/RNNs%20for%20Piano%20music.ipynb, który jest nieco łatwiejszy do zrozumienia i ma również moduł LSTM. Co więcej, ciekawym wyborem jest autograd autorstwa Harvards, który dokonuje automatycznego symbolicznego różnicowania funkcji numpy https://github.com/HIPS/autograd/blob/master/examples/lstm.py i dlatego łatwo można zrozumieć, co się dzieje.

2) Jestem fanem Pythona, ale to moje osobiste preferencje. Czy zastanawiałeś się, czy Torch7 jest najbardziej przyjazną dla użytkownika strukturą dla sieci neuronowych i jest również używany przez Google Deepmind i AI AI na Facebooku? Możesz sprawdzić ten bardzo interesujący post na blogu o RNN http://karpathy.github.io/2015/05/21/rnn-effectiveness/ . Ponadto implementacja LSTM jest dostępna w repozytorium github postu, a alternatywą jest pakiet rnn https://github.com/Element-Research/rnn .

Yannis Assael
źródło
1
Z powodzeniem korzystałem z pracy Karpathy przez ostatnie kilka tygodni. Niestety nie jestem w stanie dostosować jego algorytmu, aby przewidywać wektory, a nie sekwencje znaków. Jest tak również dlatego, że nie znam się na Lui. Dlatego też pasywnie używałem Torch7, ale tak naprawdę nie uważam tego za bardzo przyjazne. Dziękuję
kotrfa
S.N.N.
Mam wektor 12 elementów z pomiaru na każdą sekundę. Chciałbym wytrenować sieć, a następnie zalać ją np. 5 wektorami (o długości 12) i pozwolić przewidzieć następujący wektor. Nic więcej. Zaktualizowałem swoje pytanie, próbując użyć Keras.
kotrfa
możesz również użyć do tego prostego kanału informacyjnego, nawet jeśli wektory pochodzą z szeregów czasowych. Upewnij się tylko, że liczba sekwencji jest stała.
Yannis Assael
Z kilku artykułów, które przeczytałem, takich jak Karpathy, rozumiem, że LSTM jest najlepszym wyborem dla sekwencji, nie? Czy proste przesyłanie dalej NN ma „funkcję pamięci”?
kotrfa
0

Testowałem LSTM przewidując pewną sekwencję czasową z Theano. Odkryłem, że dla jakiejś gładkiej krzywej można to poprawnie przewidzieć. Jednak dla niektórych krzywych zygzakowatych. Trudno przewidzieć. Szczegółowy artykuł jest następujący: Przewidywanie sekwencji czasowej za pomocą LSTM

Przewidywany wynik można przedstawić w następujący sposób:

klon
źródło