推荐指数⭐⭐⭐⭐
目录
摘要
随着物联网(IoT)系统的发展,精确的长期预测方法对决策者评估当前状况并制定未来政策至关重要。目前,Transformer和MLP是两种深度时间序列预测的范式,其中前者因其出色的注意力机制和编码器-解码器架构而更为流行。 然而,数据科学家似乎更愿意深入研究编码器,而忽略了解码器。一些研究者甚至采用线性投影来替代解码器,以降低复杂性 。我们认为,无论是提取输入序列的特征,还是寻求输入与预测序列之间的关系,即编码器和解码器各自的功能,都至关重要。受计算机视觉(CV)领域FPN成功的启发,我们提出FPPformer,分别在编码器和解码器中利用自下而上和自上而下的架构来构建完整且合理的层次结构。本研究利用先进的局部注意力并进一步发展,将其与重新设计的元素级注意力相结合,且编码器和解码器的形式也有所不同。在十二个基准数据集上与六个最先进的基线方法进行的广泛实验验证了FPPformer的出色性能,以及在时间序列预测Transformer中精心设计解码器的重要性。源代码已发布在https://github.com/OrigamiSL/FPPformer。
贡献
- 解码器体系结构进行了改进,并将其转换为top-down的体系结构,以便合理地分层构建预测序列。
- 受到一种异常检测方法启发,我们提出了对角掩码自注意机制( diagonal-masked self-attention),以减轻输入序列中异常值的负面影响。
- 我们提出了一种新的element-wise attention和patch-attention 组合,以弥补传统patch-wise attention 在提取每个patch 内部特征时的不足,只增加线性复杂度.
模型结构
对比普通transformer的主要改进
1. 在encoder和decoder之间添加了横向连接,并将decoder 结构调整成了top-down的结构
参考FPN
2. 自注意力机制冗余性
作者首先指出了decoder的缺陷,并针对此做出改进。作者发现decoder中的自注意力机制的冗余性。(笔者看来,何止自注意力力机制,其他许多学者认为decoder的存在就是多余的,将decoder整个舍弃掉,但是不妨听听对其冗余性的详细解读)文章注意到decoder的输入是一个全0的序列,与带预测未来的未知性相对应。因此decoder里面第一个Masked Self-attention 机制只是在预测序列的position embedding 进行的。无论position embedding 是learnable 还是 fixed ,其都与输入序列完全没有关系。注意时间序列是一个自回归问题,只针对 position embedding 执行 自注意力机制 并试图推导出一些没有根据的关系是完全没有意义的。并且训练好的 position embedding 通常是固定不变的 ,然而输入到模型的序列却并非一成不变而是动态变化的,这打破了position embedding能够基于某种关于同质性的假设来适应时间序列序列统计数据的最后希望。
为了解决这个问题,文章调换了decoder内部的cross-attention和self-attention的顺序,先进行cross-attention ,再进行self-attention.因此,在开始推断未知预测序列内的任何关系之前,预测序列从最深的编码器特征图接收自回归部分,加入了来自输入序列的信息。
3. 多尺度不足问题
文章认为 编码器和解码器的连接是单一的,这导致了多尺度不足的问题。如图1所示,具有M个阶段的编码器可以产生M个输入序列的特征图,但仅最后一个特征图被发送到解码器。当涉及到一些具有层次结构编码器的改进时间序列变换模型时,这个问题尤为突出。
解决:文章在具有横向连接的编码器和解码器中使用分层金字塔结构。
这一 idea 来源于目标检测领域的FPN模型
4. element-wise和patch-wise的attention组合
encoder和decoder内部做了一个element-wise和patch-wise的attention组合
patch-wise attention 源于crossformer(crossformer解读)
crossformer在研究注意力矩阵的时候发现了连续的高权值和连续的低权值,说明一些连续的时间点对当前时间点的重要性或者说贡献度是接近的、相似的,说明存在信息冗余,为了降低模型复杂度,我们可以粗放一下序列的颗粒度,用patch-wise来代替elemnt-wise
(我真的尽力去解释了)
上面是patch-wise的来源,但是作者认为patch-wise只考虑了patch间的关系,而忽略了patch内的关系,因此,作者考虑使用point-wise机制提取patch内的元素间的关系,以单通道序列为例,其维度变化过程如下图
维度变化过程汇总成表
5. DM(Diagonal-Masked) Self Attention 机制
在真实世界尤其是物联网系统中经常会有异常值出现,这些异常有时以patch的形式存在,因此patch注意力不能对它们免疫。文章采用屏蔽query-key匹配矩阵的对角线的方式来减轻可能出现的异常值的影响(原理类似于平滑)。因此,矩阵中的任何元素都只能用其余元素的值来表示。那些特征一般的元素几乎不受影响,但异常值不可能用正常元素来表示,因此它们的值被恢复到接近一般水平,并减轻了它们的负面影响。
实验结果
消融实验
看起来每个部件都很有用,但是最有用的应该还是patch_wise attention
源码
1. 多尺度
三层encoder的输出,每层encoder的输出patch数量减半(16->8->4),对应地patch长度倍增
encoder同时输出下一次的输入和本次输出
encoder返回
x_out = self.norm3(x)
x_next = x_out.contiguous().view(B, V, P // 2, 2, L, D)\
.view(B, V, P // 2, 2 * L, D)
return x_out.view(B, V, P, -1), x_next
x_out和x_next长这个样子
encoder返回内容的用途 x_out保留在encoder_list里面,提供给decoder作为输入,x_next则成为下一个encoder的输入
for i in range(self.encoder_num):
x_out, x_patch_attn = self.encoders[i](x_patch_attn)
encoder_out_list.append(x_out)
return x_patch_attn.contiguous().view(B, V, -1, D), encoder_out_list
2. 横向连接和top-down
连接的方式就是将encoder的输出保留起来,作为decoder的输入
top-down结构就是倒着输入哈哈哈
for i in range(self.encoder_num):
x_dec = self.decoders[i](x_dec, encoder_out_list[-1 - i])
3. element-wise和patch-wise
两个注意力机制实现起来大差不差
(1)维度:输入维度的不同,还有就是在矩阵乘法的时候注意维度
(2)掩码:element-wise级别的注意力提供了一个causal也就是因果掩码,继承自原始transformer,目的是在计算每个输出词的概率分布时,只考虑之前的词,而不要考虑当前词之后的任何词(因果,当前时刻看不到后续时刻的数据)
4. DM self-attention
就是把对角线上元素都置为无穷大
if mask == 'Diag':#把对角线上的值全部都填充掉
attn_mask = OffDiagMask_PointLevel(B, V, P, L, device=queries.device) # [B V P L L]
scores.masked_fill_(attn_mask.mask, -np.inf)