Beste Verwendung von LSTM für die Vorhersage von Sequenzereignissen

9

Nehmen Sie die folgende eindimensionale Sequenz an:

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

Buchstaben A, B, C, ..hier repräsentieren "gewöhnliche" Ereignisse.

Symbole stehen #, $, %, ...hier für "besondere" Ereignisse

Der zeitliche Abstand zwischen allen Ereignissen ist ungleichmäßig (von Sekunden bis zu Tagen). Je weiter in der Vergangenheit ein Ereignis liegt, desto weniger wahrscheinlich ist es, dass es zukünftige Ereignisse beeinflusst. Im Idealfall kann ich diese Zeitverzögerungen explizit berücksichtigen.

Es gibt in der Größenordnung von 10000 gewöhnlichen Ereignistypen und in der Größenordnung von 100 speziellen Ereignistypen. Die Anzahl der gewöhnlichen Ereignisse vor einem besonderen Ereignis variiert, es ist jedoch unwahrscheinlich, dass sie mehr als 100-300 betragen.

Grundsätzlich bin ich daran interessiert, nach Mustern in der gewöhnlichen Ereignissequenz zu suchen, die letztendlich die besonderen Ereignisse vorhersagen.

Jetzt können Sie dies auf verschiedene Arten angehen: Erstellen von Merkmalsvektoren + Standardklassifizierung, Lernen von Assoziationsregeln, HMMs usw.

In diesem Fall bin ich gespannt, wie ein LSTM-basiertes Netzwerk am besten passt. Unkompliziert wäre es, so etwas wie Karparthys Charakter zu tun und das nächste Ereignis in einer bestimmten Geschichte vorherzusagen. Dann für eine neue Sequenz

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

Sie können es durch das Modell laufen lassen und sehen, welches besondere Ereignis am wahrscheinlichsten als nächstes kommt. Aber es fühlt sich nicht ganz richtig an.

Da dies ein zeitliches Klassifizierungsproblem ist, scheint es jedoch angebracht zu sein, die von Alex Graves beschriebene Connectionist Temporal Classification zu verwenden .

Bevor ich jedoch im Moment zu viel investiere, suche ich nach etwas, mit dem ich einfacher und schneller experimentieren kann, um ein Gefühl dafür zu bekommen, wie gut LSTMs hier passen würden. Tensorflow wird irgendwann ein CTC-Beispiel sehen , aber noch nicht.

Meine (Unter-) Fragen sind also:

  1. Angesichts des oben genannten Problems und ich würde gerne mit LSTMs experimentieren, lohnt es sich, den Ansatz vom Typ char-rnn auszuprobieren, sollte ich in die Kugel beißen und mich mit CTC auseinandersetzen, oder gibt es einen besseren Ausgangspunkt.
  2. Wie würden Sie explizit Inter-Event-Timing-Informationen einbinden? Die Verwendung einer festen Uhr mit No-Op-Ereignissen funktioniert offensichtlich, scheint aber hässlich.
  3. Angenommen, ich habe es geschafft, ein LSTM zu trainieren, gibt es eine Möglichkeit, das Modell zu untersuchen, um festzustellen, welche Art von Ereignismotiven es aufgenommen hat? (dh analog zu den Filtern in Convnets)

Jeder Beispielcode (Python bevorzugt) ist immer hilfreich.

Bearbeiten: Nur um hinzuzufügen, dass die Sequenz etwas Rauschen enthält. Einige Ereignisse können ignoriert werden, aber genau welche können nicht immer im Voraus gesagt werden. Idealerweise ist das Modell (und die daraus abgeleiteten Motive) dagegen robust.

dgorissen
quelle
Was für ein Datensatz ist das?
Pir
@felbo: ​​Ich kann leider nicht explizit sagen, aber seine Daten von Hardware, nicht finanziell / sales /
ads
In Ordnung. Tatsächlich kann eine One-Hot-Codierung (in meiner Antwort) problematisch sein, wenn Sie ~ 10.000 Ereignistypen haben. Sie könnten vielleicht etwas in Anlehnung an word2vec tun, sodass Sie nur ~ 300 Eingabedimensionen haben. Ebenso ist es wahrscheinlich problematisch, den nächsten Ereignistyp aus 10.000 Optionen vorherzusagen. Stattdessen wäre es sinnvoll, das Problem neu zu definieren, um nur die 100 Spezialtypen und dann eine Klasse für "normale Ereignisse" für alle 10.000 normalen Ereignisse vorherzusagen.
Pir
Um ganz klar zu sein: Ich gehe davon aus, dass Sie Tonnen von Daten für diese Art von Problem haben.
Pir
@felbo: ​​in der Tat. Ich hatte darüber nachgedacht, nur einen Index zu verwenden, einen Vektor zu lernen, der wie word2vec eingebettet ist, oder die Ereignisse in Klassen zu gruppieren, um die Dimensionalität zu verringern. Ähnlich auf der Vorhersageseite, stimmte zu.
Dgorissen

