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 .
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"])
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"])
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"])
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.
quelle
nan
.nan
Parameter 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.nan
sie 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.Antworten:
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.
quelle