[译]使用递归神经网络(LSTMs)对时序数据进行预测

使用长短时记忆网络(LSTMs)来预测将来货币汇率变化

Statsbot 团队已经发表了一篇关于使用时间序列分析进行异常检测的文章。今天,咱们将讨论使用长短时记忆模型(LSTMs)进行时间序列的预测。咱们请数据科学家 Neelabh Pant 向你们来说述他使用循环神经网络预测汇率变化的经验。前端

做为一个生活在美国的印度人,我和个人家人之间会有源源不断的资金流相互流转。若是美圆在市场上走强,那么印度卢比(INR)就会下跌,所以,一个印度人将要用更多的卢比来购买一美圆。若是美圆走弱,你就会花更少的卢比去购买一样的一美圆。python

若是你能预测出明天的一美圆是什么价格,那么它就能指导你的决策,这对于最小化风险和最大化回报是很是重要的。经过观察神经网络的优点,特别是循环神经网络,我想到了预测美圆和印度卢比的汇率。android

预测汇率的方法有不少,例如:ios

  • 购买力平价(PPP),它将通货膨胀考虑在内并计算通胀的差别。
  • 相对经济实力方法,它考虑了各国经济增加,以此对汇率的走势进行预测。
  • 计量经济模式 是另外一种经常使用的汇率预测技术,能够根据预测者认为重要的因素或属性进行定制。这样的因素或属性多是不一样国家之间存在的利率差别、GDP 的增加率和收入增加率等特征。
  • 时间序列模型 则是纯粹取决于过去的变化行为和价格模式来预测将来的汇率对应价格。

在本文中,咱们将告诉你如何使用机器学习进行时间序列分析来预测将来的汇率变化。git

序列问题

让咱们从顺序问题开始。涉及序列的最简单的机器学习问题是一对一问题。github

一对一算法

在这种状况下,模型的输入数据或输入张量只有一个,同时模型根据给定的输入生成一个对应的预测。线性回归、分类和使用卷积网络进行的图像分类都属于这一范畴。将其进行拓展,能够容许模型使用输入和输出的旧值。编程

这就是一对多问题了。一对多问题开始时就和一对一问题同样,模型有一个输入,同时生成一个输出。然而,模型的输出如今做为新的输入反馈给模型。模型如今能够生成一个新的输出,咱们能够这样无限地继续循环下去。如今你能够看到为何这些被称为循环神经网络了。后端

一对多网络

使用递归神经网络处理序列问题,由于它们均可以链接造成一个有向的循环。换句话说,经过使用它们本身的输出做为下一个步骤的输入,它们能够保持从一个迭代到下一个迭代的状态。使用编程的术语来讲,这就像是在运行一个固定的程序,其中带有特定输入和一些内部变量。若是咱们在时间轴上将其展开,最简单的递归神经网络能够看做是一个彻底链接的神经网络。

在时间轴上展开的 RNN

在这种单变量状况下,只涉及到两个权重。权重 u 乘以当前的输入 xt,而另外一个权重 w 乘之前一次的输出 yt-1 。这个公式相似于指数加权移动平均方法(EWMA),它将过去的输出值与当前的输入值结合起来。

能够经过简单堆叠神经网络单元来创建一个深层的循环神经网络。一个简单的循环神经网络只对短时间记忆有效。若是咱们有长期记忆的需求,就会发现它对此有根本上的不足。

长短时神经网络

正如咱们已经讨论过的,一个简单的循环网络存在一个根本问题,即不能捕获序列中的长时依赖关系。咱们构建的 RNNs 在分析文本和回答问题时,涉及到跟踪长序列的单词,因此这将会是一个问题。

在 90 年代后期,LSTM 是由 Sepp Hochreiter 和 Jurgen Schmidhuber 提出的,用来替代 RNNs、隐马尔科夫模型以及其它众多应用中的序列学习方法,相比于它们 LSTM 对时间间隔长度不敏感。

LSTM 网络结构