Antworten:

4

Ihre Daten scheinen nur Folgen von Token zu sein. Versuchen Sie, einen LSTM-Autoencoder zu erstellen, und lassen Sie den Encoder einige feste Darstellungen des ersten Teils Ihrer Sequenz und des Decoders lernen, um die verbleibenden vorherzusagen.

Diese Darstellungen wären Ihre Motive.

Ref:

Bahdanau, D., Cho, K. & Bengio, Y. (2014). Neuronale maschinelle Übersetzung durch gemeinsames Lernen des Ausrichtens und Übersetzens. arXiv-Vorabdruck arXiv: 1409.0473.

N. Srivastava, E. Mansimov & R. Salakhutdinov (2015). Unüberwachtes Lernen von Videodarstellungen mit LSTMs. arXiv-Vorabdruck arXiv: 1502.04681.

horaceT
quelle
1

Der wichtigste Teil ist, wie Sie das Klassifizierungsproblem "formulieren", dh wie Sie die Eingabe darstellen und was Sie ausgeben möchten. Da Sie so viele verschiedene Ereignistypen haben, müssen Sie eine Einbettung dieser lernen. Dies kann direkt in zB Keras erfolgen. Sie können dieses Beispiel sehenwie man eine Einbettung direkt aus Daten lernt. Ein anderer Ansatz wäre, eine Einbettung vorher mit einem unbeaufsichtigten Ansatz wie word2vec zu lernen. Dies erfordert jedoch mehr Arbeit von Ihrer Seite, da Sie eine relevante Aufgabe erstellen und diese trainieren müssen, um die Einbettung zu generieren. Wenn Sie über genügend Daten verfügen, ist es einfacher (wenn auch etwas weniger effektiv), die Einbettung direkt zu lernen. Für die Ausgabe würde ich nicht alle verschiedenen Arten von Ereignissen vorhersagen, sondern nur die besonderen Ereignisse und eine "Hintergrundklasse", um das Problem durchführbar zu halten. Wenn Sie wirklich in der Lage sein möchten, jede einzelne Klasse vorherzusagen, müssen Sie einige Tricks anwenden (schauen Sie sich an, wie word2vec das macht).

In Bezug auf die Zeit zwischen Ereignissen. Sie könnten einfach , dass auf Ihre LSTM als zusätzliche Dimension hinzufügen (siehe zB dies für ein Beispiel , wie das in Keras zu tun). Dies wäre einfach und würde es dem LSTM ermöglichen, den zeitlichen Unterschied zu berücksichtigen.

Ich kenne keine Möglichkeit, die Motive durch "Abrollen" der zeitlichen Natur des Netzwerks zu visualisieren. Möglicherweise können Sie einige Motive mithilfe eines generativen Netzwerks generieren, die Interpretation ist jedoch wahrscheinlich schwierig. Eine Möglichkeit, Motive zu untersuchen, könnte darin bestehen, einfach die 100000 häufigsten Sequenzen nicht spezieller Ereignisse mit einer Länge von beispielsweise 20 bis 100 zu finden, sie in das trainierte Modell einzugeben und die Wahrscheinlichkeitsausgabe aus der endgültigen Softmax-Schicht zu extrahieren. Auf diese Weise können Sie Sequenzen finden, die mit bestimmten besonderen Ereignissen verbunden sind. Es ist jedoch schwierig zu sagen, ob dieser Motivansatz machbar / nützlich ist, ohne Ihre Daten zu betrachten.

pir
quelle
Nur um das klar zu stellen. Auf der Motivseite meinen Sie, die Rohdaten zu betrachten und die häufigsten Teilsequenzen einer bestimmten Mindestlänge zu extrahieren (oder häufiges Item-Set-Mining zu verwenden, um sie zu generieren) und dann zu sehen, wo die Vorhersagen für besondere Ereignisse maximal sind? In diesem Fall scheint es einfacher zu sein, es als Standardklassifizierungsproblem zu betrachten, nicht wahr?
Dgorissen
Ich hatte gehofft, dass die zeitabhängige Natur eines wiederkehrenden Modells eine nützliche Inspektion ermöglichen würde. Alternativ könnte das Modell möglicherweise in umgekehrter Reihenfolge ausgeführt werden. Maximieren Sie das Vorhersagevertrauen für jeden speziellen Ereignistyp und sehen Sie, welche Art von Sequenzen daraus resultieren. Sie sind sich jedoch nicht ganz sicher, wie dies funktionieren würde, und benötigen möglicherweise ein generatives Modell.
Dgorissen
1
Bitte beachten Sie meine aktualisierte Antwort. Ja, ich meine zu sehen, wo "Vorhersagen für besondere Ereignisse maximal sind", basierend auf den Rohdaten. Ich verstehe nicht, was Sie damit meinen, es als Standardklassifizierungsproblem zu betrachten :)
Pir