TCN(因果卷积)

问题背景

在实际应用中,RNN 在内部设计上存在一个严重的问题:由于网络一次只能处理一个时间步长,后一步必须等前一步处理完才能进行运算。这意味着 RNN 不能像 CNN 那样进行大规模并行处理,特别是在 RNN/LSTM 对文本进行双向处理时。这也意味着 RNN 极度地计算密集,因为在整个任务运行完成之前,必须保存所有的中间结果。

CNN 在处理图像时,将图像看作一个二维的“块”(m*n 的矩阵)。迁移到时间序列上,就可以将序列看作一个一维对象(1*n 的向量)。通过多层网络结构,可以获得足够大的感受野。这种做法会让 CNN 非常深,但是得益于大规模并行处理的优势,无论网络多深,都可以进行并行处理,节省大量时间。这就是 TCN 的基本思想。

因果卷积

输入:$x_1,x_2,...,x_t$

输出:$y_1,y_2,...,y_t$(预测序列)

其中滤波器$F=(f_1,f_2,...,f_k)$,卷积计算为$(F * X)_{\left(x_{t}\right)}=\sum_{k=1}^{K} f_{k} x_{t-K+k}$,下图为滤波器$F = (f_1,f_2)$,输入输入层最后两个结点,结果为$y_{t}=f_{1} x_{t-1}+f_{2} x_{t}$ 。

img

特点:

  1. 不考虑未来的信息。预测序列只使用之前时序的序列,无法使用时序上之后的序列。
  2. 追溯历史信息越久远,隐藏层越多。上述为追溯前四个时间点的情况。

空洞卷积

标准的 CNN 通过增加 pooling 层来获得更大的感受野,而经过 pooling 层后肯定存在信息损失的问题。空洞卷积是在标准的卷积里注入空洞,以此来增加感受野。空洞卷积多了一个超参数 dilation rate,指的是 kernel 的间隔数量(标准的 CNN 中 dilatation rate 等于 1)。空洞的好处是不做 pooling 损失信息的情况下,增加了感受野,让每个卷积输出都包含较大范围的信息。下图展示了标准 CNN (左)和 Dilated Convolution (右),右图中的 dilatation rate 等于 2 。

膨胀卷积在图像处理中的示意

膨胀卷积示意(图源:vdumoulin)

如下图,在因果卷积上设置不同的空洞率,实现卷积层视野扩大:

img

空洞卷积感受野大小为$(K-1)*d + 1$,增大K和d有利于提高感受野.

残差模块

CNN 能够提取 low/mid/high-level 的特征,网络的层数越多,意味着能够提取到不同 level的特征越丰富。并且,越深的网络提取的特征越抽象,越具有语义信息。

如果简单地增加深度,会导致梯度消失或梯度爆炸。对于该问题的解决方法是权重参数初始化和采用正则化层(Batch Normalization),这样可以训练几十层的网络。解决了梯度问题,还会出现另一个问题:网络退化问题。随着网络层数的增加,在训练集上的准确率趋于饱和甚至下降了。注意这不是过拟合问题,因为过拟合会在训练集上表现的更好。下图是一个网络退化的例子,20 层的网络比 56 层的网络表现更好。

理论上 56 层网络的解空间包括了 20 层网络的解空间,因此 56 层网络的表现应该大于等于20 层网络。但是从训练结果来看,56 层网络无论是训练误差还是测试误差都大于 20 层网络(这也说明了为什么不是过拟合现象,因为 56 层网络本身的训练误差都没有降下去)。这是因为虽然 56 层网络的解空间包含了 20 层网络的解空间,但是我们在训练中用的是随机梯度下降策略,往往得到的不是全局最优解,而是局部最优解。显然 56 层网络的解空间更加的复杂,所以导致使用随机梯度下降无法得到最优解。

假设已经有了一个最优的网络结构,是 18 层。当我们设计网络结构时,我们并不知道具体多少层的网络拥有最优的网络结构,假设设计了 34 层的网络结构。那么多出来的 16 层其实是冗余的,我们希望训练网络的过程中,模型能够自己训练这 16 层为恒等映射,也就是经过这16 层时的输入与输出完全一样。但是往往模型很难将这 16 层恒等映射的参数学习正确,这样的网络一定比最优的 18 层网络表现差,这就是随着网络加深,模型退化的原因。

因此解决网络退化的问题,就是解决如何让网络的冗余层产生恒等映射(深层网络等价于一个浅层网络)。通常情况下,让网络的某一层学习恒等映射函数$H(x)=x$比较困难,但是如果把网络设计为$H(x) = F(x)+x$,只要F(x)为0就构成恒等映射.在参数初始化的时候,一般权重参数都比较小,非常适合学习$F(x) = 0$ ,因此拟合残差会更加容易,这就是残差网络的思想。

TCN网络

TCN网络将因果卷积和空洞卷积相结合,结构如下图:

img

下图是 TCN 架构中的残差模块,输入经历空洞卷积、权重归一化、激活函数、Dropout(两轮),作为残差函数$F(x)$:

img

最后修改:2022 年 07 月 27 日
如果觉得我的文章对你有用,请随意赞赏