【TS深度学习】时间卷积神经网络

2021-07-28 17:45:55 浏览数 (1)

点击蓝字

关注我们

#TSer#

时间序列知识整理系列,持续更新中 ⛳️

赶紧后台回复"讨论"加入讨论组交流吧 ?

在深度学习的知识宝库中,除了前面文章中介绍的RNN,还有一个重要的分支:卷积神经网络(CNN),其广泛应用于视觉,视频等二维或者多维的图像领域。卷积网络具有深度,可并行等多种特性,这种技术是否可以应用于解单维度的时间序列问题呢?本文介绍一种最近提出的新技术:时间卷积神经网络 (Temporal Convolutional Network,TCN),由Lea等人于2016年首次提出,起初应用于视频里动作的分割,后逐渐拓展到了一般性时序领域。

到目前为止,深度学习背景下的序列建模主题主要与递归神经网络架构(如LSTM和GRU)有关。然而,随着深度学习的高速发展,这种思维方式已经过时。在对序列数据进行建模时,最近很多学者将卷积网络作为主要候选者之一加以考虑。他们能够表明,在许多任务中,卷积网络可以取得比RNNs更好的性能,同时避免了递归模型的常见缺陷,如梯度爆炸/消失问题或缺乏内存保留。此外,使用卷积网络而不是递归网络可以提高性能,因为它允许并行计算输出

时间序列预测,最容易想到的就是马尔可夫模型:

P(y_k|x_k,x_{k-1},...,x_1)

就是计算某一个时刻的输出值,已知条件就是这个时刻之前的所有特征值。上面公式中,P表示概率,可以不用管这个,表示k时刻的输出值(标签),表示k时刻的特征值。

如果使用LSTM或者是GRU这样的RNN模型,自然是可以处理这样的时间序列模型的,毕竟RNN生来就是为了这个的。但是这个时间序列模型,宏观上思考的话,其实就是对这个时刻之前的数据做某个操作,然后生成一个标签,回想一下在卷积在图像中的操作,其实有异曲同工。

一维卷积

相似于卷积神经网络,一维卷积网络以一个三维张量作为输入,也输出一个三维张量。输入张量具有形状(batch_size、input_length、input_size),而输出张量具有形状(batch_size、input_length、output_size)。由于每一层都有相同的输入和输出长度,所以只有输入和输出张量的第三维是不同的。在单变量情况下,input_size和output_size都等于1。在更一般的多变量情况下,input_size和output_size可能不同。

为了了解单个层如何将其输入转换为输出,让我们看一下批处理的一个元素(对批处理中的每个元素都进行相同的处理)。让我们从最简单的例子开始,其中input_channels和output_channels都等于1。在这种情况下,我们看到的是一维输入和输出张量。下图显示了输出张量的一个元素是如何计算的。

我们可以看到,要计算输出的一个元素,我们需要查看输入的一系列长度为kernel_size的连续元素。在上面的例子中,我们选择了一个3的kernel_size。为了得到输出,我们取输入的子序列和相同长度的已学习权值的核向量的点积。输出的下一个元素,相同的应用程序,但kernel_size-sized窗口的输入序列是由一个元素转移到正确的(对于本预测模型,stride 总是设置为1)。请注意,相同的一组内核权重将被用来计算每输出一个卷积层。下图显示了两个连续的输出元素及其各自的输入子序列。

为了更直观的演示,我们来看下面这个例子:

假设有一个时间序列,总共有五个时间点,比方说股市,有一个股票的价格波动:[10,13,12,14,15]:

我们使用的卷积核大小为2,那么可想而知,对上面5个数据做一个卷积核为2的卷积是什么样子的:

五个数据经过一次卷积,可以变成四个数据,但是每一个卷积后的数据都是基于两个原始数据得到的,所以说,目前卷积的视野域是2。

可以看到是输入是5个数据,但是经过卷积,变成4个数据了,在图像中有一个概念是通过padding来保证卷积前后特征图尺寸不变,所以在时间序列中,依然使用padding来保证尺寸不变:

padding是左右两头都增加0,如果padding是1的话,就是上图的效果,其实会产生6个新数据,但是秉着:“输入输出尺寸相同”和“我们不能知道未来的数据”,所以最后边那个未来的padding,就省略掉了,之后再代码中会体现出来。

总之,现在我们大概能理解,对时间序列卷积的大致流程了,也就是对一维数据卷积的过程(图像卷积算是二维)。

因果卷积

对于因果关系,对于{0,…,input_length - 1}中的每一个i,输出序列的第i个元素可能只依赖于索引为{0,…,i}的输入序列中的元素。换句话说,输出序列中的元素只能依赖于输入序列中在它之前的元素。

  • 因果卷积(Causal Convolutions)是在wavenet这个网络中提出的,之后被用在了TCN中。

如前所述,为了确保一个输出张量与输入张量具有相同的长度,我们需要进行零填充。如果我们只在输入张量的左侧填充零,那么就可以保证因果卷积。要理解这一点,请考虑最右边的输出元素。假设输入序列的右边没有填充,它所依赖的最后一个元素就是输入的最后一个元素。现在考虑输出序列中倒数第二个输出元素。与最后一个输出元素相比,它的内核窗口向左移动了1,这意味着它在输入序列中最右边的依赖项是输入序列中倒数第二个元素。根据归纳,对于输出序列中的每个元素,其在输入序列中的最新依赖项与其本身具有相同的索引。下图展示了一个input_length为4,kernel_size为3的示例。

我们可以看到,在两个条目的左填充为零的情况下,我们可以获得相同的输出长度,同时遵守因果关系规则。事实上,在没有扩展的情况下,维持输入长度所需的零填充条目的数量总是等于kernel_size - 1。

