时间卷积网络
参考链接:
TCN(Temporal Convolutional Networks)算法详解 - 知乎 (zhihu.com)
TCN(Temporal Convolutional Network)时间卷积网络pytorch实战 - 朴素贝叶斯 - 博客园 (cnblogs.com)
1.TCN概况
TCN是时域卷积网络(Temporal Convolutional Network)的简称。
1.1与RNN的区别
许多任务中,卷积网络可以取得比RNNs更好的性能,同时避免了递归模型的常见缺陷,如梯度爆炸/消失问题。
RNN的优缺点:
优点 | 缺点 |
---|---|
建模长期依赖关系:由于循环连接的存在,RNN可以很好地捕捉序列中的长期依赖关系。它可以通过将过去的信息保持在隐藏状态中来传递上下文信息。 | 难以并行化计算:由于RNN在每个时间步骤上依赖前一个时间步骤的输出,导致计算难以并行化,限制了在大规模数据上的训练诶和推理效率。 |
动态长度处理:RNN能够处理变长的序列数据,适应输入序列长度的变化。 | 梯度消失和爆炸:在训练中,RNN的梯度信息在传播过程中可能会出现梯度消失或梯度爆炸的问题,会导致训练的不稳定性。 |
自然地处理时间:由于RNN的循环性质,它天然适应处理时间序列数据。 |
TCN的优缺点:
优点 | 缺点 |
---|---|
可并行化计算:TCN采用卷积操作,可以进行高效的并行计算,充分利用现代硬件加速能力,适用于大规模数据的处理。 | 有限的建模能力:传统的卷积操作在局部感受野内工作,因此对于较长的序列建模和处理长期依赖关系的表现可能不如CNN好。但是可以通过深层TCN和膨胀卷积等技术来扩大感受野。 |
捕捉局部依赖关系:TCN通过堆叠卷积层并增大卷积核的感受野,可以有效地捕捉序列数据中的局部依赖关系。 | |
稳定的梯度传播:相对于RNN,TCN训练中的梯度传播更稳定,不容易遇到梯度消失或爆炸。 |
2.TCN结构
2.1一维卷积
假设有一个时间序列,共有五个时间点,例如股市的价格波动:
TCN或者说因果卷积中,使用的卷积核大小均为2,对上面5个数据进行卷积的过程如下:
五个数据经过一次卷积变成4个数据,并且每一个卷积后的数据都基于两个原始数据,因而目前卷积的感受野为2。在CNN中我们通过padding来保证卷积前后特征图尺寸不变,在时间序列中,依然使用padding来保证尺寸不变:
padding是左右两边都增加0,按常理来讲会产生6个新数据。但是按照“输入输出尺寸相同”和“不能知道未来的数据”,所以最后那个未来的padding就省略掉了。
总而言之,时序卷积就是对一维数据的卷积过程。
2.2因果卷积(Causal Convolutions)
因果卷积就是一维卷积在时间序列中的一种应用。
因果卷积有两个特点:
- 不考虑未来的信息。给定输入序列$x_1,\cdots,x_T$,预测$y_1,\cdots,y_T$。但是在预测$y_T$时,只能使用已经观测到的序列$x_1,\cdots,x_T$,而不能使用$x_{t+1},x_{t+2},\cdots$。
- 追溯历史信息越久远,隐藏层越多。上图中,假设以第二个隐藏层作为输出,其最后一个节点关联了输入的三个节点;假设以输出层作为输出,其最后一个节点关联了输入的四个节点。
假设想做一个股票的预测决策模型,希望决策模型可以考虑到这个时间点之前四个时间点的股票价格,进行以下三种决策:
- 0:不操作
- 1:买入
- 2:卖出
本质上这是一个分类问题,要求感受野是4,按照之前的规律,需要堆积3个卷积核为2的1维卷积层:
三次卷积可以让最后的输出拥有4个视野域,即上图红色的部分。
这样虽然理论上可行,但是容易出现卷积层过多的问题。我们仍考虑股票数据,它往往是按照分钟记录的,起码是十万、百万的数据量。如果我们经过决策,要考虑前1000个时间点,那就意味着需要999层卷积,这对于计算机显然是有点捉襟见肘了。因此,我们引入了新的膨胀因果卷积。
2.3膨胀/空洞/扩张因果卷积(Dilated Causal Convolution)
- 单纯的因果卷积存在传统CNN的问题,即对时间的建模长度受限于卷积核的大小,如果想要建模更长的依赖关系,就需要线性堆叠很多层。
- 标准CNN可以通过增加池化层来获得更大的感受野,但经过池化层后存在信息损失的问题。
膨胀卷积是在标准卷积里注入空洞,以此来增加感受野。和传统CNN不同的是,膨胀卷积允许卷积时输入存在间隔采样,采样率受dilation rate控制,指的是做卷积操作时允许kernel里面元素之间的下标间隔(标准CNN中dilation rate=1,dilation rate=2表示输入时每2个点采样一个作为输入)。空洞的好处是不做池化损失的情况下,增加了感受野,让每个卷积输出都包含较大范围的信息。下图是标准cnn和Dilated Convolution的直观展示:
下图是dilation=2时的膨胀因果卷积的情况:
与之前的区别有两个:
- 红色区域:卷积核大小依然是2,但卷积核之间变空洞了。
- 绿色区域:因为dilation变大,因此相应的padding数量从1变到了2。为了保证输入输出的特征维度相同,$padding=(kernel_size-1)*dilation$。感受野范围为$(kernel_size-1)\ast dilation + 1$。
如果想要视野域为4:
可以看到,第一次使用dilation=1卷积,第二次使用dilation=2的卷积,就可以实现视野域是4。
如果需要视野域是8,那就再增加一个dilation=4的卷积。在实践中,通常随网络层数增加,dilation以2的指数增长,视野域也是2的指数增长。
因为研究对象是时间序列,TCN采用一维卷积网络。下图是TCN架构中的因果卷积与空洞卷积。
可以看到:
- 每一层t时刻的值只依赖于上一层$t,t-1,\cdots$时刻的值,体现了因果卷积的特性;
- 每一层对上一层信息的提取,都是跳跃式的,且逐层dilated rate以2的指数增长,体现了空洞卷积的特性;
- 每一层都要做padding,$padding=(kernel_size-1)\ast dilation$。
2.4残差模块(Residual block)
CNN能够提取不同级别的特征,网络的层数越多,提取到的特征越丰富、越抽象、越具有语义信息。但是如果简单地增加深度,会导致梯度消失或梯度爆炸。对于该问题的解决方法是权重参数初始化和采用正则化层(Batch Normalization),这样可以训练几十层的网络。
解决了梯度问题,还会出现网络退化问题。随着网络层数的增加,在训练集上的准确率趋于饱和甚至下降。但这并不是过拟合,因为过拟合在训练集上表现会更好。下图是一个网络退化的例子,20层的网络比56层的网络表现更好。
这是因为虽然56层网络的解空间包含了20层的解空间,但我们在训采用的是随机梯度下降策略,往往得到的不是全局最优解,而是局部最优解。显然56层网络的解空间更复杂,所以导致使用随机梯度下降无法得到最优解。
假设已有一个最优网络,为18层。当我们设计网络结构时,我们并不知道具体多少层的网络有最优的网络结构,假设设计了34层的网络结构。那么多出来的16层其实是冗余的,我们希望训练网络的过程中,模型能够自己训练这16层为恒等映射,也就是经过这16层时输入和输出完全一样。但是这往往很难做到,因此这样的网络一定比最优的18层网络差,这就是随着网络加深,模型退化的原因。因此解决网络退化的问题,就是解决如何让网络的冗余层产生恒等映射,让深层网络等价于一个浅层网络。
通常情况下,让网络的某一层学习恒等映射函数$H(x)=x$比较困难,但如果我们把网络设计为$H(x)=F(x)+x$,就可以将学习恒等函数转换为学习一个残差函数$F(x)=H(x)-x$,只要$F(x)=0$,就构成了一个恒等映射。在参数初始化时,一般权重参数比较小,非常适合学习$F(x)=0$,因此拟合残差会更容易,这就是残差网络的思想。
下图为残差模块的结构:
该模块提供了两种选择方式:
- identity mapping:即x,成为shortcut连接
- residual mapping:即$F(x)$
如果网络已经最优,继续加深网络,residual mapping将被push为0,只剩下identity mapping,这样理论上网络一直处于最优状态。
这种残差模块结构可以通过前向神经网络+shortcut连接实现。而且shortcut连接相当于简单执行了同等映射,不会产生额外参数,不会增加计算复杂度,整个网络依旧可以通过端到端的反向传播训练。
上图的残差模块包含了两层网络。实验证明,残差模块往往需要两层以上,单单一层的残差模块并不能起到提升作用。shortcut有两种连接方式:
idetity mapping同等维度的映射($F(x)$与$x$维度相同):
$F(x)=W_2\sigma(W_1x+b_1)+b_2,H(x)=F(x)+x$
identity mapping不同维度的映射:
$F(x)=W_2\sigma(W_1x+b_1)+b_2,H(x)=F(x)+W_sx$
以上是基于全连接层的表示,实际上残差模块可以用于卷积层。加法变为对应channel间两个feature map逐元素相加。对于残差网络,维度匹配的shortcut连接为实线,反之为虚线。在残差网络中,有很多残差模块,下图是一个残差网络。每个残差模块包含两层,相同维度残差模块之间采用实现连接,不同维度残差模块之间采用虚线连接。网络的2、3层执行$3\times 3\times 64$的卷积,他们的channel个数相同,所以采用同维度计算;4、5层与第三层channel个数不同,所以采用不同维度计算。$W_s$是卷积操作(用128个$3 \times 3 \times 64$的filter),用来调整x的channel个数。
TCN中的残差模块如下图所示:
TCN的基本模块TemporalBlock:
- 卷积并进行WeightNorm后会因为padding导致卷积之后的新数据尺寸B>输入数据的尺寸A,所以只保留输出数据中前面A个数据。
- 卷积之后加上ReLU和Dropout层。
- 每两次dilation扩大一倍,也就是说TCN中的基本组件是两个dilation相同的卷积层(卷积+修改数据尺寸+激活+dropout)
- 最后加上Resnet的残差连接来避免梯度消失。