该模型是一个操做单元,其中包括几个基本操做。LSTM 有一个内部状态变量,它从一个单元传递到另一个单元,并由 操做门 来修改。

  1. 遗忘门

使用一个 sigmoid 层来接收前一个时间节点 t-1 的输出和当前时间节点 t 的输入,将其合并成为一个张量(tensor),而后在其后应用一个线性变换。通过 sigmoid 激活函数后,遗忘门的输出为 0 到 1 之间的数值。这个数值将会与内部状态相乘,这也就是为何它会被称为遗忘门的缘由。若是 ft=0,则彻底忘记以前的内部状态,若是 ft=1 ,则会没有任何改变地经过。

  1. 输入门

输入门接受先前的输出和新输入,并将其传递到另外一个 sigmoid 层。输入门返回的也是 0 到 1 之间的值。而后输入门返回的值与候选层的输出相乘。

这一层对输入和先前层的输出进行混合,而后应用双曲切线激活,返回一个候选向量添加到内部状态上。

内部状态更新规则以下:

以前的状态乘以遗忘门输出,而后添加到输出门容许的新的候选项中。

  1. 输出门

输出门控制着有多少内部状态被传递给输出,它的工做方式相似于其它的门结构。

上面描述的这三个门结构具备独立的权值和误差,所以网络须要学习有多少过去的输出须要保留,有多少当前的输入须要保留,以及有多少的内部状态须要被传送到输出。

在递归神经网络中,须要输入的不只仅是当前网络的输入数据,还有该网络的前一个时刻的状态数据。例如,若是我说“嘿!我在开车的时候发生了一件疯狂的事情”,而后你的大脑某个部分就开始转动开关,说“哦,这是 Neelabh 告诉个人一个故事,故事的主角是 Neelabh,路上发生了一些事情。”如今,你就会保留一部分我刚才告诉你的句子的信息。当你听我讲其它句子的时候,为了理解整个故事,你必须保留一些以前句子信息中的记忆。

另一个例子是使用循环神经网络进行视频处理。在当前帧中发生的事情很大程度上取决于上一帧的内容。在一段时间内,一个循环神经网络应该学习到保留什么、从过去的数据中保留多少、以及对当前状态保留多少的策略,这使得它比简单的前馈神经网络更增强大。

时间序列预测

我对循环神经网络的优点印象是很深入的,决定使用它来预测美圆和印度卢比的汇率。本项目使用的数据集是 1980 年 1 月 2 日至 2017 年 8 月 10 日的汇率数据。稍后,我会提供一个连接来下载这个数据集并进行实验。

表 1 数据集示例

数据集显示了 1 美圆的卢比价值。从 1980 年 1 月 2 日到 2017 年 8 月 10 日,咱们总共有 13730 项记录。

USD 对 INR

从整个阶段看,1 美圆的卢比价格一直是在上涨的。咱们能够看到,美国经济在 2007 到 2008 年间大幅下滑,这在很大程度上是由那段时期的大衰退形成的。2000 年代末至 2010 年代初,全球市场广泛经历了经济衰退。

这段时期对世界上的发达经济体来讲并非很好,特别是北美和欧洲(包括俄罗斯),它们已经陷入了严重的经济衰退。许多较新的发达经济体受到的影响要小得多,特别是中国和印度,这两个国家的经济在这段时期大幅增加。

训练-测试数据划分

如今,要训练模型,咱们就须要将数据划分为测试集和训练集。处理时间序列时,以一个特定的日期将其划分为训练集和测试集是很是重要的。因此,咱们不但愿看到的是测试数据出如今训练数据以前。

在咱们的实验中,咱们将定义一个日期,好比 2010 年 1 月 1 日,做为咱们分开的日期。训练数据是 1980 年 1 月 2 日至 2009 年 12 月 31 日之间的数据,大约有 11000 个训练数据点。

测试数据集在 2010 年 1 月 1 日到 2017 年 8 月 10 日之间,大约 2700 个数据点。

测试-训练数据划分

