wake-up-neo.com

Wann setzen Keras einen LSTM-Status zurück?

Ich habe alle möglichen Texte darüber gelesen und keiner scheint diese sehr grundlegende Frage zu beantworten. Es ist immer mehrdeutig:

In einer stateful = False LSTM-Schicht werden die Zustände von Keras nach folgenden Schritten zurückgesetzt:

  • Jede Sequenz; oder 
  • Jede Charge?

Angenommen, ich habe X_train als (1000, 20, 1) geformt, was 1000 Folgen von 20 Schritten eines einzelnen Werts bedeutet. Wenn ich mache:

model.fit(X_train, y_train, batch_size=200, nb_Epoch=15)

Setzt es Zustände für jede einzelne Sequenz zurück (setzt Zustände 1000 Mal zurück)?
Oder werden die Zustände für jede Charge zurückgesetzt (setzt die Zustände fünfmal zurück)?

22
Daniel Möller

Bei einigen Tests kam ich zu folgenden Schlussfolgerungen, die der Dokumentation und der Antwort von Nassim entsprechen:

Erstens gibt es keinen einzelnen Status in einer Ebene, sondern einen Status pro Probe im Stapel. Es gibt batch_size parallele Zustände in einer solchen Schicht. 

Stateful = False

In einem stateful=False-Fall werden alle Zustände nach jedem Stapel zusammen zurückgesetzt

  • Ein Stapel mit 10 sequences würde 10 states erstellen, und alle 10 Status werden nach der Verarbeitung automatisch zurückgesetzt. 

  • Der nächste Stapel mit 10 sequences erstellt 10 new states, der ebenfalls zurückgesetzt wird, nachdem dieser Stapel verarbeitet wurde

Wenn alle diese Sequenzen length (timesteps) = 7 haben, lautet das praktische Ergebnis dieser beiden Stapel:

20 Einzelsequenzen mit jeweils einer Länge von 7

Keine der Sequenzen ist verwandt. Aber natürlich: Die Gewichtungen (nicht die Zustände) sind für die Ebene eindeutig und geben an, was die Ebene aus allen Sequenzen gelernt hat. 

  • Ein Zustand ist: Wo bin ich jetzt in einer Sequenz? Welcher Zeitschritt ist das? Wie verhält sich diese Sequenz seit ihren Anfängen? 
  • Ein Gewicht ist: Was weiß ich über das allgemeine Verhalten aller Sequenzen, die ich bisher gesehen habe?

Stateful = Richtig

In diesem Fall gibt es auch die gleiche Anzahl paralleler Zustände, aber sie werden werden überhaupt nicht zurückgesetzt .

  • Ein Stapel mit 10 sequences erstellt 10 states, der so bleibt, wie er am Ende des Stapels ist. 

  • Der nächste Stapel mit 10 sequences (es muss 10 sein, da der erste 10 war) wird wiederverwenden den gleichen 10 states, der zuvor erstellt wurde. 

Das praktische Ergebnis ist: Die 10 Sequenzen der zweiten Charge setzen die 10 Sequenzen der ersten Charge fort, als ob es überhaupt keine Unterbrechung gegeben hätte. 

Wenn jede Sequenz length (timesteps) = 7 hat, lautet die tatsächliche Bedeutung:

10 Einzelsequenzen mit jeweils 14

Wenn Sie sehen, dass Sie die Gesamtlänge der Sequenzen erreicht haben, rufen Sie model.reset_states() auf. Das bedeutet, dass Sie die vorherigen Sequenzen nicht mehr fortsetzen. 

31
Daniel Möller

Im doc des RNN-Codes können Sie folgendes lesen:

Hinweis zur Verwendung von Statefulness in RNNs:

Sie können RNN-Layer als "stateful" festlegen. Dies bedeutet, dass die Status Für die Proben in einem Stapel berechnete Werte werden als Ausgangszustände wiederverwendet für die Proben in der nächsten Charge. Dies setzt eine Eins-zu-Eins-Zuordnung voraus zwischen Proben in verschiedenen aufeinanderfolgenden Chargen.

Ich weiß, dass dies Ihre Frage nicht direkt beantwortet, aber es bestätigt mir, was ich dachte: Wenn ein LSTM nicht zustandsbehaftet ist, wird der Zustand nach jeder Abtastung zurückgesetzt. Sie arbeiten nicht stapelweise, die Idee in einem Stapel ist, dass jede Probe unabhängig ist. 

