El mejor uso de LSTM para la predicción de eventos dentro de la secuencia


9

Suponga la siguiente secuencia unidimensional:

A, B, C, Z, B, B, #, C, C, C, V, $, W, A, % ...

Las letras A, B, C, ..aquí representan eventos 'ordinarios'.

Los símbolos #, $, %, ...aquí representan eventos 'especiales'

El espacio temporal entre todos los eventos no es uniforme (cualquier cosa, desde segundos hasta días), aunque cuanto más en el pasado un evento es menos probable es que influya en eventos futuros. Idealmente, puedo tener en cuenta estos retrasos explícitamente.

Hay del orden de 10000 tipos de eventos ordinarios y del orden de 100 tipos de eventos especiales. La cantidad de eventos ordinarios que preceden a un evento especial varía pero es poco probable que sea más de 100-300.

Básicamente, estoy interesado en buscar patrones en la secuencia de eventos ordinarios que terminen siendo predictivos para los eventos especiales.

Ahora puede abordar esto de diferentes maneras: creando vectores de características + clasificación estándar, aprendizaje de reglas de asociación, HMM, etc.

En este caso, tengo curiosidad por saber cómo encajaría mejor una red basada en LSTM. Sencillo sería hacer algo como la charla de Karparthy y predecir el próximo evento dado un historial. Luego para una nueva secuencia

C, Z, Q, V, V, ... , V, W

Puede ejecutarlo a través del modelo y ver qué evento especial es más probable que ocurra después. Pero no se siente del todo bien.

Dado que este es un problema de clasificación temporal, parece que lo correcto es usar la Clasificación Temporal Connectionist como lo describe Alex Graves .

Sin embargo, antes de invertir demasiado en este momento, estoy buscando algo más fácil y rápido para experimentar para tener una idea de qué tan bien encajarían los LSTM aquí. Tensorflow verá un ejemplo de CTC en algún momento, pero aún no.

Entonces mis (sub) preguntas son:

  1. Dado el problema anterior y me gustaría experimentar con LSTM, vale la pena probar el enfoque de tipo char-rnn, ¿debería morder la bala y familiarizarme con CTC, o hay un mejor lugar para comenzar?
  2. ¿Cómo incorporaría explícitamente la información de temporización entre eventos? El uso de un reloj fijo con eventos no operativos obviamente funciona, pero parece feo.
  3. Suponiendo que logré entrenar un LSTM, ¿hay alguna manera de inspeccionar el modelo para ver qué tipo de 'motivos' de eventos ha recogido? (es decir, análoga a los filtros en convnets)

Cualquier código de muestra (se prefiere Python) siempre es útil.

Editar: solo para agregar que hay algo de ruido en la secuencia. Algunos eventos pueden ignorarse con seguridad, pero exactamente cuáles no siempre es posible decir por adelantado. Entonces, idealmente, el modelo (y los motivos derivados de él) es robusto en contra de esto.


¿Qué tipo de conjunto de datos es este?
pir

@felbo: ​​No puedo decir explícitamente desafortunadamente, pero sus datos del hardware, no financieros / ventas / anuncios / ..
dgorissen

Okay. En realidad, la codificación de uno en caliente (en mi respuesta) podría ser problemática si tienes ~ 10k tipos de eventos. Tal vez podría hacer algo en la línea de word2vec para que solo tenga ~ 300 dimensiones de entrada. Del mismo modo, es probable que sea problemático predecir el próximo tipo de evento de las 10k opciones. En cambio, tendría sentido reformular el problema para predecir los 100 tipos especiales y luego una clase de 'evento normal' para todos los 10k eventos normales.
pir

Para que quede claro: supongo que tiene toneladas de datos para este tipo de problema.
pir

@felbo: ​​de hecho. Había estado pensando en usar un índice, aprender un vector incrustado como word2vec, o agrupar los eventos en clases para reducir la dimensionalidad. Similar en el lado de la predicción, de acuerdo.
dgorissen

Respuestas:


4

Sus datos parecen ser solo secuencias de tokens. Intente construir un codificador automático LSTM y deje que el codificador aprenda algunas representaciones fijas de la primera parte de su secuencia y el decodificador para predecir el resto.

Estas representaciones serían sus motivos.

Árbitro:

Bahdanau, D., Cho, K. y Bengio, Y. (2014). Traducción automática neuronal aprendiendo conjuntamente a alinear y traducir. preimpresión de arXiv arXiv: 1409.0473.

Srivastava, N., Mansimov, E. y Salakhutdinov, R. (2015). Aprendizaje no supervisado de representaciones de video utilizando LSTM. preimpresión arXiv arXiv: 1502.04681.


1

La parte más importante es cómo "formula" el problema de clasificación, es decir, cómo representa la entrada y lo que desea generar. Dado que tiene tantos tipos de eventos diferentes, necesita aprender a integrarlos. Esto se puede hacer directamente en, por ejemplo, Keras. Puedes ver este ejemplosobre cómo aprender una incrustación directamente de los datos. Otro enfoque sería aprender una incrustación de antemano utilizando un enfoque no supervisado como word2vec. Sin embargo, esto requiere más trabajo de su parte, ya que necesita realizar una tarea relevante y capacitarla para generar la incrustación. Dado que tiene suficientes datos, es más fácil (aunque un poco menos efectivo) aprender la incrustación directamente. Para el resultado, no predeciría todos los diferentes tipos de eventos, sino solo los eventos especiales y una "clase de fondo" para mantener el problema factible. Si realmente quieres poder predecir cada clase, entonces necesitas usar algunos trucos (mira cómo lo hace word2vec).

En cuanto al tiempo entre eventos. Simplemente puede agregar eso a su LSTM como una dimensión adicional (consulte, por ejemplo, esto para ver un ejemplo de cómo hacerlo en Keras). Esto sería fácil de hacer y permitiría que el LSTM tenga en cuenta la diferencia temporal.

No conozco ninguna forma de visualizar los motivos "desenrollando" la naturaleza temporal de la red. Es posible que pueda generar algunos motivos utilizando una red generativa, pero probablemente sea difícil de interpretar. Una forma de explorar motivos podría ser simplemente encontrar las 100000 secuencias más comunes de eventos no especiales de, por ejemplo, longitud 20-100, ingresarlas en el modelo entrenado y extraer la salida de probabilidad de la capa final de softmax. De esta manera, puede encontrar secuencias que están conectadas a ciertos eventos especiales. Sin embargo, es difícil decir si este enfoque de motivos es factible / útil sin mirar sus datos.


Solo para aclarar. Por el lado del motivo, te refieres a mirar los datos en bruto y extraer subsecuencias más comunes de una longitud mínima particular (o usar la extracción de conjuntos de elementos frecuentes para generarlos) y luego ver dónde las predicciones de eventos especiales son máximas. En ese caso, parece más fácil abordarlo como un problema de clasificación estándar, ¿no?
dgorissen

Esperaba que la naturaleza dependiente del tiempo de un modelo recurrente permitiera algún tipo de inspección útil. Alternativamente, tal vez lo que habría que hacer sería ejecutar el modelo en 'reversa'. Maximice la confianza de predicción de cada tipo de evento especial y vea qué tipo de secuencias resultan. Sin embargo, no estoy muy seguro de cómo funcionaría y quizás necesite un modelo generativo.
dgorissen

1
Por favor vea mi respuesta actualizada. Sí, me refiero a ver dónde "las predicciones de eventos especiales son máximas" en función de los datos sin procesar. No entiendo lo que quieres decir con abordarlo como un problema de clasificación estándar :)
pir
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.