Utilizo la red LSTM en Keras. Durante el entrenamiento, la pérdida fluctúa mucho, y no entiendo por qué ocurre eso.
Aquí está el NN que estaba usando inicialmente:
Y aquí están las pérdidas y la precisión durante el entrenamiento:
(Tenga en cuenta que la precisión alcanza el 100%, pero tarda unas 800 épocas).
Pensé que estas fluctuaciones se producen debido a las capas Dropout / cambios en la tasa de aprendizaje (he utilizado rmsprop / adam), así que hice un modelo más simple:
También he utilizado SGD sin impulso ni decaimiento. He probado diferentes valores para lr
pero sigo obteniendo el mismo resultado.
sgd = optimizers.SGD(lr=0.001, momentum=0.0, decay=0.0, nesterov=False)
Pero sigo teniendo el mismo problema: la pérdida fluctúa en lugar de disminuir. Siempre he pensado que se supone que la pérdida disminuye gradualmente, pero aquí no parece comportarse así.
Así que..:
-
¿Es normal que la pérdida fluctúe así durante el entrenamiento? ¿Y por qué ocurriría?
-
Si no es así, ¿por qué ocurriría esto para el modelo LSTM simple con el
lr
a un valor muy pequeño?
Gracias. (Tenga en cuenta que he consultado preguntas similares aquí, pero no me ayudaron a resolver mi problema).
Pónganse al día.: para más de 1000 épocas (sin capa BatchNormalization, sin modificador RmsProp de Keras):
Actualización. 2: Para el gráfico final:
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
history = model.fit(train_x, train_y, epochs = 1500)
Datos: secuencias de valores de la corriente (procedentes de los sensores de un robot).
Variables objetivo: la superficie sobre la que está operando el robot (como vector unidireccional, 6 categorías diferentes).
Preprocesamiento:
- cambiar la frecuencia de muestreo para que las secuencias no sean demasiado largas (LSTM no parece aprender de otro modo);
- cortar las secuencias en las secuencias más pequeñas (la misma longitud para todas las secuencias más pequeñas: 100 pasos de tiempo cada una);
- comprobar que cada una de las 6 clases tiene aproximadamente el mismo número de ejemplos en el conjunto de entrenamiento.
Sin relleno.
Forma del conjunto de entrenamiento (#secuencias, #tiempos en una secuencia, #características):
(98, 100, 1)
Forma de las etiquetas correspondientes (como vector de un solo golpe para 6 categorías):
(98, 6)
Capas:
El resto de los parámetros (tasa de aprendizaje, tamaño del lote) son los mismos que los predeterminados en Keras:
keras.optimizers.RMSprop(lr=0.001, rho=0.9, epsilon=None, decay=0.0)
tamaño_lote: Entero o Ninguno. Número de muestras por actualización de gradiente. Si no se especifica, será por defecto 32.
Actualización. 3: La pérdida por batch_size=4
:
Para batch_size=2
el LSTM no parece aprender correctamente (la pérdida fluctúa en torno al mismo valor y no disminuye).
Actualización. 4: Para ver si el problema no es sólo un error en el código: He hecho un ejemplo artificial (2 clases que no son difíciles de clasificar: cos vs arccos). Pérdida y precisión durante el entrenamiento para estos ejemplos: