首先为啥使用因果卷积,我觉得以多变量数据序列预测来讨论会比较好理解

之前的写错了写错了,

首先需要知道的是,普通的cnn也是可以用于时间序列预测的,只不过实践中,wavenet、tcn这类的序列模型在时间序列预测的表现比较出色,所以因果+空洞卷积的组合才火起来了,使用传统的cnn建模的例子也有很多,可见:

https://machinelearningmastery.com/how-to-develop-convolutional-neural-network-models-for-time-series-forecasting/machinelearningmastery.com



CNN指标预 cnn做预测_卷积核


这个图是常规的卷积,首先,还是举个例子好理解一点,一般来说,使用nn来进行时间序列的预测的时候,数据都会整成这个样子,以温度预测为例:

训练数据

温度 压强

t-2时刻 [ 20 200]

t-1时刻 [30 300]

t时刻 [40 400]

标签:

温度

t+1时刻 50

t+2时刻 60

上面是一个2元2步时间序列预测

然后卷积是怎么卷的,是横着卷的不是竖着卷的,假设卷积核size为2,不做补0的操作,并且假设卷积核对应的权重为[1,1]吧

则是这样卷的:

[20,200](卷积运算)[1,1]=220,经过relu之后还是220,这个时候使用普通的卷积是没有任何问题的。。。只不过就是如果不进行补0,我们没法构建深层的cnn模型

(((

这里需要补充一下关于横着卷还是竖着卷的问题:

训练数据

温度 压强

t-2时刻 [ 20 200]

t-1时刻 [30 300]

t时刻 [40 400]

如果是横着卷,就是wavenet这类卷积神经网路使用的方法,每一个时间切片有多个特征;

如果是竖着卷,则是类似cnn中多通道的思路,即为每一列的动态特征单独训练一个nn模型,最后将结果进行concat或者求和等,此时就是一个典型的多输入的模型结构了;


CNN指标预 cnn做预测_卷积核_02


如果使用LSTM,则是每一列的动态特征单独构建一个LSTM,则上述两列构建两个LSTM,最后两个LSTM输出进行合并比如concat;

)))

比如说,我们使用了上述的size为2的卷积核,则下一层的数据就只剩下一个点了,就是220,此时没法再卷积下去了,所以和cv类似,我们会对这个过程进行补0,padding='same',使用普通的补0方法也没得问题其实。。。进行padding='same'的补0策略之后其实使用cnn也可以构建深层的cnn模型。


CNN指标预 cnn做预测_数据_03


因果卷积其实也很好理解,就是普通的卷积砍一半,补0的话补一边就可以了,补0主要是针对与深层的cnn结构,如果不补0则很难构建深层,因为每次卷积都是越卷越少的:


CNN指标预 cnn做预测_数据_04


比如说这里,第一层输入5个数据,卷积到了第二层就只剩下3个了。常规的cnn的补0是这样的:


CNN指标预 cnn做预测_卷积核_05


保证大小不变则两边补0,如果使用因果卷积则是这样的:


CNN指标预 cnn做预测_数据_06


和朋友讨论了一下,其实在时间序列预测的问题中,我们通过样本的构造无形中规避了上图中遇到的问题:


CNN指标预 cnn做预测_数据_04


以上图为例,假设输入是[1,2,3,4,5],则我们的预测是[3],这个在音频领域或者其它我不太清楚的领域中可能会有这样的问题存在,但是时间序列预测问题中,我们也不会这么去构造输入和输出,一般来说输入是[1,2,3,4,5],输出是[6],即:


CNN指标预 cnn做预测_CNN指标预_08


这个样子的,这个时候其实没有所谓的普通卷积使用到未来数据的问题,在[1,2,3,4,5]上怎么卷积都不会卷到未来的数据的。。。。所以最后的结论就是,可能casual conv的效果比较出色所以在cnn建模时间序列数据的任务中常用casual conv来做。。


然后是膨胀卷积

所谓的膨胀(空洞)卷积,说白了就是挖洞,

如何理解空洞卷积(dilated convolution)?www.zhihu.com

CNN指标预 cnn做预测_CNN指标预_09


CNN指标预 cnn做预测_卷积核_10


上图为不使用空洞卷积的情况下要考虑很久之前的历史数据的网络设计,显然参数量增加了不少,并且:


CNN指标预 cnn做预测_cnn加工是什么意思_11


这里实际上用到了一个size为5的大卷积核,一般来说小卷积核的效果更好,可以提取到比较精细的局部特征,如果卷积核非常大,大到和特征的维度一样大,这个时候卷积核就变成了一个全连接核了,参数量大,训练慢,收敛慢。

如果使用了空洞卷积,则如下图:


CNN指标预 cnn做预测_卷积核_12


简单来说就是在不增大参数量的情况下,可以把很久之前的数据考虑进来,不过也有一个问题就是近期的数据没有考虑进来,不过没关系,浅层的时候洞挖的少一点,越深层洞越多,这样就可以把不同大小的局部信息都考虑进来了,放两个对比图


CNN指标预 cnn做预测_cnn加工是什么意思_13


上图是仅仅使用因果卷积,下图是因果+空洞卷积,也就是wavenet的设计思路。


CNN指标预 cnn做预测_数据_14


每一层提取了不同周期下的抽象的特征,从而使用适当的参数量就可以cover很久之前的历史数据,否则的话就得是这样了:


CNN指标预 cnn做预测_卷积_15


太多了。。。就画这么点意思一下吧。

显然参数量太大容易过拟合,而且训练慢的要死,难收敛,其实如果要考虑不同周期下的,可以参考textcnn,使用不同大小的卷积核来抽取,不过那样参数量也很大的,wavenet中多层的空洞卷积的设计的好处就是保证轻量的情况下,可以起到提取不同周期下的抽象特征,并且可以考虑到很久之前的历史数据。