Supposons la séquence unidimensionnelle suivante:
A, B, C, Z, B, B, #, C, C, C, V, $, W, A, % ...
Les lettres A, B, C, ..
ici représentent des événements «ordinaires».
Les symboles #, $, %, ...
ici représentent des événements «spéciaux»
L'espacement temporel entre tous les événements est non uniforme (de quelques secondes à quelques jours), bien que plus un événement dans le passé est faible, moins il est susceptible d'influencer des événements futurs. Idéalement, je peux prendre en compte ces délais de manière explicite.
Il existe de l'ordre de 10000 types d'événements ordinaires et de l'ordre de 100 types d'événements spéciaux. Le nombre d'événements ordinaires précédant un événement spécial varie, mais il est peu probable qu'il soit supérieur à 100-300.
Fondamentalement, je suis intéressé par la recherche de modèles dans la séquence d'événements ordinaires qui finissent par être prédictifs pour les événements spéciaux.
Vous pouvez maintenant aborder cela de différentes manières: création de vecteurs d'entités + classification standard, apprentissage des règles d'association, HMM, etc.
Dans ce cas, je suis curieux de savoir comment un réseau basé sur LSTM conviendrait le mieux. Il serait simple de faire quelque chose comme le char-rnn de Karparthy et de prédire le prochain événement compte tenu d'une histoire. Puis pour une nouvelle séquence
C, Z, Q, V, V, ... , V, W
Vous pouvez le parcourir à travers le modèle et voir quel événement spécial est le plus probable à venir. Mais il ne se sent pas tout à fait adapté.
Comme il s'agit d'un problème de classification temporelle, il semble que la bonne chose à faire soit d'utiliser la classification temporelle connexionniste telle que décrite par Alex Graves .
Cependant, avant d'investir trop pour le moment, je cherche quelque chose de plus facile et plus rapide à expérimenter pour avoir une idée de la façon dont les LSTM s'intégreraient ici. Tensorflow verra un exemple CTC à un moment donné, mais pas encore.
Mes (sous) questions sont donc:
- Étant donné le problème ci-dessus et j'aimerais expérimenter avec les LSTM, cela vaut-il la peine d'essayer l'approche de type char-rnn, si je mord la balle et me familiarise avec la CTC, ou est-il un meilleur endroit pour commencer.
- Comment incorporeriez-vous explicitement les informations de synchronisation inter-événements? L'utilisation d'une horloge fixe avec des événements sans opération fonctionne évidemment, mais semble moche.
- En supposant que j'ai réussi à former un LSTM, y a-t-il un moyen d'inspecter le modèle pour voir quel type de «motifs» d'événement il a ramassé? (c.-à-d., analogue aux filtres des convnets)
Tout exemple de code (python préféré) est toujours utile.
Edit: Juste pour ajouter qu'il y a du bruit dans la séquence. Certains événements peuvent être ignorés en toute sécurité, mais il n'est pas toujours possible de dire exactement lesquels. Donc, idéalement, le modèle (et les motifs qui en dérivent) est robuste contre cela.
Réponses:
Vos données ne semblent être que des séquences de jetons. Essayez de créer un auto-encodeur LSTM et laissez l'encodeur apprendre certaines représentations fixes de la première partie de votre séquence et le décodeur pour prédire le reste.
Ces représentations seraient vos motifs.
Réf:
Bahdanau, D., Cho, K. et Bengio, Y. (2014). Traduction automatique de neurones en apprenant conjointement à aligner et à traduire. arXiv preprint arXiv: 1409.0473.
Srivastava, N., Mansimov, E. et Salakhutdinov, R. (2015). Apprentissage non supervisé des représentations vidéo à l'aide de LSTM. arXiv preprint arXiv: 1502.04681.
la source
La partie la plus importante est la façon dont vous «formulez» le problème de classification, c'est-à-dire la façon dont vous représentez l'entrée et ce que vous voulez sortir. Étant donné que vous avez tellement de types d'événements différents, vous devez apprendre à les intégrer. Cela peut être fait directement par exemple dans Keras. Vous pouvez voir cet exemplesur la façon d'apprendre une intégration directement à partir des données. Une autre approche serait d'apprendre au préalable une intégration à l'aide d'une approche non supervisée telle que word2vec. Cependant, cela nécessite plus de travail de votre part, car vous devez trouver une tâche pertinente et la former pour générer l'incorporation. Étant donné que vous disposez de suffisamment de données, il est plus facile (bien que légèrement moins efficace) d'apprendre directement l'intégration. Pour la sortie, je ne prédirais pas tous les différents types d'événements, mais seulement les événements spéciaux et une "classe d'arrière-plan" pour garder le problème faisable. Si vous voulez vraiment pouvoir prédire chaque classe, alors vous devez utiliser quelques astuces (regardez comment word2vec le fait).
Concernant le temps entre les événements. Vous pouvez simplement ajouter cela à votre LSTM en tant que dimension supplémentaire (voir par exemple ceci pour un exemple de comment faire cela dans Keras). Ce serait facile à faire et permettrait au LSTM de prendre en compte la différence temporelle.
Je ne connais aucun moyen de visualiser les motifs en "déroulant" la nature temporelle du réseau. Vous pourriez être en mesure de générer certains motifs à l'aide d'un réseau génératif, mais il serait probablement difficile à interpréter. Une façon d'explorer les motifs pourrait être de simplement trouver les 100000 séquences d'événements non spéciaux les plus courantes, par exemple de la longueur 20-100, de les entrer dans le modèle entraîné et d'extraire la sortie de probabilité de la couche finale softmax. De cette façon, vous pouvez trouver des séquences liées à certains événements spéciaux. Cependant, il est difficile de dire si cette approche par motif est faisable / utile sans regarder vos données.
la source