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.