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:
- 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?
- ¿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.
- 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.
Respuestas:
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.
fuente
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.
fuente