Usando RNN (LSTM) para prever os vetores de séries temporais (Theano)

19

Eu tenho um problema muito simples, mas não consigo encontrar a ferramenta certa para resolvê-lo.

Eu tenho uma sequência de vetores do mesmo comprimento. Agora eu gostaria de treinar o LSTM RNN na amostra de trem dessas seqüências e, em seguida, prever a nova sequência de vetores de comprimento n base em vários vetores priming .

Não consigo encontrar uma implementação simples que faria isso. Minha linguagem base é Python, mas tudo o que não for instalado por dias será válido.

Tentei usar o Lasagne , mas a implementação do RNN ainda não está pronta e está no pacote nntools . Enfim, eu tentei o último, mas não consigo descobrir como treiná-lo, depois apronte-o com alguns vetores de teste e deixe prever o (s) novo (s). Os blocos são o mesmo problema - nenhuma documentação está disponível para o LSTM RNN, embora pareça que existem algumas classes e funções que poderiam funcionar (por exemplo blocks.bricks.recurrent).

Existem vários implementação de RNN LSTM em Teano, como GroundHog, theano-rnn, theano_lstme código para alguns papéis, mas não desses têm tutorial ou orientar como fazer o que eu quero.

A única solução utilizável que encontrei foi usar o Pybrain. Infelizmente, porém, ele não possui os recursos do Theano (principalmente computação da GPU) e fica órfão (sem novos recursos e suporte).

Alguém sabe onde eu poderia encontrar o que estou pedindo? Fácil de trabalhar com o RNN LSTM para prever sequências de vetores?

Editar:

Eu tentei Keras assim:

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

mas estou recebendo esse erro ao tentar ajustá-lo 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_traine y_trainsão matrizes de matrizes (de comprimento 12), por exemplo[[i for i in range(12)] for j in range(1000)]

kotrfa
fonte
1
Por que você precisa da RNN se todas as suas seqüências têm o mesmo comprimento? Treinar o vetor de entrada estática via ANN seria mais fácil e rápido.
itdxer
Os vetores vêm de séries temporais. Então RNN é necessário, eu acho?
kotrfa
1
O RNN é um grande prazer para tarefas quando você não sabe o tamanho do vetor de entrada ou saída. Por exemplo, você deseja criar uma rede que descreva em inglês o que você pode ver na imagem, para que sua entrada possa ser uma imagem estática, mas a saída variará dependendo do que você pode ver na imagem. Outro exemplo quando você deseja obter a tradução de texto, sua entrada e saída são desconhecidas.
itdxer
Obrigado pelo esclarecimento. Portanto, não há razão para usar o RNN nesta tarefa. Está bem.
kotrfa
2
O comentário do @ itdxer é enganador. Mesmo que seus dados tenham o mesmo comprimento em qualquer lugar, o uso de uma RNN pode ser benéfico. Uma RNN introduz uma suposição dos dados, principalmente de natureza sequencial. Por exemplo, a tradução ao longo do eixo do tempo é realizada com cuidado pelos RNNs, mas não pelos métodos de avanço - eles precisam de muito mais dados de treinamento para perceber isso e têm muito mais parâmetros para estimar. Existem muitos outros casos em que uma RNA pode travar e queimar se usada em vez de uma RNN.
bayerj

Respostas:

10

Finalmente encontrei um caminho e o documentei no meu blog aqui .

Há comparação de várias estruturas e, em seguida, também uma implementação no Keras.

kotrfa
fonte
5

Eu sugeriria o seguinte:

0) Theano é realmente poderoso, mas sim, o bacalhau pode ser difícil às vezes para começar

1) Eu sugiro que você verifique o breze: https://github.com/breze-no-salt/breze/blob/master/notebooks/recurrent-networks/RNNs%20for%20Piano%20music.ipynb, que é um pouco mais fácil para ser entendido e possui também um módulo LSTM. Além disso, uma opção interessante é o autograd de Harvards, que faz a diferenciação simbólica automática das funções numpy https://github.com/HIPS/autograd/blob/master/examples/lstm.py e, portanto, você pode entender facilmente o que está acontecendo.

2) Sou fã de python, mas essa é minha preferência pessoal. Você considerou o uso do Torch7 a estrutura mais amigável para redes neurais e também é usado pelo Google Deepmind e pelo Facebook AI? Você pode conferir esta postagem do blog muito interessante sobre RNNs http://karpathy.github.io/2015/05/21/rnn-effectiveness/ . Além disso, uma implementação LSTM está disponível no repositório do post do github, enquanto uma alternativa é o pacote rnn https://github.com/Element-Research/rnn .

Yannis Assael
fonte
1
Eu tenho usado com sucesso o trabalho de Karpathy nas últimas semanas. Infelizmente, não consigo ajustar o algoritmo dele para fazer predições de vetores e não seqüências de caracteres. Também é porque não estou muito familiarizado com Lua. Por isso, usei passivamente o Torch7 também, mas não o acho muito amigável. Obrigado
kotrfa
SNN
Eu tenho um vetor de 12 elementos de medição para cada segundo. Gostaria de treinar a rede e, em seguida, imprima-a, por exemplo, por 5 vetores (de comprimento 12) e deixe prever o seguinte vetor. Nada mais. Atualizei minha pergunta com minha tentativa de usar o Keras.
kotrfa
você também pode usar um feed simples, mesmo que seus vetores venham de uma série temporal. Apenas certifique-se de que o número de sequências seja constante.
precisa
Dos poucos artigos que li, como os de Karpathy, entendo que o LSTM é a melhor escolha para sequências, não? O avanço simples de alimentação NN tem o "recurso de memória"?
kotrfa
0

Testei o LSTM prevendo uma sequência de tempo com o Theano. Descobri que, para alguma curva suave, ela pode ser prevista adequadamente. No entanto, para alguma curva em zigue-zague. É difícil de prever. O artigo detalhado é o seguinte: Prever Sequência de Tempo com LSTM

O resultado previsto pode ser mostrado da seguinte forma:

bordo
fonte