我们将上面的概念应用到之前的股票的预测的案例中,希望这个决策模型可以考虑到这个时间点之前的4个时间点的股票价格进行决策,总共有3种决策:

  • 0:不操作,1:买入,2:卖出

所以其实就是一个分类问题。因为要求视野域是4,所以按照上面的设想,要堆积3个卷积核为2的1维卷积层:

三次卷积,可以让最后的输出,拥有4个视野域。就像是上图中红色的部分,就是做出一个决策的过程。

股票数据,往往是按照分钟记录的,那少说也是十万、百万的数据量,我们决策,想要考虑之前1000个时间点呢?视野域要是1000,那意味着要999层卷积?啥计算机吃得消这样的计算。所以需要引入膨胀因果卷积。

膨胀因果卷积

卷积层上下文中的膨胀是指输入序列的元素之间的距离,该元素用于计算输出序列的一个条目。因此,传统的卷积层可以看作是扩展度为1的扩散层,因为1个输出值的输入元素是相邻的。下图显示了一个扩展度为2的扩散层的示例,其input_length为4,kernel_size为3。

与扩散度为1的情况相比,该层的接收场沿5而不是3的长度扩展。更普遍地,具有内核大小k的d扩散层的接收场沿1 d的长度扩展。如果d是固定的,那么仍然需要输入张量的长度为线性的数字才能实现完全的接收场覆盖。

这个问题可以通过在层中向上移动时d的值呈指数增加来解决。为此,我们选择一个常数b,它将使我们根据其下的层数i来计算特定层的膨胀d,即d = b^i。下图显示了一个网络,其中input_length为10,kernel_size为3,dilation_base为2,这将导致3个膨胀的卷积层完全覆盖。

这里我们只显示影响输出最后一个值的输入的影响。同样,只显示最后一个输出值所必需的补零项。显然,最后的输出值依赖于整个输入覆盖率。实际上,给定超参数,input_length最多可以使用15,同时保持完全的接收野覆盖。一般来说,每增加一层,当前接受野宽度就增加一个d*(k-1)值,其中d计算为d=b^i, i表示新层下面的层数。因此,给出了基b指数膨胀时TCN的感受场宽度w、核大小k和层数n为

然而,根据b和k的值,这个接受野可能会有“洞”。考虑以下网络,其dilation_base为3,内核大小为2:

接受野的范围确实大于输入的大小(即15)。然而,接受野是有洞的;也就是说,在输入序列中有输出值不依赖的条目(如上面红色所示)。为了解决这个问题,我们需要将内核大小增加到3,或者将膨胀基数减小到2。一般来说,对于没有孔的感受野,核的大小k至少要与膨胀基b一样大。

考虑到这些观察结果,我们可以计算出我们的网络需要多少层才能覆盖整个历史。给定核大小k,膨胀基b,其中k≥b,输入长度l,为了实现全历史覆盖,必须满足以下不等式:

我们可以求解n,得到所需的最小层数

我们可以看到,在输入长度方面,层数现在是对数的,而不是线性的。这是一个显著的改进,可以在不牺牲接受野覆盖率的情况下实现。

现在,唯一需要指定的是每一层所需的零填充项的数量。假设膨胀基为b,核大小为k,当前层以下有i个层,则当前层所需的补零项数p计算如下:

还是接着上面的例子,当扩展度为2的时候,与之前的区别有两个:

看红色区域:可以看到卷积核大小依然是2,但是卷积核之间变得空洞了,隔过去了一个数据;如果dilation=3的话,那么可以想而知,这个卷积核中间会空的更大,会隔过去两个数据。

  • 看淡绿色数据:因为dilation变大了,所以相应的padding的数量从1变成了2,所以为了保证输入输出的特征维度相同,padding的数值等于dalition的数值(在卷积核是2的情况下,严格说:padding=(kernel_size-1)*dilation)

然后我们依然实现上面那个例子,每次决策想要视野域为4:

可以看到,第一次卷积使用dilation=1的卷积,然后第二次使用dilation=2的卷积,这样通过两次卷积就可以实现视野域是4.

那么假设视野域要是8呢?那就再加一个dilation=4的卷积。dilation的值是2的次方,然后视野域也是2的次方的增长,那么就算是要1000视野域,那十层大概就行了。

TCN的结构

TCN基本就是一个膨胀因果卷积的过程,只是上面我们实现因果卷积就只有一个卷积层。而TCN的稍微复杂一点:

  • 卷积结束后会因为padding导致卷积之后的新数据的尺寸B>输入数据的尺寸A,所以只保留输出数据中前面A个数据;
  • 卷积之后加上个ReLU和Dropout层。
  • 然后TCN中并不是每一次卷积都会扩大一倍的dilation,而是每两次扩大一倍的dilation
  • 总之TCN中的基本组件:TemporalBlock()是两个dilation相同的卷积层,卷积 修改数据尺寸 relu dropout 卷积 修改数据尺寸 relu dropout

小结

TCN可以接受任意长度的序列,并将其输出为相同长度。因果卷积在使用一维全卷积网络结构时使用。一个关键的特征是t时刻的输出只与t之前的元素进行卷积。下图展示了一个基于TCN的“编码器-解码器”结构:

随着严等人(2020)最近发表的有关TCN用于天气预报任务的研究成果,TCN上甚至出现了有关TCN的讨论。在他们的工作中,进行了TCN和LSTM的对比实验。他们的结果之一是,在其他方法中,TCN在时间序列数据的预测任务中表现良好。

尽管卷积神经网络(CNNs)通常与图像分类任务相关,但经过适当的修改,它已被证明是进行序列建模和预测的有价值的工具。

0 人点赞