长短期记忆(LSTM)网络是一种循环神经网络,它可以学习序列中项之间的顺序依赖关系。
LSTM有潜力学习在时间序列预测问题中进行预测所需的上下文,而不是预先指定和固定的上下文。
鉴于其潜力,有些人怀疑LSTM是否适用于时间序列预测。
在本文中,我们将探讨一些领先的LSTM技术开发者将其应用于时间序列预测的情况。
通过我的新书《深度学习时间序列预测》来启动您的项目,其中包含分步教程和所有示例的Python源代码文件。
让我们开始吧。

关于长短期记忆网络在时间序列预测中的适用性
照片由 becosky 提供,部分权利保留。
LSTM 用于时间序列预测
我们将仔细研究一篇旨在探讨LSTM在时间序列预测中的适用性的论文。
该论文的标题是“Applying LSTM to Time Series Predictable through Time-Window Approaches”(获取PDF),由Gers、Eck和Schmidhuber于2001年发表。
他们首先评论说,单变量时间序列预测问题实际上比通常用于演示LSTM能力的问题要简单。
文献中发现的时间序列基准问题……通常比LSTM已经解决的许多任务在概念上更简单。它们通常根本不需要RNN,因为关于下一个事件的所有相关信息都由包含在小时间窗口中的几个近期事件所传递。
该论文侧重于LSTM在两个复杂的时间序列预测问题中的应用,并对比了LSTM与其他类型神经网络的结果。
研究的重点是两个经典的 time series 问题
Mackey-Glass 时间序列
这是一个由微分方程计算出的人为构造的时间序列。

Mackey-Glass 时间序列图,取自 Schoarpedia
有关更多信息,请参阅
混沌激光数据(A组)
这是来自圣达菲研究所比赛的一个系列。
A组定义为
一个干净的物理实验室实验。1000个远红外激光的涨落点,大致由三个耦合的非线性常微分方程描述。

