2017-04-17 5 views
16

Seit einigen Tagen versuche ich eine einfache Sinus-Sequenzgenerierung mit LSTM zu erstellen, ohne bisher einen Blick auf den Erfolg zu werfen.LSTM-Zeitreihengenerierung mit PyTorch

Ich begann aus dem time sequence prediction example

Alles, was ich anders machen wollte, ist:

  • Verwenden Sie unterschiedliche Optimierer (zB RMSprob) als LBFGS
  • Probieren Sie verschiedene Signale (mehr Sinuskomponenten)

Dies ist der Link zu my code. „Experiment.py“ ist die Hauptdatei

Was ich tue, ist:

  • I erzeugen künstliche Zeitreihendaten (Sinuswellen)
  • Ich schneide diese Zeitreihendaten in kleine Sequenzen
  • die Eingabe in meinem Modell eine Folge von Zeit 0 ... T, und der Ausgang ist eine Folge von Zeit 1 ... T + 1

Was passiert ist:

  • Die Ausbildung und die Validierungsverluste gehen reibungslos
  • Der Test Verlust
  • jedoch sehr gering ist, wenn ich versuche beliebige Längensequenzen zu erzeugen, aus einem Samen (eine Zufallssequenz aus den Testdaten) ausgehend , alles läuft schief. Der Ausgang Wohnungen aus immer

Shape of the generated signal

ich einfach nicht sehen, was das Problem ist. Ich spiele jetzt seit einer Woche damit, ohne Fortschritte zu sehen. Ich wäre sehr dankbar für jede Hilfe.

Danke

+6

Als ich versuchte, das Problem zu replizieren, stellte sich heraus, dass es bereits im git-Hub-Code behoben wurde. Es scheint, dass die Frage bereits [hier] gestellt und beantwortet wurde (https://discuss.pytorch.org/t/lstm-time-sequence-generation/1916). @OmarSamir vielleicht könntest du auch hier die Lösung posten. Außerdem solltest du Probleme mit bestimmten Commits eines GitHubs verknüpfen (Leute, die deine Frage betrachten, sehen dieselbe Ausgabe). – kabdulla

Antwort

2

Dieses Verhalten ist normal und geschieht, weil Ihr Netzwerk zu vertraut auf die Qualität des Eingangssignals und lernt nicht auf der Vergangenheit verlassen (auf das interne Zustand ist) genug, soley auf die Berufung Eingang. Wenn Sie das Netzwerk in der Generierungseinstellung auf seine eigene Ausgabe anwenden, ist die Eingabe in das Netzwerk nicht so zuverlässig wie im Trainings- oder Validierungsfall, in dem es die echte Eingabe erhalten hat.

Ich habe zwei mögliche Lösungen für Sie:

  • Die erste ist die einfachste, aber weniger intuitiv ein: ein wenig Gaußsche Rauschen auf Ihre Eingabe hinzufügen. Dies wird das Netzwerk zwingen, sich mehr auf seinen versteckten Zustand zu verlassen.

  • Die zweite, ist die naheliegendste Lösung: Während des Trainings füttere es nicht die wahre Eingabe, sondern seine erzeugte Ausgabe mit einer bestimmten Wahrscheinlichkeit p. Beginnen Sie das Training mit p = 0 und erhöhen Sie es allmählich, so dass es unabhängig voneinander zu immer längeren Sequenzen lernt. Dies wird als zeitgesteuerte Abtastung bezeichnet, und Sie können hier mehr darüber lesen: https://arxiv.org/abs/1506.03099.

Verwandte Themen