Plötzlicher Genauigkeitsverlust beim Training von LSTM oder GRU in Keras

8

Mein wiederkehrendes neuronales Netzwerk (LSTM bzw. GRU) verhält sich auf eine Weise, die ich nicht erklären kann. Das Training beginnt und es trainiert gut (die Ergebnisse sehen ziemlich gut aus), wenn die Genauigkeit plötzlich abnimmt (und der Verlust schnell zunimmt) - sowohl Trainings- als auch Testmetriken. Manchmal wird das Netz einfach verrückt und gibt zufällige Ausgaben zurück, und manchmal (wie im letzten von drei Beispielen) beginnt es , allen Ausgaben dieselbe Ausgabe zurückzugeben .

Bild

Haben Sie eine Erklärung für dieses Verhalten ? Jede Meinung ist willkommen. Bitte beachten Sie die Aufgabenbeschreibung und die folgenden Abbildungen.

Die Aufgabe: Aus einem Wort seinen word2vec-Vektor vorhersagen Die Eingabe: Wir haben ein eigenes word2vec-Modell (normalisiert) und versorgen das Netzwerk mit einem Wort (Buchstabe für Buchstabe). Wir füllen die Wörter auf (siehe Beispiel unten). Beispiel: Wir haben ein Wort Fußball und möchten seinen 100-Dimensionen-Vektor word2vec vorhersagen. Dann ist die Eingabe $football$$$$$$$$$$.

Drei Beispiele für das Verhalten:

Einschichtiges LSTM

model = Sequential([
    LSTM(1024, input_shape=encoder.shape, return_sequences=False),
    Dense(w2v_size, activation="linear")
])

model.compile(optimizer='adam', loss="mse", metrics=["accuracy"])

Bild

Einschichtige GRU

model = Sequential([
    GRU(1024, input_shape=encoder.shape, return_sequences=False),
    Dense(w2v_size, activation="linear")
])

model.compile(optimizer='adam', loss="mse", metrics=["accuracy"])

Bild

Doppelschicht-LSTM

model = Sequential([
    LSTM(512, input_shape=encoder.shape, return_sequences=True),
    TimeDistributed(Dense(512, activation="sigmoid")),
    LSTM(512, return_sequences=False),
    Dense(256, activation="tanh"),
    Dense(w2v_size, activation="linear")
])

model.compile(optimizer='adam', loss="mse", metrics=["accuracy"])

Bild

Wir haben diese Art von Verhalten auch in einem anderen Projekt erlebt, in dem zuvor eine ähnliche Architektur verwendet wurde, deren Ziel und Daten jedoch unterschiedlich waren. Der Grund sollte also nicht in den Daten oder im jeweiligen Ziel verborgen sein, sondern in der Architektur.

Marek
quelle
Haben Sie herausgefunden, was das Problem verursacht hat?
Antoine
Leider nicht wirklich. Wir haben zu einer anderen Architektur gewechselt und hatten dann keine Chance, darauf zurückzukommen. Wir haben jedoch einige Hinweise. Wir vermuten, dass etwas dazu geführt hat, dass sich einer oder mehrere der Parameter geändert haben nan.
Marek
nanParameter würde nicht zu einem Nicht-Nan-Verlust führen. Ich vermute, dass Ihre Farbverläufe explodieren. Ähnliches ist mir in nicht stapelnormalisierten Netzwerken passiert.
Lugi
Dies ist auch eines der Dinge, die wir mit TensorBoard untersuchen wollten, aber die Gradientenexplosion wurde in unserem Fall nie bewiesen. Die Idee war, dass nansie in einer der Berechnungen auftauchte und dann standardmäßig einen anderen Wert verwendete, der das Netzwerk verrückt machte. Aber es ist nur eine wilde Vermutung. Danke für deine Meinung.
Marek

Antworten:

2

Hier ist mein Vorschlag, um das Problem genau zu bestimmen:

1) Sehen Sie sich die Lernkurve für das Training an: Wie ist die Lernkurve im Zug eingestellt? Lernt es das Trainingsset? Wenn nicht, arbeiten Sie zuerst daran, um sicherzustellen, dass Sie zu viel auf das Trainingsset passen.

2) Überprüfen Sie Ihre Daten, um sicherzustellen, dass kein NaN darin enthalten ist (Schulung, Validierung, Test).

3) Überprüfen Sie die Farbverläufe und Gewichte, um sicherzustellen, dass kein NaN vorhanden ist.

4) Verringern Sie die Lernrate während des Trainings, um sicherzustellen, dass dies nicht auf ein plötzliches großes Update zurückzuführen ist, das in einem scharfen Minimum steckt.

5) Um sicherzustellen, dass alles in Ordnung ist, überprüfen Sie die Vorhersagen Ihres Netzwerks, damit Ihr Netzwerk keine konstanten oder sich wiederholenden Vorhersagen macht.

6) Überprüfen Sie, ob Ihre Daten in Ihrem Stapel in Bezug auf alle Klassen ausgeglichen sind.

7) Normalisieren Sie Ihre Daten auf die mittlere Einheitsvarianz Null. Initialisieren Sie die Gewichte ebenfalls. Es wird das Training unterstützen.

PickleRick
quelle