接下来要作的是对数据集进行规范化。只须要调整和变换训练数据,而后变换测试数据便可。这样作的缘由是,假定咱们是不知道测试数据的规模的。

对数据进行规范化或变换是指应用一个新的介于 0 和 1 之间的缩放变量。

神经网络模型

全链接模型是一个简单的神经网络模型,它被构建为一个单输入单输出的回归模型。基本上是取前一天的价格来预测次日的价格。

咱们使用均方差做为损失函数,使用随机梯度降低做为优化器,在训练足够多的时期(epochs)后,将会找到一个较好的局部最优值。下面是全链接层的概要。

全链接层概要

在将该模型训练到 200 个时期后或者不管出现哪一个 early_callbacks(即知足条件的提早终止回调)以后,该模型经过训练学习到数据的模式和行为。因为咱们将数据分为训练集和测试集,咱们如今能够预测测试数据对应的数值了,并将其与真实值进行比较。

真实值(蓝色)对 预测值(橙色)

正如你所看到的,这个模型的表现并很差。它本质上就是重复前面的数据,只有一个轻微的变化。全链接模型不能从单个先前值来预测将来的数据。如今让咱们来尝试使用一个循环神经网络,看看它作得如何。

长短时记忆

咱们使用的循环网络模型是一个单层的顺序模型。在咱们输入维度形状为 (1,1) 的层中使用了 6 个 LSTM 节点,即该网络的输入只有一个。

LSTM 模型概要

最后一层是密集层(即全链接层),损失函数采用的是均方差,优化器使用随机梯度降低算法。咱们使用 early_stopping 回调对这个模型进行了200次的训练。模型的概要如上图所示。

LSTM 预测

这个模型已经学到了重现数据在年度内的总体形状,并且不像前面使用简单的前馈神经网络那样有延迟。可是它仍然低估了一些观察值,因此该模型确定还有改进的空间。

模型修改

该模型能够作不少的改变来使它变得更好。通常能够直接经过修改优化器来更改模型训练配置。另一个重要的修改是使用了滑动时间窗口的方法,它是来自于流数据管理系统领域的方法。

这种方法来自于这样一种观点,即只有最近的数据才是重要的。你可使用一年的模型数据,并试着对下一年的第一天作出预测。滑动时间窗口方法在获取数据集中的重要模式方面很是有用,这些模式高度依赖于过去的大量观察。

你能够尝试根据我的喜爱对该模型进行修改,并查看模型对这些修改的反应。

数据集

我在 github 帐户的仓库中 deep learning in python 提供了该数据集。请随意下载并使用它。

有用的资源

我我的关注了一些喜欢的数据科学家,好比 Kirill EremenkoJose PortillaDan Van Boxel(即著名的 Dan Does Data)等等。他们中的大多数人均可以在不一样的博客站点上找到,他们的博客中有不少不一样的主题,好比 RNN、卷积神经网络和 LSTM,甚至最新的神经图灵机技术。

保持更新各类人工智能会议的新闻。顺便说一下,若是你感兴趣的话,Kirill Eremenko 将会在今年的 11 月份来到圣地亚哥和他的团队一块儿作关于机器学习、神经网络和数据科学的演讲。

结论

LSTM 模型足够强大,能够学习到最重要的过去行为,并理解这些过去的行为是不是进行将来预测的重要特征。在许多应用程序中,LSTM 的使用率都很高。一些应用好比语音识别、音乐合成和手写识别,甚至是在我目前的人口流动和旅游预测等的研究中。

在我看来,LSTM 就像是一个拥有本身记忆的模型,在作决定时能够表现得像一个聪明的人。

再次感谢,并祝在机器学习的学习过程当中获得快乐!

若是发现译文存在错误或其余须要改进的地方,欢迎到 掘金翻译计划 对译文进行修改并 PR,也可得到相应奖励积分。文章开头的 本文永久连接 即为本文在 GitHub 上的 MarkDown 连接。


掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 AndroidiOS前端后端区块链产品设计人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划官方微博知乎专栏

相关文章
相关标签/搜索