Mi red neuronal recurrente (LSTM, resp. GRU) se comporta de una manera que no puedo explicar. El entrenamiento comienza y se entrena bien (los resultados se ven bastante bien) cuando de repente cae la precisión (y la pérdida aumenta rápidamente) , tanto las métricas de entrenamiento como de prueba. A veces, la red simplemente se vuelve loca y devuelve salidas aleatorias y, a veces (como en el último de los tres ejemplos dados) comienza a devolver la misma salida a todas las entradas .
¿Tienes alguna explicación para este comportamiento ? Cualquier opinión es bienvenida. Por favor, vea la descripción de la tarea y las figuras a continuación.
La tarea: a partir de una palabra predecir su vector word2vec
La entrada: Tenemos un modelo propio de word2vec (normalizado) y alimentamos la red con una palabra (letra por letra). Rellenamos las palabras (ver el ejemplo a continuación).
Ejemplo: tenemos una palabra fútbol y queremos predecir su vector word2vec que tiene 100 dimensiones de ancho. Entonces la entrada es $football$$$$$$$$$$
.
Tres ejemplos del comportamiento:
Capa simple 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"])
GRU de una sola capa
model = Sequential([
GRU(1024, input_shape=encoder.shape, return_sequences=False),
Dense(w2v_size, activation="linear")
])
model.compile(optimizer='adam', loss="mse", metrics=["accuracy"])
Doble capa 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"])
También hemos experimentado este tipo de comportamiento en otro proyecto antes que utilizaba una arquitectura similar pero su objetivo y datos eran diferentes. Por lo tanto, la razón no debe ocultarse en los datos o en el objetivo particular, sino más bien en la arquitectura.
fuente
nan
.nan
parámetro no resultaría en una pérdida no nan. Supongo que sus gradientes explotan, me sucedió algo similar en redes normalizadas sin lotes.nan
apareció en uno de los cálculos y luego se convirtió en otro valor que causó que la red se volviera loca. Pero es solo una suposición salvaje. Gracias por su opinión.Respuestas:
Aquí está mi sugerencia para señalar el problema:
1) Mire la curva de aprendizaje del entrenamiento: ¿Cómo se establece la curva de aprendizaje en el tren? ¿Aprende el conjunto de entrenamiento? Si no, primero trabaje en eso para asegurarse de que puede encajar demasiado en el conjunto de entrenamiento.
2) Verifique sus datos para asegurarse de que no contenga NaN (capacitación, validación, prueba)
3) Verifique los gradientes y los pesos para asegurarse de que no haya NaN.
4) Disminuya la tasa de aprendizaje mientras entrena para asegurarse de que no se deba a una gran actualización repentina que se quedó en un mínimo agudo.
5) Para asegurarse de que todo esté bien, verifique las predicciones de su red para que su red no esté haciendo predicciones constantes o repetitivas.
6) Verifique si sus datos en su lote están equilibrados con respecto a todas las clases.
7) normalice sus datos para que sean cero unidades medias de varianza. Inicialice los pesos de la misma manera. Ayudará a la capacitación.
fuente