这两天在看RNN,但有个地方很迷惑:

比如最简单的例子,我拿了某股票数据,想通过前五天的股价来预测第六天上涨还是下跌

似乎用RNN会比较好,因为这是个时间序列,可以先输入最后一天的股价,然后依次输入前面四天的,再去调整权值

但疑惑在于,为什么不能直接用普通的神经网路,把五天的股价都作为特征值输入,应该也可以得到结果

可能最后得到的权值也会满足第五天的股价权值最高

刚学了两个礼拜的机器学习,可能问题比较简单,盼解答,谢谢


要理解这个问题,需要弄清楚时间序列预测模型可能在学习什么,以及RNN 相比普通神经网路(下面以NN表示)的优势和特性:

时间序列预测模型可能在学习什么

传统的统计预测模型AR, MA, ARIMA 和 SARIMA 等模型都是一定假设的:例如基于 ETS,Error+Trend+Seasonality,将时序分为以下三部分,并且认为真实的时序是这三部分的相加或者是相乘。

  • Error 就是认为时间序列一般带有一定的随机杂讯
  • Trend 就是认为时间序列可能带有一定的变化趋势
  • Seasonality 就是认为时间序列可能带有周期性(季节周期、年周期、月周期、年周期等)

所以一个预测模型可能需要学习的东西包括时间周期,时间序列的趋势变化等。

ETS 时间序列分解

所以我们假设一个好的预测模型应该具有拟合趋势和周期等特性。当然除此以外,还可能有很多其他丰富的时序特征,例如预测值前 t 个滞后值的最小值、最大值、均值以及一个周期前的 target 值等,这可以依靠具体的领域知识构建相关的特征,所以在使用通用的机器学习模型的时候,例如GBRT,可以通过构造时序特征来进行时间序列预测,并获得比较好的效果。

所以,如果只是直接用前五天的股价作为特征来预测第六天的股价或者是股价的上升/下降,不做任何关于时序的特征工程的话,那么这个神经网路需要同时学习时间序列的趋势、周期等等特性,一般来说是比较难收敛到好的效果的。

基于这样的假设,我关注到 @张戎 提出的一种可以自动进行时序统计特征学习的神经网路,就获得了不错的预测效果。

张戎:基于前馈神经网路的时间序列异常检测演算法?

zhuanlan.zhihu.com图标

RNN 相比普通神经网路的特性

RNN 相比普通 NN 而言,最大的优势是带有动态的记忆性。RNN 将每一个时间点的输出作为下一个时间点的输入,所以在输入最后一个时间点的 [公式] 的时候,RNN 可能记忆著前面 n 个输入的信息,但是这种记忆性和普通 NN 直接将 n 个 X 作为输入不同的地方在于,他具有一定的动态性,他不是和普通的NN一样,将所有输入一视同仁。

如下图,预测值 [公式] 可能只与 [公式] 两个时刻的输入有更大的相关性,而这种动态性学习的过程我认为就是在学习周期、趋势等时间序列特征。

关于 RNN ,特别是 LSTM 的具体介绍可以参考:

Understanding LSTM Networks

结论

RNN 相比普通的 NN 具有更好的学习时间序列特性的能力。在没有构造时序特征的情况下,RNN 能通过动态的记忆过程更容易学习到时序特性,从而获得更好的预测效果。

当然,如果通过特征工程人工构造时序特征的话,就相当于帮助模型提前学习了一定的先验知识,这样会导致普通的机器学习模型和普通的 NN 可以获得比 RNN 更好的预测效果。

以上。

参考

Udacity:Time Series Forecasting?

classroom.udacity.com

Understanding LSTM Networks?

colah.github.io图标


RNN确实是解决问题的办法,不过也要根据具体的业务场景来做。

  1. 之前做过时间序列异常检测场景,就是判断时间序列的当前点是否处于异常。除了特征工程加上 XGBoost 的套路之外,其实也做了深度学习的工作。也就是把时间序列的原始数据(归一化之后)放入前馈神经网路中,当样本量足够大的时候,确实可以做到异常检测的效果,当然样本数据达到一定的数量还是很有必要的。可以参考:张戎:基于前馈神经网路的时间序列异常检测演算法
  2. 除了使用深度学习进行黑盒训练,也可以使用特征工程的方法,使用回归演算法来做。时间序列的特征工程其实还有些技巧。之前写过一些资料,可以参考下:张戎:如何理解时间序列?— 从 Riemann 积分和 Lebesgue 积分谈起,张戎:时间序列简介(一),张戎:时间序列的自回归模型—从线性代数的角度来看,张戎:时间序列的相似性,张戎:时间序列的表示与信息提取,张戎:时间序列的搜索。


RNN 的最主要特色就是支持序列。比较一下RNN和 vanilla NN, 最主要的区别是模型输出对模型本身的影响。VNN 模型输入和输出是简单关系,一个输入对一个输出,这样的模型实际上是把输入数据拍扁了,输入数据相互之间独立,没有关系。比如输入数据序列:123246369,要是直接用VNN,取window size 1,数据变成了1-&>2, 2-&>3, 3-&>2, 2-&>4, 4-&>6, 6-&>3, ...,这样其实丢失了很多信息,即使可以把窗口改成2,3... 仍然是截断了输入数据,导致信息丢失。(当然有极限情况,把所有窗口参数穷举,那会导致数据无穷大而且重复,同时输入数据长度也会不一样。)这里面当然可以用很多Domain Knowledge来确定窗口长短啊,变换什么的,但是无论如何都会丢失一定的信息,尤其是当你不知道序列里面到底有什么样的Pattern。

RNN就是解决这个问题的,之前序列里的pattern其实都可以用上,尤其是LSTM。还是上面那个例子,假设当前输入数据是2,RNN可以看这个2之前是1还是3,从而预测下一个是什么,如果是VNN,就只能用50%的概率猜一下是3或者4。这就是为什么时间序列要用RNN预测,最近5天连续每天小涨,跟著第6天大涨,这个pattern可能有很多次发生,用VNN就会预测这个大概率事件。但如果大势在跌,RNN就会看到并且选择在大势跌的情况下,连续5天小涨,第6天大涨的概率是多少。


我觉得前两名高赞并没有解决这个问题。

题主想问的是,rnn比mlp在时间序列上有什么优势。以下是我关于这个问题一些个人的观点,欢迎大家探讨。

我的观点是:rnn与mlp最大的区别在于,他对于历史信息的捕捉通过的是历史编码向量而不是过去t-1个原始数据。通过这个机制,rnn实际上捕捉了远远多于t-1个的历史信息。

举个例子:股票数据一个重要的周期单位是年。为了能够让普通的mlp模型捕捉到去年今天的股票信息,那么我们需要输入过去250个交易日的记录。照著这个思想,如果我们希望捕捉5年的经济小周期,那就需要把过去1250个交易日的数据作为X一次放入mlp。显然,这是不利于模型开发的。如果是rnn或者lstm,虽然我没有直接输入过去t-1个交易日的原始数据,但是隐向量已经给了我这个信息了。即,隐向量捕捉了更多更远的历史信息。


泻药

有的文章说RNN是处理时间序列的首选网路,而从没有文章说过是唯一网路。

如果固定了就是前四天输入,预测第五天,普通的全连接完全可以解决这个问题,无非是拟合一个四元的高阶函数罢了。

但是大多数的时序问题,输入是变长的,而且非常长。有时输出也要求是变长一个序列。

网路的形状都是固定的,故而普通的全连接无法解决输入输出的变长问题。


推荐阅读:
相关文章