python - recurrent - Generación de secuencia de tiempo LSTM usando PyTorch
pytorch recurrent neural network (1)
Desde hace varios días, estoy tratando de construir una simple generación de secuencia de onda sinusoidal utilizando LSTM, sin vislumbrar ningún éxito hasta ahora.
Comencé desde el ejemplo de predicción de secuencia de tiempo
Todo lo que quería hacer diferente es:
- Utilice diferentes optimizadores (por ejemplo, RMSprob) que LBFGS
- Probar diferentes señales (más componentes de onda sinusoidal)
Este es el enlace a mi código . "experiment.py" es el archivo principal
Lo que hago es:
- Genero datos artificiales de series de tiempo (ondas sinusoidales)
- Corté esos datos de series de tiempo en pequeñas secuencias
- La entrada a mi modelo es una secuencia de tiempo 0 ... T, y la salida es una secuencia de tiempo 1 ... T + 1
Lo que ocurre es:
- El entrenamiento y las pérdidas de validación descienden sin problemas.
- La pérdida de prueba es muy baja.
- Sin embargo, cuando trato de generar secuencias de longitud arbitraria, a partir de una semilla (una secuencia aleatoria de los datos de prueba), todo sale mal. La salida siempre es plana.
Simplemente no veo cuál es el problema. Estoy jugando con esto durante una semana, sin ningún progreso a la vista. Estaría muy agradecido por cualquier ayuda.
Gracias
Este es un comportamiento normal y ocurre porque su red confía demasiado en la calidad de la entrada y no aprende a confiar en el pasado (en su estado interno), confiando únicamente en la entrada. Cuando aplica la red a su propia salida en la configuración de generación, la entrada a la red no es tan confiable como lo fue en el caso de capacitación o validación donde obtuvo la verdadera entrada.
Tengo dos soluciones posibles para ti:
El primero es el más simple pero menos intuitivo: agregue un poco de ruido gaussiano a su entrada. Esto obligará a la red a confiar más en su estado oculto.
El segundo, es la solución más obvia: durante el entrenamiento, aliméntelo no con la entrada real sino con su salida generada con cierta probabilidad p. Comience el entrenamiento con p = 0 y auméntelo gradualmente para que aprenda secuencias generales cada vez más largas, de forma independiente. Esto se denomina muestreo programado, y puede leer más sobre esto aquí: https://arxiv.org/abs/1506.03099 .