Usando RNN (LSTM) para predecir los vectores de series de tiempo (Theano)

19

Tengo un problema muy simple pero no puedo encontrar una herramienta adecuada para resolverlo.

Tengo una secuencia de vectores de la misma longitud. Ahora me gustaría entrenar LSTM RNN en la muestra de tren de estas secuencias y luego hacer que prediga una nueva secuencia de vectores de longitud función de varios vectores de cebado .norte

No puedo encontrar una implementación simple que haga esto. Mi lenguaje base es Python, pero cualquier cosa que no se instale durante días se mantendrá.

Intenté usar Lasagne , pero la implementación de RNN aún no está lista y está en paquetes separados de herramientas . De todos modos, probé el último pero no puedo entender cómo entrenarlo, luego lo preparé con algunos vectores de prueba y dejé que prediga los nuevos. Los bloques son el mismo problema: no hay documentación disponible para LSTM RNN, aunque parece que hay algunas clases y funciones que podrían funcionar (por ejemplo blocks.bricks.recurrent).

Hay varios implementación de RNN LSTM en Teano, como GroundHog, theano-rnn, theano_lstmy el código para algunos papeles, pero no de ellos han tutorial o guía de cómo hacer lo que quiero.

La única solución utilizable que encontré fue usar Pybrain. Pero desafortunadamente carece de las características de Theano (principalmente el cálculo de GPU) y está huérfano (no hay nuevas características y soporte).

¿Alguien sabe dónde puedo encontrar lo que estoy pidiendo? ¿Fácil de trabajar con RNN LSTM para predecir secuencias de vectores?

Editar:

Intenté Keras así:

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

pero recibo este error cuando intento ajustarlo 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_trainy y_trainson matrices de matrices (de longitud 12), p. ej.[[i for i in range(12)] for j in range(1000)]

kotrfa
fuente
1
¿Por qué necesitas RNN si todas tus secuencias tienen la misma longitud? Entrenar el vector de entrada estático a través de ANN sería más fácil y rápido.
itdxer
Los vectores provienen de series de tiempo. ¿Entonces RNN es necesario, supongo?
kotrfa
1
RNN es ideal para tareas cuando no conoce el tamaño del vector de entrada o salida. Por ejemplo, desea construir una red que describirá en inglés lo que puede ver en la imagen, por lo que su entrada puede ser una imagen estática, pero la salida variará dependiendo de lo que pueda ver en la imagen. Otro ejemplo cuando desea obtener traducción de texto, allí su entrada y salida son desconocidas.
itdxer
Gracias por la aclaración. Entonces no hay razón para usar RNN en esta tarea. Okay.
kotrfa
2
El comentario de @ itdxer es engañoso. Incluso si sus datos tienen la misma longitud en todas partes, usar un RNN puede ser beneficioso. Un RNN introduce una suposición de los datos, principalmente que es de naturaleza secuencial. Por ejemplo, la traducción a lo largo del eje del tiempo es manejada con gracia por los RNN, pero no por métodos de retroalimentación: necesitan mucha más información de entrenamiento para darse cuenta de eso y tienen muchos más parámetros para estimar. Hay muchos más casos en los que un ANN simplemente se bloqueará y quemará si se usa en lugar de un RNN.
bayerj

Respuestas:

10

Finalmente encontré un camino y lo documenté en mi blog aquí .

Hay una comparación de varios marcos y luego también una implementación en Keras.

kotrfa
fuente
5

Sugeriría lo siguiente:

0) Theano es realmente poderoso, pero sí, el bacalao puede ser difícil a veces para empezar

1) Te sugiero que eches un vistazo a breze: https://github.com/breze-no-salt/breze/blob/master/notebooks/recurrent-networks/RNNs%20for%20Piano%20music.ipynb, que es un poco más fácil para ser entendido y tiene un módulo LSTM también. Además, una opción interesante es autograd by Harvards, que hace una diferenciación simbólica automática de funciones numpy https://github.com/HIPS/autograd/blob/master/examples/lstm.py y, por lo tanto, puede comprender fácilmente lo que está sucediendo.

2) Soy fanático de Python, pero esta es mi preferencia personal. ¿Has considerado usar Torch7 es el marco más fácil de usar para redes neuronales y también lo usan Google Deepmind y Facebook AI? Puede consultar esta publicación de blog muy interesante sobre RNNs http://karpathy.github.io/2015/05/21/rnn-effectiveness/ . Además, una implementación de LSTM está disponible en el repositorio de github de la publicación, mientras que una alternativa es el paquete rnn https://github.com/Element-Research/rnn .

Yannis Assael
fuente
1
He usado con éxito el trabajo de Karpathy durante las últimas semanas. Desafortunadamente, no puedo modificar su algoritmo para hacer predicciones de vectores y no secuencias de caracteres. También es porque no estoy muy familiarizado con Lua. Por lo tanto, también he usado Torch7 pasivamente , pero realmente no me parece muy amigable. Gracias
kotrfa
Snortenorte
Tengo un vector de 12 elementos de medición por cada segundo. Me gustaría entrenar la red, luego prepararla, por ejemplo, con 5 vectores (de longitud 12) y dejar que prediga el siguiente vector. Nada mas. He actualizado mi pregunta con mi intento de usar Keras.
kotrfa
También podría usar una alimentación simple para eso incluso si sus vectores provienen de una serie temporal. Solo asegúrate de que el número de secuencias sea constante.
Yannis Assael
De los pocos artículos que he leído, como los de Karpathy, entiendo que el LSTM es la mejor opción para secuencias, ¿no? ¿El avance simple NN tiene la "función de memoria"?
kotrfa
0

He probado LSTM prediciendo alguna secuencia de tiempo con Theano. Descubrí que para una curva suave, se puede predecir correctamente. Sin embargo para alguna curva en zigzag. Es difícil de predecir. El artículo detallado es el siguiente: Predecir secuencia de tiempo con LSTM

El resultado previsto se puede mostrar de la siguiente manera:

arce
fuente