序列预测问题,CNN、RNN各有什么优势?

论坛 期权论坛 工作     
爱用户   2020-1-7 21:56   2045   5
通常而言,具有空间结构pattern的问题,比如图像识别,CNN是广泛应用的框架;而具有时间结构pattern的问题,比如序列标注、机器翻译等问题,RNN/LSTM是通用的框架。我的疑问是,空间问题和时间问题的本质区别是什么?之所以这么问,一个原因是有时候空间和时间没有绝对的区分,比如我要预测股价,看起来是个时间序列问题,但如果我把每天的股价画在坐标轴上(横坐标是时间,纵坐标是股价),我也可以把这条曲线看成一种空间上的结构。所以看起来这种问题,CNN、RNN都可以用。那么CNN和RNN在学习序列特征的时候区别在哪里?我猜想到的一点,时间序列数据很多时候会有周期性,是不是RNN更善于发现这种周期性?
分享到 :
0 人收藏

5 个回复

倒序浏览
2#
热心回应  16级独孤 | 2020-1-7 21:56:15 发帖IP地址来自
RNN的序列和CNN的空间,是有区分的
序列问题,强调的是先后顺序,这也引申出上下文的概念,一个翻译问题,这个词的含义可能和前后的单词形成的这个组合有联系(Skip-gram),也可能是它之前的所有单词都有联系(Attention),并且,借助RNN的state这样的记忆单元,使得一个序列位置的输出在数学上和之前的所有序列的输入都是有关系的。当然原始的RNN由于梯度的乘性问题,前面的序列的影响近乎为0,这个后面又用LSTM来修正为加性问题。RNN的数学基础可以认为是马尔科夫链,认为后续的值是有前者和一些参数的概率决定的。
CNN的卷积核,强调的是空间中的窗口,这个窗口和序列问题相同之处在于同样考虑前后,但RNN没有也不会考虑到空间上下问题。类似股票的价格,也不会在同一个x上出现多个y(价格),整个空间只有一条线,这样的数据密度本身也是不适合用CNN的
我们可以设想这样的场景:使用CNN的一个
的卷积核对一个1维特征的m个样本做处理(其实按道理这样的维度是对不上的,不过加一个转置即可,大致想象扫过那样的样本),那么它会输出一个m-n+1维的向量。但你会很容易明白本质上其实就是一个DNN的全连接了
又及:这样说来为什么不能用DNN取代RNN呢,其实和为什么不能用DNN取代CNN的答案一样,CNN和RNN同样是用一组参数作为窗口,去扫过整个样本集,而不需要像DNN一样使用一个超大规模的参数网络去连接这个样本。
@王赟 Maigo 提到的输出向量的选取其实是个小问题,因为不管是RNN还是CNN都可以最后连上一个全连接层把维度降下来。但确实,没必要舍近求远
再及:有没有使用CNN处理序列问题的应用?有,[1705.03122] Convolutional Sequence to Sequence Learning FAIR这篇 就是在翻译问题上使用了CNN,只不过这样的结构和楼主想要的那种不大一致,它的架构是这样的:

它这里的CNN主要是想使用CNN并行速度快的优势,把k个d维词嵌入向量映射到2d维上,随后对这个向量做处理
现代的神经网络设计不会只有CNN或者只有RNN,通常都是一个较为复杂(还得经过数学考验)的合理结构
3#
热心回应  16级独孤 | 2020-1-7 21:56:16 发帖IP地址来自
强达一发。

不能直接用rnn做预测,效果一点也不好。Github上已经有很多demo 了,预测周期函数的叠加还可以但是预测真实股价,汇率,比特币就呵呵了。因为实际价格走势非周期非线性非平稳,浅层的rnn不行。

那么稍微深一点的行不行?效果也不好,大方向是对的,但是误差比较坑爹。目前看到的国内外论文都是先做数据分解再深度学习,误差也有个2-3%。

说到数据分解,又有几种大类,傅立叶,小波是最常用的,但是傅立叶不能吃处理非周期非平稳信号,小波不能处理非平稳,况且小波基选择也是一门艺术,比较多的是haar, db 。

信号分解完一般也不是直接Rnn而是比较多的做一些预处理。这时候就可以用到CNN了,比如keras tutorial里面提到的CNN自动编码机之类,也看到过国内一片论文预测电力负载用kmeans,总之各种AE百花齐放。这些步骤完了才是各种rnn。

rnn变形多,你关注时序的话Google times frequency rnn 会看到tf里面有一个现成code,以及对应的arvix论文,当然我看完。。。理解一半,也没看出来time frequency在哪里。。。。。

上面是我对自己搜集到的资料的一点汇总。

