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:
- 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.
- 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.
- 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.
Antworten:
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.
quelle
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.
quelle