Генерация последовательности времени LSTM с использованием PyTorch
В течение нескольких дней я пытаюсь создать генерацию простой синусоидальной последовательности с использованием LSTM без каких-либо успехов.
Я начал с пример прогнозирования последовательности времени
Все, что я хотел сделать по-другому:
- Используйте разные оптимизаторы (например, RMSprob), чем LBFGS
- Попробуйте разные сигналы (больше синусоидальных компонентов)
Это ссылка на мой код. "experiment.py" является основным файлом
Что я делаю:
- Я генерирую искусственные временные ряды (синусоидальные волны)
- Я сократил данные временного ряда на небольшие последовательности
- Ввод в мою модель представляет собой последовательность времени 0... T, а выход представляет собой последовательность времени 1... T + 1
Что происходит:
- Тренировка и потери валидации идут гладко
- Потеря теста очень низкая.
- Однако, когда я пытаюсь генерировать последовательности произвольной длины, начиная с семени (случайной последовательности из тестовых данных), все идет не так. Выход всегда выключается.
![Форма сгенерированного сигнала]()
Я просто не понимаю, в чем проблема. Я играю с этим уже неделю, без каких-либо успехов.
Я был бы очень благодарен за любую помощь.
Спасибо
Ответы
Ответ 1
Это нормальное поведение и происходит потому, что ваша сеть слишком уверенна в качестве ввода и не учится полагаться на прошлое (на это внутреннее состояние) достаточно, полагаясь на входной сигнал. Когда вы применяете сеть к своему собственному выходу в настройке генерации, вход в сеть не так надежен, как в случае обучения или проверки, когда он получил истинный ввод.
У меня есть два возможных решения для вас:
-
Первый - самый простой, но менее интуитивный: добавьте немного гауссовского шума на ваш вход. Это заставит сеть больше полагаться на скрытое состояние.
-
Во-вторых, это наиболее очевидное решение: во время обучения подавайте не истинный ввод, а его сгенерированный вывод с определенной вероятностью p. Начните тренировку с p = 0 и постепенно увеличьте ее так, чтобы она училась общим более длинным и длинным последовательностям, независимо. Это называется schedualed sampling, и вы можете прочитать об этом подробнее: https://arxiv.org/abs/1506.03099.