Генерация последовательности времени LSTM с использованием PyTorch

В течение нескольких дней я пытаюсь создать генерацию простой синусоидальной последовательности с использованием LSTM без каких-либо успехов.

Я начал с пример прогнозирования последовательности времени

Все, что я хотел сделать по-другому:

  • Используйте разные оптимизаторы (например, RMSprob), чем LBFGS
  • Попробуйте разные сигналы (больше синусоидальных компонентов)

Это ссылка на мой код. "experiment.py" является основным файлом

Что я делаю:

  • Я генерирую искусственные временные ряды (синусоидальные волны)
  • Я сократил данные временного ряда на небольшие последовательности
  • Ввод в мою модель представляет собой последовательность времени 0... T, а выход представляет собой последовательность времени 1... T + 1

Что происходит:

  • Тренировка и потери валидации идут гладко
  • Потеря теста очень низкая.
  • Однако, когда я пытаюсь генерировать последовательности произвольной длины, начиная с семени (случайной последовательности из тестовых данных), все идет не так. Выход всегда выключается.

Форма сгенерированного сигнала

Я просто не понимаю, в чем проблема. Я играю с этим уже неделю, без каких-либо успехов. Я был бы очень благодарен за любую помощь.

Спасибо

Ответы

Ответ 1

Это нормальное поведение и происходит потому, что ваша сеть слишком уверенна в качестве ввода и не учится полагаться на прошлое (на это внутреннее состояние) достаточно, полагаясь на входной сигнал. Когда вы применяете сеть к своему собственному выходу в настройке генерации, вход в сеть не так надежен, как в случае обучения или проверки, когда он получил истинный ввод.

У меня есть два возможных решения для вас:

  • Первый - самый простой, но менее интуитивный: добавьте немного гауссовского шума на ваш вход. Это заставит сеть больше полагаться на скрытое состояние.

  • Во-вторых, это наиболее очевидное решение: во время обучения подавайте не истинный ввод, а его сгенерированный вывод с определенной вероятностью p. Начните тренировку с p = 0 и постепенно увеличьте ее так, чтобы она училась общим более длинным и длинным последовательностям, независимо. Это называется schedualed sampling, и вы можете прочитать об этом подробнее: https://arxiv.org/abs/1506.03099.