使用 PyTorch 生成 LSTM 时间序列

Posted

技术标签:

【中文标题】使用 PyTorch 生成 LSTM 时间序列【英文标题】:LSTM time sequence generation using PyTorch 【发布时间】:2017-09-13 12:22:54 【问题描述】:

这几天,我正在尝试使用 LSTM 构建一个简单的正弦波序列生成,但到目前为止还没有看到任何成功。

我从time sequence prediction example开始

我想做的不同之处在于:

使用与 LBFGS 不同的优化器(例如 RMSprob) 尝试不同的信号(更多正弦波分量)

这是my code 的链接。 “experiment.py”为主文件

我做的是:

我生成人工时间序列数据(正弦波) 我将这些时间序列数据切成小序列 我的模型的输入是时间序列 0...T,输出是时间序列 1...T+1

会发生什么:

训练和验证损失平稳下降 测试损耗极低 但是,当我尝试从种子(来自测试数据的随机序列)开始生成任意长度的序列时,一切都出错了。输出总是平坦的

我根本不明白问题出在哪里。我现在正在玩这个一周,看不到任何进展。 如果有任何帮助,我将不胜感激。

谢谢

【问题讨论】:

当我试图复制问题时,结果发现它已经在 git hub 代码中修复了。看来问题已经被提出并回答了here。 @OmarSamir 也许您也可以在这里发布解决方案。此外,您可能应该将问题链接到 github 的特定提交(查看您问题的 sp 人会看到相同的输出)。 【参考方案1】:

这是正常行为,发生这种情况是因为您的网络对输入的质量过于自信,并且没有学会充分依赖过去(依赖于其内部状态),而只依赖输入。当您在生成设置中将网络应用于其自己的输出时,网络的输入并不像在获得真实输入的训练或验证案例中那样可靠。

我有两种可能的解决方案:

第一个是最简单但不太直观的一个:在输入中添加一点高斯噪声。这将迫使网络更多地依赖其隐藏状态。

第二个,是最明显的解决方案:在训练过程中,以一定的概率 p 提供给它的不是真正的输入,而是它生成的输出。从 p=0 开始训练并逐渐增加它,以便它独立地学习一般越来越长的序列。这称为计划抽样,您可以在此处阅读更多信息:https://arxiv.org/abs/1506.03099。

【讨论】:

根据当前序列中的位置,或者epochs的数量,逐渐增加? 历元数

以上是关于使用 PyTorch 生成 LSTM 时间序列的主要内容,如果未能解决你的问题,请参考以下文章

基于pytorch使用LSTM进行虎年春联生成

Pytorch基础——使用 RNN 生成简单序列

在Python中使用LSTM和PyTorch进行时间序列预测

基于pytorch搭建多特征LSTM时间序列预测代码详细解读(附完整代码)

PyTorch-LSTM时间序列预测中如何预测真正的未来值

PyTorch搭建GNN-LSTM和LSTM-GNN模型实现多变量输入多变量输出时间序列预测