Meilleure utilisation de LSTM pour la prédiction d'événements dans la séquence


9

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:

  1. É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.
  2. 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.
  3. 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.


De quel type d'ensemble de données s'agit-il?
pir

@felbo: ​​je ne peux pas dire explicitement malheureusement, mais ses données provenant du matériel, pas financières / ventes / annonces / ..
dgorissen

D'accord. En fait, l'encodage à chaud (dans ma réponse) peut être problématique si vous avez ~ 10k types d'événements. Vous pourriez peut-être faire quelque chose dans le sens de word2vec pour n'avoir que 300 dimensions d'entrée. De même, il est probablement problématique de prédire le prochain type d'événement sur 10 000 options. Au lieu de cela, il serait logique de recadrer le problème pour prédire simplement les 100 types spéciaux, puis une classe «d'événement normal» pour tous les événements normaux de 10 000.
pir

Juste pour être clair: je suppose que vous avez des tonnes de données pour ce genre de problème.
pir

@felbo: ​​en effet. Pensait simplement à utiliser un index, à apprendre un vecteur intégré comme word2vec, ou à regrouper les événements en classes pour réduire la dimensionnalité. Similaire du côté prédiction, d'accord.
dgorissen

Réponses:


4

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.


1

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.


Juste pour être clair. Du côté des motifs, vous voulez regarder les données brutes et extraire les sous-séquences les plus courantes d'une longueur minimale particulière (ou utiliser l'exploration fréquente d'ensembles d'éléments pour les générer), puis voir où les prédictions d'événements spéciaux sont maximales? Dans ce cas, il semble plus facile de l'aborder comme un problème de classification standard non?
dgorissen

J'espérais que la nature temporelle d'un modèle récurrent permettrait une sorte d'inspection utile. Alternativement, la chose à faire serait peut-être d'exécuter le modèle en «sens inverse». Maximisez la confiance de prédiction de chaque type d'événement spécial et voyez le type de séquences qui en résulte. Cependant, vous ne savez pas exactement comment cela fonctionnerait et vous aurez peut-être besoin d'un modèle génératif.
dgorissen

1
Veuillez voir ma réponse mise à jour. Oui, je veux dire voir où "les prédictions d'événements spéciaux sont maximales" sur la base des données brutes. Je ne comprends pas ce que vous entendez par l'appréhender comme un problème de classification standard :)
pir
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.