Sie haben also 1000 Zustände für Ihr Beispiel zurückgesetzt.

6
Nassim Ben

In Keras gibt es zwei Modi zum Verwalten von Status: 1) Der Standardmodus (stateful = False), bei dem der Status nach jedem Stapel zurückgesetzt wird. AFAIK wird der Zustand zwischen verschiedenen Proben innerhalb einer Charge beibehalten. Für Ihren Beispielzustand würden Sie also in jeder Epoche fünfmal zurückgesetzt.

2) Der Stateful-Modus, in dem der Status niemals zurückgesetzt wird. Der Benutzer kann den Status vor einer neuen Epoche zurücksetzen, Keras selbst setzt den Status jedoch nicht zurück. In diesem Modus wird der Zustand von der Probe "i" einer Charge zur Probe "i" der nächsten Charge weitergegeben. Im Allgemeinen wird empfohlen, den Status nach jeder Epoche zurückzusetzen, da der Status möglicherweise zu lang wird und instabil wird. Nach meiner Erfahrung mit kleinen Datensätzen (20.000 - 40.000 Samples) hat das Zurücksetzen oder Nicht-Zurücksetzen des Zustands nach einer Epoche keinen großen Einfluss auf das Endergebnis. Bei größeren Datensätzen kann es einen Unterschied machen.

Das Stateful-Modell ist hilfreich, wenn Sie Muster haben, die sich über mehrere hundert Zeitschritte erstrecken. Ansonsten reicht der Standardmodus aus. Nach meiner Erfahrung ist es auch hilfreich, wenn die Stapelgröße ungefähr der Größe (Zeitschritte) der Muster in den Daten entspricht. 

Das zustandsorientierte Setup könnte zunächst schwer zu verstehen sein. Man würde erwarten, dass der Zustand zwischen der letzten Probe einer Charge zur ersten Probe der nächsten Charge übertragen wird. Der Zustand wird jedoch tatsächlich über Chargen zwischen den gleichen nummerierten Proben verteilt. Die Autoren hatten zwei Möglichkeiten und sie wählten die letztere. Lesen Sie dazu hier . Schauen Sie sich auch den entsprechenden Abschnitt Keras FAQ über stateful RNNs an 

3
artemis

Wenn Sie die Antwort von @ Nassim_Ben erweitern, ist es wahr, dass jede Sequenz für jede Instanz des Stapels als unabhängig betrachtet wird. Sie müssen jedoch berücksichtigen, dass der verborgene Zustand der RNNs und der Zellenspeicher für 20 Schritte an die nächste Zelle weitergegeben werden. Der verborgene Zustand und der Zellenspeicher werden typischerweise für die allererste Zelle in den 20 Zellen auf Null gesetzt.

Nach der 20. Zelle und nachdem der verborgene Zustand (nur kein Zellenspeicher) auf die Schichten über dem RNN übertragen wurde, wird der Zustand zurückgesetzt. Ich gehe davon aus, dass hier Zellgedächtnis und verborgener Zustand gemeint sind.

Ja, es wird jedoch für alle 1000 Instanzen zurückgesetzt, wenn man bedenkt, dass batch_size=200 fünfmal zurückgesetzt wird, wobei jeder Stapel zurückgesetzt wird, nachdem er die 20 Schritte durchlaufen hat. Hoffentlich hast du den Kopf dahinter gebracht. 

Hier ist ein Projekt, bei dem ich dieselbe Frage hatte. Achten Sie besonders auf Zelle 15 und ihre Erklärung im Blob nach Zelle 11. Ich habe weiterhin Briefe angehängt, weil der Status sonst zurückgesetzt wurde.

0
sachinruk

Jeder scheint es zu verwirrend zu machen. Keras LSTM setzt den Status nach jedem Stapel zurück. 

Hier ist ein guter Blog: https://machinelearningmastery.com/understanding-stateful-lstm-recurrent-neural-networks-python-keras/

Lesen Sie die Themen LSTM State Within A Batch und Stateful LSTM for a One-Char to One-Char Mapping in diesem Blog. Es zeigt, warum es erst nach dem Batch zurückgesetzt werden muss.

0
sn.anurag