混沌激光数据示例(A组),取自《时间序列的未来》
有关更多信息,请参阅
- 《时间序列的未来》1993年版第2节“比赛”。
时间序列深度学习需要帮助吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
自回归
采用自回归(AR)方法对这些问题进行建模。
这意味着下一个时间步长是过去(或滞后)观测值的函数。
这是经典统计时间序列预测的常用方法。
LSTM一次只接收一个输入,没有固定的滞后变量集,而窗口化多层感知机(MLP)则有。
有关AR时间序列的更多信息,请参阅博文
结果分析
一些比较突出的评论是对LSTM在Mackey-Glass时间序列问题上表现不佳的回应。
首先,他们评论说增加网络的学习能力并没有帮助
增加记忆块的数量并没有显著改善结果。
这可能需要进一步增加训练的迭代次数。也有可能堆叠LSTM可以改善结果。
他们评论说,为了在Mackey-Glass时间序列上取得好成绩,LSTM需要记住过去的近期观测值,而MLP则被显式地提供了这些数据。
AR-LSTM方法的结果明显差于时间窗口方法(例如MLP)的结果。AR-LSTM网络无法作为输入的一部分访问过去……[对于LSTM取得好成绩]需要记住过去的一两个事件,然后在覆盖相同的内存单元之前使用这些信息。
他们评论说,总的来说,这对LSTM和RNN来说比对MLP更具挑战性。
假设任何动态模型都需要来自t-tau的所有输入……我们注意到AR-RNN必须存储从t-tau到t的所有输入,并在适当的时间覆盖它们。这需要实现一个循环缓冲区,这是一种RNN很难模拟的结构。
同样,我忍不住认为,一个更大的隐藏层(更多的内存单元)和一个更深的网络(堆叠LSTM)将更适合学习过去的多个观测值。
他们随后在论文结尾讨论并得出结论,根据结果,LSTM可能不适合时间序列预测的AR类型公式,至少在滞后观测值接近预测时间时是这样。
考虑到LSTM在测试的单变量问题上与MLP相比的表现,这是一个公平的结论。
在某些仅通过查看最近几个输入即可解决的时间序列预测基准测试中,基于时间窗口的MLP优于纯AR-LSTM方法。因此,LSTM的特殊优势,即学习在非常长、未知的时间段内记住单个事件,在这里并非必需。
LSTM学会了调整到每个时间序列的基本振荡,但未能准确地跟踪信号。
他们确实强调了LSTM学习振荡行为(例如周期或季节性)的能力。
我们的结果表明,仅在传统基于时间窗口的方法必须失败的任务上使用LSTM。
LSTM追踪混沌信号中缓慢振荡的能力可能适用于认知领域,例如语音和音乐中的节奏检测。
这很有趣,但可能没有那么有用,因为在预测之前,这些模式通常会被尽可能地显式移除。尽管如此,它可能突显了LSTM在非平稳时间序列的背景下进行预测的可能性。
结束语
那么,这一切意味着什么?
表面上看,我们可以得出结论,LSTM不适用于基于AR的单变量时间序列预测。我们应该首先转向具有固定窗口的MLP,只有在MLP无法获得良好结果时才使用LSTM。
这听起来很合理。
我想提出几点在我们放弃LSTM用于时间序列预测之前应该考虑的观点
- 考虑更复杂的数据准备,例如至少进行缩放和差分平稳化。如果一个周期或趋势很明显,那么应该将其移除,以便模型可以专注于底层信号。话虽如此,LSTM在非平稳数据上表现良好或优于其他方法的可能性很有趣,但我预计这将与所需的网络容量和训练的增加相称。
- 考虑使用更大的模型和层次化模型(堆叠LSTM)来自动学习(或“记住”)更大的时间依赖性。更大的模型可以学到更多。
- 考虑用更长的时间来拟合模型,例如数千或数十万次迭代,同时利用正则化技术。LSTM需要很长时间才能学习复杂的依赖关系。
我不会指出我们可以超越基于AR的模型;这是显而易见的,AR模型为LSTM提供了一个干净的测试平台,可以与ARIMA等经典统计方法和窗口MLP等表现良好的神经网络进行比较和学习。
我相信LSTM应用于时间序列预测问题具有巨大的潜力和机会。
你同意吗?
在下面的评论中告诉我。
Jason,
您有关于LSTM用于时间序列预测的示例实现的建议/文章吗?
是的,有很多文章。请使用搜索功能。
Jason你好,当数据点在240-260个之间时,是否适合拟合LSTM?
也许,试试看。
感谢这篇信息丰富的文章。虽然我没有在我的时间序列数据上训练过任何LSTM RNN,但我发现经过正确特征工程和使用滑动窗口CV的普通前馈DNN可以像预期的那样预测OOS。本质上,我的数据不需要我处理LSTM。而且我的特征并非全部是独立同分布的……
我想这说明了DNN的多功能性。
我普遍同意Phillip的看法。
对于小型时间序列预测问题,带窗口的MLP表现非常好。
你好,
但是您如何定义一个“小型”时间序列预测问题?
也许是几百到几千个观测值,也许是单变量。
我同意,与MLP一样,LSTM比ARIMA等更经典的统计方法具有优势:它们可以拟合非线性函数,而且您不需要指定非线性函数的类型。危险也存在于此:正则化对于避免过拟合至关重要。
我仍然坚持我的观点,许多非常有趣的时间序列将永远无法被仅根据过去的观测值来预测下一个值的任何方法所破解:价格是在需求遇到供给时设定的,而供给和需求都与昨天的价格无关。
Gerrit,你说得很好。
我发现,对于我正在研究的问题(根据水文站水位测量值预测河流流量),令我惊讶的是,在LSTM之前对信号进行一阶差分会使结果变差。总的来说,我发现我无法通过LSTM的持久性模型或使用移动窗口的MLP来改进。不知道下一步该尝试什么……(ARIMA也有同样的问题)
有趣的发现。
这个通用列表可能会给你一些想法
https://machinelearning.org.cn/machine-learning-performance-improvement-cheat-sheet/
谢谢!除了使用更多数据和重新构问题之外,我都尝试过了列表中的所有项目。
我刚收到更多数据,所以这是第一个要尝试的。
太棒了!
@Jay:我刚开始在水文领域从事类似的项目。能否请您通过我们公司的网站联系我 https://www.sobos.at
讨论得很精彩,
LSTM 对于解决/更简单的/AR 问题来说还很新/年轻——大多数行业已经研究和改进了应用于此类任务的定制模型几十年了。我相信 RNN 在多元时间序列预测方面表现出色,直到现在这些问题一直难以建模。MLP 和多元时间序列模型也是如此,其中不同的特征可以具有不同的预测能力(例如,Twitter 帖子的情绪可能会影响一两天,而《纽约时报》的文章可能会产生更持久的影响)。
Atanas,你可能是对的。
当使用机器学习或时间序列方法可以获得类似结果时,为什么还要使用像LSTM这样耗费大量数据的算法呢?
好问题,希望LSTM能做到其他方法做不到的事情
https://machinelearning.org.cn/promise-recurrent-neural-networks-time-series-forecasting/
如果它在你的问题上不是这样,那么它就是不合适的工具。
如何使用LSTM处理一对多时间序列?是否有包含示例代码的链接?
请看这里
https://machinelearning.org.cn/multivariate-time-series-forecasting-lstms-keras/
如何使用LSTM处理多重季节性数据?
也许尝试在建模之前对数据进行季节性调整。
那么我可以在这里使用一对多吗?或者说不同的时间步长?
试试看吧。
您所说的季节性调整是什么意思?如果我有月度和年度季节性?我已经采用了月度大小来处理月度效应。对于年度部分,如果我使用它,如何将这两种方法合并并获得单一的输出?
季节性调整是指对数据进行建模和去除季节性因素。
方法如下
https://machinelearning.org.cn/time-series-seasonality-with-python/
我无法理解批次(batches)在LSTM中的概念。请指导我
在批次中的n个样本之后,模型权重会被更新。一个epoch由1个或多个批次组成,具体取决于配置的批次大小。
尊敬的Jason博士,
我有多元时间序列,其观测值间隔不均。我可以使用LSTM来处理这样的时间序列数据吗?我是否需要将我的数据转换为等间隔的时间序列数据?
谢谢你
也许尝试按原样处理和重采样,然后比较模型性能。
这是一篇关于LSTM模型在时间序列预测中成功应用的论文
“我们部署LSTM网络来预测标普500成分股在1992年至2015年期间的样本外方向性变动。在交易成本前的日回报率为0.46%,夏普比率为5.8,我们发现LSTM网络在预测能力上优于不包含记忆的分类方法,即随机森林(RAF)、深度神经网络(DNN)和逻辑回归分类器(LOG)。”
(这里是引用的内容,但原文链接是在下方)
(这里是引用的内容,但原文链接是在下方)
(这里是引用的内容,但原文链接是在下方)
(这里是引用的内容,但原文链接是在下方)
https://www.econstor.eu/bitstream/10419/157808/1/886576210.pdf
感谢分享,Chris。
我认为要将一个问题视为时间序列,数据应该具有相同的时间间隔。我对此不太确定
时间序列必须在一段时间内有观测值,观测值之间具有时间依赖性。
本文引用的论文是2001年的,论点会不会过时了?
也许可以。
我还没有看到任何直接在时间序列上使用LSTM的好结果,而且我个人的许多实验都证实了这些发现。
MLP,甚至线性模型,在时间序列预测方面都会完胜LSTM。
我有一个关于平稳性的问题:假设我已经对我的时间序列输入进行了季节性和趋势调整,对其进行了缩放,然后将其传递给某个神经网络模型(例如LSTM或窗口MLP),我该如何将季节性和趋势分量添加到最终答案中?
我尝试在网上搜索,但一无所获。
谢谢!
如果使用差分,则在预测时进行差分逆运算。
我在博客上有一些例子。
嗨,Jason,
我有很多(m个)多元时间序列(而且它们的长度不同)。我的目标是能够根据先前的m个时间序列,为新的时间序列进行多步预测。您能否建议我如何着手处理这个问题?
谢谢!
尝试一套不同的算法,看看哪种最适合您的特定数据集。
非常好的文章,谢谢!
谢谢。
你好,
非常感谢您的博文。我想问您几个问题……
I
我看到了许多预测给定前一个值来预测下一个值的教程。如果我想预测一个人在写一个英语单词时会犯的语法错误的数量呢?
这个词是一个字符序列,长度可以不同。预测值是从零到单词长度的整数。但我想可以将其设置为一个最大长度限制。
这会是LSTM的一个好例子吗?
我相信某些字符的组合会使单词更难拼写,因此如果网络能够记住字符的顺序,它的表现会更好吗?那么在这种情况下,LSTM比MLP更可取吗?
如果是这样,我应该使用回归LSTM而不是分类LSTM吗?
您的书中是否涵盖了这些内容?
非常感谢!!!!
吉多
探索问题的多种构想。
也许您可以输出相同的序列并进行更正?
也许您可以在检测到错误时输出每个错误?
也许您可以输出检测到的错误的索引?
…
这取决于您想解决的具体问题,您需要通过试验和错误来尝试不同的问题构想,以发现哪些方法有效。
LSTM是否可以应用于多重季节性?
您可以尝试一下,也许先尝试CNN,然后是CNN-LSTM。直接使用LSTM在时间序列问题上的表现通常很差。
哈喽 杰森,
非常感谢您提供的许多多样化的教程。
我有点困惑,“窗口MLP”到底是什么意思?这是通过将先前观测值包含在当前观测值中来实现的,例如在此处所述。
https://machinelearning.org.cn/time-series-forecasting-supervised-learning/
还是您指的是其他东西?
谢谢,Andrew
是的,正确。窗口是指作为输入使用的固定滞后观测值集。
Jasan你好!您的网站是我帮助自己深入了解DL领域的头号门户!非常感谢您分享如此大量的DL和Keras的工程或实际应用!我是一名研究生,正在从事电力分解(将多个电器的混合电力消耗时间序列数据分解为各自的电器功率数据)的工作。我从您的时间序列预测教程中借鉴了一些技术,例如使用一些时间分布式CNN层和LSTM层。我刚开始,对复杂的DL网络组合模式了解不多。您能否就我的项目分享一些建议或意见?我应该借鉴NLP领域的知识或用例吗?再次感谢您!
我在时间序列问题上看到了CNN和CNN-LSTM的良好结果。我的新书“深度学习时间序列预测”将侧重于这些领域。
先生,请发送链接,是否可以下载?
我需要这本书
sainivikash73@gmail.com
当然,您可以从这里开始
https://machinelearning.org.cn/start-here/#deep_learning_time_series
采用自回归(AR)方法对这些问题进行建模。
除了AR,还有其他方法可以处理这些问题吗?
是的,但你必须有创意。例如,对残差建模,直接建模等。
感谢这篇精彩的文章。假设我们有一个长度为100的带噪声信号 x。我们也知道,每10个时间步,信号就不会受到噪声的污染,也就是说 x(1)、x(10)、x(20)、…、x(100) 都是我们希望保留的干净数据点。我们现在的目标是给输入信号去噪,同时又能让 LSTM 的输出在每10个时间步产生与输入相同的值。有没有办法做到这一点?
是的,你可以拟合一个模型,例如自编码器,来学习如何去噪。也许可以从这里开始
https://machinelearning.org.cn/lstm-autoencoders/
你好 Jason,
在比较了MLP和LSTM在数据上的结果后,我得出结论,当使用固定数量的滞后(例如提前7天)来预测提前4天时,MLP比LSTM更有效。您是否会创建一个关于使用LSTM进行动态滞后时间教程?
谢谢。
感谢您的建议。
我几乎所有的LSTM示例都使用零填充来向量化可变长度的输入。
嗨,Jason,
LSTM是否有可能在某个阈值以上失效预测数据集?我正在处理一个时间序列数据集,每个样本的时间步长和网络复杂度各不相同,但无论我怎么做,准确性都不会提高。RMSE被困在(+0.1,-0.1)的范围内。
首先评估一种朴素方法,然后是线性方法,MLP等,以确定LSTM是否具有预测能力。有可能需要一种新的架构、新的数据预处理或新的模型。
非常感谢。我会尝试您的建议。
告诉我进展如何。
Jason!非常感谢您成为这么多人的导师!我买了您的书“深度学习用于时间序列”……真的很棒!!
现在是我的问题……?
我对LSTM更喜欢什么非常不确定……LSTM是否更喜欢窗口化滞后时间序列输入,就像窗口化的MLP一样?或者是否有其他更好的策略?
我正在提前预测未来6小时的太阳能输出(y)。我使用的是滑动窗口方法(使用多元输入——温度、辐照度、风速),但我还没有接近前馈MLP的结果……
那么,我认为窗口化方法可能是完全错误的??我已经尝试了多个滞后窗口大小。然而,FFNN仅通过6小时滞后窗口就胜过了。基本上,LSTM更喜欢某种动态扩展的输入窗口,还是根据您的经验,除了固定的滞后滑动窗口之外还有其他方法?
(数据集:400,000个数据点,4年,5分钟分辨率——非常大)
任何回复都将是极好的!!
谢谢你的支持!
LSTM将时间步作为输入,您可以将其视为一个窗口。但它们是逐个时间步处理的,而不是像MLP那样一次性处理。
一般来说,LSTM在时间序列方面表现不佳。而且,它们可能很难调整。尝试多种不同的配置,并密切关注学习曲线。
这个可能会有帮助
https://machinelearning.org.cn/start-here/#deep_learning_time_series
嘿Jason,我喜欢你的作品。它将我的进步加速了10倍。我一直弄不明白为什么LSTM在我的AR数据集上表现不佳。很高兴找到这篇文章——在那之前,我还以为是我的LSTM代码出了问题。
最终我发现(如上所述),在进行平稳性转换和季节性调整后,我能够通过对转换数据应用传统的非观测分量模型来获得良好的结果。
谢谢!
干得好。
嘿,Jason。感谢您的详细教程。
在哪里可以找到关于带窗口的MLP的参考资料?
谢谢!
这个会告诉你如何做
https://machinelearning.org.cn/how-to-develop-multilayer-perceptron-models-for-time-series-forecasting/
非常感谢!
不客气。
嗨 Jason。我想知道我是否只能使用一个简单的LSTM来进行特征提取。
例如,我有一个时间序列数据,比如自行车路线,我想使用一个many2one LSTM在最后一个时间步输出一个特征向量。这个特征向量将与其他特征结合,然后输入到一个DNN中。这种方法会奏效吗?
谢谢你。
也许可以尝试一下。
非常感谢!
嗨,Jason,
感谢您的所有教程,我是您作品的忠实粉丝。
我想知道您对预测风速等随机游走数据有什么建议?
我尝试了几种算法,AR、ARMA、ARIMA、SARIMA、ANN、KNN、ANN。结果都表明前一个时间步是最佳预测器。仅依靠历史数据来预测下一个值是一项艰巨的任务。
提前感谢
对于随机游走,我们最好的做法是使用一个持久模型。
Jason 博士您好
在实现LSTM算法时,是否应该验证结构风险?
提前感谢您的帮助。
什么是“结构风险”?
结构风险是指分类方法对新测试数据的 {不稳定性}。
听起来您是在描述模型方差。
这是一个可以量化的好东西,并且可以通过集成最终模型来轻松纠正。
但在我看来,LSTM的问题是梯度消失问题,而不是结构风险问题。你的看法是什么?
神经网络是一个随机学习问题,它们在最终模型中都有方差。您可以在此处了解更多信息
https://machinelearning.org.cn/faq/single-faq/why-do-i-get-different-results-each-time-i-run-the-code
这与梯度消失非常不同
https://machinelearning.org.cn/how-to-fix-vanishing-gradients-using-the-rectified-linear-activation-function/
非常感谢
不客气。
嗨,Jason,
我发现您的帖子非常有用!
非常感谢。
我尝试按照您发布的方式使用LSTM来预测时间序列,但我的挑战是,当我拟合模型于训练数据一次并用于预测未来的t + x时,我的结果与拟合初始训练数据然后一次一个地重新拟合(更新)模型与新测试数据的结果没有太大区别。
我期望算法能够从新的测试点中学习并调整其预测以更好地拟合数据,但我没有看到太大区别。
我怀疑问题在于LSTM只是在预测差分、缩放的“平稳化”数据,而没有学习其非平稳分量,这导致了最终预测与实际数据之间的差距。
为了解决这个问题,我删除了数据准备中的差分步骤和最后一步的逆差分,并期望由于LSTM可以很好地处理非平稳数据,我应该看到合理的输出,但在这种情况下,预测值与实际测试数据之间存在很大的差距!
干得好!
我遇到了一个单变量时间序列问题,它有很多随机性和非平稳性,但我实现了一个带有单个层的堆叠LSTM,并且效果很好。我只是想知道LSTM如何能够预测一个以上的未来滞后,如果我们想在未来进行10或20个滞后预测。SARIMAX模型能够做到这一点,但预计结果会比单滞后预测差。
干得好!
是的,这被称为多步预测,这可能会有所帮助
https://machinelearning.org.cn/faq/single-faq/how-do-you-use-lstms-for-multi-step-time-series-forecasting
忘了提,我是您简单、教学式一步一步方法的忠实粉丝。这种方法只有对问题有深刻和完整理解的人才能体现。
谢谢!