继续股价这个问题,除非你是机构你能拿到tick或者level10,或者你根本拿不到全部数据,比如场外市场之类的外汇或者比特币,因此到你手头的大概率是ohlc,这个数据最大的问题其本身已经是对市场的采样了,而且这个采样根本不是单纯的时域或者频域采样,你完全不清楚不hl具体发生在哪个时刻,甚至顺序上也不知道hl还是lh,所有这个K线对应的时间信息都被丢失,只保留有限的四个数据,这个对深度学习是非常坑爹的。

我好像把问题答歪了,CNN完全可以用来做特征提取,压缩降維,和rnn不冲突不矛盾。
4#
热心回应  16级独孤 | 2020-1-7 21:56:17 发帖IP地址来自
你的理解没有错,在语音识别上,很多主流技术已经转向到CNN模型,优点在于CNN平移不变性在特征提取上不会破坏信号频谱,但是也要考虑结合LSTM做时间上的记忆,具体参考:详解卷积神经网络(CNN)在语音识别中的应用
5#
热心回应  16级独孤 | 2020-1-7 21:56:18 发帖IP地址来自
说实话,你提到的股价预测问题,一般是用 RNN 解决的,用 CNN 来做比较奇怪。
其中的原因,一是用 CNN 处理图像的时候,一般是想对图像整体进行某种识别,而不是预测图像的某一部分。
更重要的是,把股票数据当成时间序列的时候,你的预测值是一个数(例如 5),这个数可以跟真实的股价(例如 6)去做差,用差的平方或者差的绝对值做损失函数,这是非常自然的。而你转换成图像数据后,你每次的预测值是一列像素,而真实股价也是一列像素,把这两列像素看成两个向量,那么向量常用的距离量度(如欧氏距离、余弦距离)代表的并不是对「预测误差」的自然理解。
举个例子,比如股价的波动范围为 1~10,真实股价为 6,那么代表真实股价的一列像素就是
。而你的预测可能是
,代表有 40% 的可能性股价为 4,60% 的可能性股价为 5。你的预测也可能是
,代表有 40% 的可能性股价为 10,60% 的可能性股价为 2。按照自然的理解,预测
应该比预测
更「准」一些,即更接近
。然而,不管你用欧氏距离还是余弦距离,你都会发现

当然你可以设计比较复杂的距离函数,但何必多此一举呢?直接用 RNN 不好吗?
6#
热心回应  16级独孤 | 2020-1-7 21:56:19 发帖IP地址来自
RNN的主要目的在于给予数据的连续性。也就是让数据有上下文环境。
换句话说,就是给予数据不同的状态,RNN试图利用输入的feature vector 再预测下个feature vector的同时,描述下个feature vector的状态。
所以你明白了这点,就知道RNN其实是一个类似状态机的东西,上一个时刻的状态会影响下一个时刻的状态。所以对于RNN来说,最合适的任务就是类似翻译呀,手写识别呀,语音识别呀,这种上一个输入对下一个输出有影响的事情上。比如对于语音识别,你说了一个“我”,那么下一个时刻你最有可能说的是“们,是……”等,所以你就进到了一个“我”的状态。LSTM则是一种改进,有的时候我们虽然说了“我”但是却并不在想进入“我”状态,这个时候就需要忽略掉当前的状态,举个例子,比如你现在feature vector描述了一个空白音,那么很大可能就说明“我”状态已经结束掉了,因为用户可能要说新的一句话了,keep这个“我”状态已经失去了意义,这个时候我们选择忘记。
另外,RNN还有一个非常重要的作用就是解决了输入变长的问题。比如你用CNN去做一个股价预测,那么很显然,你的图像是越来越大的,因为你每次绘制一个点,你的图像就会延长一截,如果你压缩数轴,那么就会影响之前的训练结果。所以你需要用比如SPP net这样的东西帮你统一输入。然而RNN就没有这个问题,因为你的输入其实就是坐标点加上一个时序,坐标点显然维度是固定的。这样就比较简单的解决了输入变长的问题。
实际上,我们可以利用CNN对LSTM的输入做第一步处理以减少维度,因为对于LSTM的每步输入,feature的维度都是固定的,这非常利于CNN发挥。然后再把结果给LSTM,这样会让LSTM更有效率。举个例子,比如我把一个语言切块,那么CNN一上来就直接把某块识别成了“我”,那么在把“我”输入给LSTM,那么LSTM自然就会认知到我们现在应该进到了“我”状态。
最后总结一下,CNN更加适合描述某一空间的状态,而RNN则是把空间状态连在一起,以形成时间概念。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:31799
帖子:6375
精华:1
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP