解读AAAI 2021最佳论文:Informer: Beyond Efficient Transformer for Long SequenceTime-Series Forecasting

目录

一、摘要

二、传统transformer的局限性

三、本文的贡献

四、模型总体架构

五、Self-attention Mechanism

六、衡量Query稀疏度

七、ProbSparse Self-attention

八、Encoder

Self-attention Distilling

九、Decoder

十、Experiment

消融实验

​编辑

Computation Efficiency

十一、Reference


一、摘要

许多实际应用需要长序列时间序列的预测,如电力消耗计划。长序列时间序列预测(LSTF)要求模型具有较高的预测能力,即能够有效地捕捉输出和输入之间精确的远程依赖耦合。最近的研究显示了Transformer在提高预测能力方面的潜力。然而,Transformer存在一些严重的问题,使其无法直接应用于LSTF,包括二次元时间复杂度、高内存使用量和编码器-解码器体系结构的固有限制。为了解决这些问题,我们设计了一个高效的基于Transformer的LSTF模型,命名为Informer,该模型具有三个显著特征:(i) ProbSparse自注意机制,在时间复杂度和内存使用方面达到O(LlnL),并在序列依赖对齐方面具有相当的性能。(ii)自我注意蒸馏通过将级联层输入减半来突出支配性注意,并有效地处理极长的输入序列。(iii)生成式解码器虽然概念简单,但对长时间序列序列进行一次正向预测,而不是一步一步的预测,大大提高了长序列预测的推理速度。在四个大规模数据集上的大量实验表明,Informer方法明显优于现有方法,为LSTF问题提供了一种新的解决方案。

二、传统transformer的局限性

Vanilla Transformer在解决LSTF问题时有三个显著的局限性:

1. 自我注意的二次计算。自注意机制的原子操作,即规范点积,使每层的时间复杂度和内存使用量为O(L^{2})。

2. 为长输入堆叠层时的内存瓶颈。J个编码器/解码器层的堆栈使得总内存使用量为O(J·L^{2}),这限制了模型在接收长序列输入时的可扩展性。

3.预测长输出时的速度骤降。Vanilla Transformer的动态解码使得逐步推理与基于RNN的模型一样慢。

如上图所示,(a) 表示LSTF比短序列预测能涵盖较长的时期,在政策规划和保护投资方面具有重要区别。(b)现有方法的预测能力限制了LSTF的性能。例如,从length=48开始,MSE上升到不可接受的高度,推理速度急剧下降。

三、本文的贡献

1. 在LSTF问题中,作者提出了Informer来成功地提高预测能力,从而验证了类transformer模型在捕获长序列时间序列输出和输入之间的单个远程依赖性方面的潜在价值。

2. 作者提出ProbSparse自注意机制来有效地取代规范的自注意。它在依赖对齐上实现了O(LlogL)时间复杂度和O(LlogL)内存使用。

3. 作者提出了自我注意蒸馏操作,以特权占主导地位的注意力得分在j堆叠层和将总空间复杂度大幅降低为O((2−\epsilon)LlogL),便于接收长序列输入。

4. 作者提出了生成式解码器,以获得长序列输出,只需要一个向前的步骤,同时避免在推理阶段累积误差扩散。

四、模型总体架构

左:编码器接收大量的长序列输入(绿色序列)。作者用提出的ProbSparse自我注意来取代传统的自我注意机制。蓝色梯形为自注意蒸馏操作,提取支配性注意,大幅缩小网络规模。层堆叠副本增加了鲁棒性。右:解码器接收长序列输入,将目标元素填充为零,测量特征图的加权注意组成,并以生成式的方式即时预测输出元素(橙色序列)。

五、Self-attention Mechanism

 传统的自注意力机制表示为:

 其中p(k_{j},q_{i})=k(q_{i},k_{j})/\sum_{j}^{}k(q_{i},k_{j})k(q_{i},k_{j})=exp(q_{i}k_{j}^{T}/\sqrt{d}),自我注意结合这些值,并根据计算概率p(k_{j},q_{i})获得输出。它需要二次乘点积计算和O(L_{Q},L_{K})内存使用,这是提高预测能力的主要缺点。

六、衡量Query稀疏度

作者首先对传统自我注意的习得性注意模式进行了定性评估。“稀疏性”自我注意评分形成长尾分布(如下图所示),即少数点积对贡献主要注意,其他点积对产生琐碎注意。那么,下一个问题是如何区分它们?

在这里插入图片描述

从传统的自注意力公式中,第i个查询在所有键上的注意被定义为概率p(k_{j},q_{i}),输出是它与值v的组合。优势点积对促使相应查询的注意概率分布远离均匀分布。如果p(k_{j},q_{i})接近于均匀分布q(k_{j},q_{i})=1/L_{K} ,那就说明这个query是“Lazy”的,没法选出重要的那些key,反之就说明该query是“active”的。那么自我注意就变成了V值的和,对有些输入是多余的。由于active的query对自注意力贡献很大,而lazy的query贡献很小,所以作者尽可能的选出那些active的query。分布p和q之间的“相似性”可以用来区分“重要的”queries。作者通过KL散度KL(q||p)=ln\sum_{l=1}^{L_{K}}exp(q_{i}k_{j}^{T}/\sqrt{d})-\frac{1}{L_{K}}\sum_{j=1}^{L_{K}}\frac{q_{i}k_{j}^{T}}{\sqrt{d}}-lnL_{K}来度量“相似度”。去掉常数项,作者定义第i个查询的稀疏度量为:

所以对于第i个query的“稀疏度度量”,该值越大,说明概率分布和均匀分布差异越大,该query越活跃,得到了一个衡量query的标准

七、ProbSparse Self-attention

基于上面提出的度量方法,通过允许每个键只关注u个主要查询,我们得出ProbSparse Self-attention:

其中\bar{Q}是一个与q大小相同的稀疏矩阵,它只包含稀疏度量M(q, K)下的Top-u个queries,对于没有被选中的那些q_{i}的score值取mean(V),来保证输入和输出序列长度都是L。在恒定的采样因子c控制下,作者设定u=c*lnL_{Q},这使得ProbSparse Self-attention每次查询键查找只需要计算O(lnL_{Q})点积,层内存使用即时间复杂度保持O(L_{K}lnL_{Q})。在多头透视图下,这种注意为每个头生成不同的稀疏查询键对,从而避免了严重的信息丢失。 

然而,遍历度量M(q_{i}, K)的所有查询需要计算每个点积对,即二次计算复杂度O(L_{Q}L_{K}),此外,LSE操作有潜在的数值稳定性问题。基于此,我们提出了一个有效获取查询稀疏性度量的经验近似。即用max_{j}(q_{i}k_{j}^{T}/\sqrt{d})代替之前的ln\sum_{l=1}^{L_{K}}exp(q_{i}k_{j}^{T}/\sqrt{d}),具体原理(该引理的证明在原论文附录 D.1和2)如下图所示:

在这里插入图片描述

 所以作者用一种近似改进了公式如下(如上图中用上界来代替那个LSE):

 

在自注意计算中,查询和键的输入长度通常是等价的,即L_{Q}=L_{K}=L, 所以通过上面的改进之后使得ProbSparse Self-attention总时间复杂度和空间复杂度为由O(L^{2})减小为O(LlnL)

注意:ProbSparse Attention 在为每个query随机采样key时,每个head的采样结果是相同的,也就是采样的key是相同的。但是由于每一层self-attention都会先对Q、K、V做线性转换,这使得序列中同一个位置上不同head对应的query、key向量不同,所以每个head的同一个query的sparsity measurement都不相同,这就使得每个head中得到的前u个measurement 最高的query也是不同的。这也等价于每个head都采取了不同的优化策略。

八、Encoder

 编码器的设计目的是提取长序列输入的健壮的远程依赖性。编码器的草图如下图所示:

上图给出的是接收整个输入序列的主栈。然后第二个堆栈接受输入的一半切片,随后的堆栈重复。其中红色层为点积矩阵,通过对每层进行自注意蒸馏得到级联递减。最后将所有栈的特征映射连接成编码器的输出。

Self-attention Distilling

作者使用自注意蒸馏操作,以支配特征优先于优势特征,在下一层生成一个集中的自注意特征映射。它大幅修剪了输入的时间维度,如上图所示,注意块的n个头权重矩阵(重叠的红色方块)。受扩张卷积的启发,我们的“蒸馏”过程从第j层向前推进到第j+1层:

其中[·]AB表示注意块。它包含多头ProbSparse自注意和基本操作,其中Conv1d(·)使用ELU(·)激活函数在时间维度上执行一维卷积滤波器(核宽度=3)。我们在堆叠一层后,添加一个最大池化层,stride为2,向下采样X^{t}到它的半片,这将整个内存使用量减少到O((2−\epsilon)LlogL),\epsilon是一个很小的数字。为了增强蒸馏操作的鲁棒性,作者构建了输入减半的主堆栈副本,并通过每次下降一层来逐步减少自我注意蒸馏层的数量,就像上图中的金字塔,这样它们的输出维度是对齐的。最后作者将所有堆栈的输出连接起来,得到编码器的最终隐藏表示。

九、Decoder

作者使用标准解码器结构,它由两个相同的多头注意层组成。而生成推理则是用来缓解长时间预测的速度骤降。我们向解码器输入以下向量为:

其中X_{token}^{t}为start token,X_{0}^{t}为需要预测的部分(初始化为0),通过将掩模点积设置为−∞,将掩模多头注意应用于ProbSparse自注意计算。它可以防止每个位置指向下一个位置,从而避免自回归。一个完全连接的层获得最终的输出,它的外值d_{y}取决于我们执行的是单变量预测还是多元预测。

Generative Inference 的原理如下图所示:

在这里插入图片描述                                           

 由上图可知,该解码器的关键部分在于两个注意力机制,作者这里使用的是ProbSparse Self-attention和Full-attention。需要注意的是,第一个attention层中的query、key、value都是根据Decoder输入的embedding乘上权重矩阵得到的,而第二个attention层中的query是根据前面attention层的输出乘上权重矩阵得到的,key和value是根据Encoder的输出乘上权重矩阵得到的。

十、Experiment

datasetETT (Electricity Transformer Temperature), ECL (Electricity Consuming Load),Weather

baslines: ARIMA,  Prophet, LSTMa, LST-net, DeepAR,  LogTrans, Reformer

上图为单变量的预测结果,Informer显著提高了预测效果,Informer+是将所有的ProbSparse Attention换成标准的self-attention,我们可以看到,很多情况下,Informer效果比Informer+
要更好,作者认为这说明ProbSparse self-attention去掉了一些冗余的信息。

消融实验

The performance of ProbSparse self-attention mechanism

由表3我们可以看到,当输入序列长度为1440时,中间两个模型已经无法处理了,而Informer和Reformer依然保持稳定,但是Informer效果要好很多;以及输入越长,效果比Reformer更明显。

The performance of self-attention distilling

如表5所示,Informer++模型是使用原始self-attention并移除卷积蒸馏操作,在输入长度为720时取得了好的效果,但是无法处理更长的输入。而Informer+对于更长的预测,更长的输入带来的性能提升更加明显。说明卷积蒸馏操作对于长时间序列的预测发挥重要作用。

The performance of generative style decoder

在本研究中,作者证明了解码器在获得“生成”结果方面的潜在价值。不同于现有的方法,标签和输出在训练和推理中被迫对齐,作者提出的解码器的预测完全依赖于时间戳,它可以通过偏移进行预测。从表6可以看出,随着偏移量的增加,‡算法的一般预测性能有抵抗性,而对动态解码而言,‡算法失败。它证明了解码器能够捕获任意输出之间的独立远程依赖关系并避免错误积累。

Computation Efficiency

通过多元设置和所有方法当前的最佳实现,作者在图(5)中进行了严格的运行时比较。在训练阶段,基于transformer的方法中,Informer(红线)的训练效率最好。在测试阶段,作者的方法比使用生成式解码的其他方法快得多。理论时间复杂度和内存使用情况的比较如表4所示。Informer的性能与运行时实验一致。注意,LogTrans专注于改进自我注意机制,所以作者在LogTrans中应用他提出的解码器进行公平的比较(如表4)。

 

十一、Reference

1. 细读informer与项目学习

2.Informer讲解PPT介绍【超详细】--AAAI 2021最佳论文:比Transformer更有效的长时间序列预测

3. 论文链接:PRELIMINARY VERSION DO NOT CITE (aaai.org)

4. 源代码链接:https://github.com/zhouhaoyi/Informer2020

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用,informer源码是指k8s client-go库中的informers包的源代码。informers包是用于与Kubernetes API进行交互获取资源对象的工具。这个源码主要实现了一种名为DeltaFIFO的数据结构。 DeltaFIFO数据结构的作用是用于跟踪资源对象的增删改操作,并提供了一种队列的方式来处理这些操作。它通过内部的缓冲区来存储最新的资源对象,并使用一种增量更新的方式来更新缓冲区中的资源对象,以便及时地反映出Kubernetes API中的变化。 DeltaFIFO源码分析主要涉及到DeltaFIFO结构体的定义、初始化、资源对象的增删改操作、缓冲区的更新和队列的处理等内容。在分析过程中,可以深入研究DeltaFIFO的内部机制,如增量更新策略、事件通知机制等,以及与Kubernetes API的交互过程。 引用提供的源码分析文档可以帮助详细了解informers包中DeltaFIFO的实现原理和相关细节。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [k8s client-go源码分析 informer源码分析(4)-DeltaFIFO源码分析.doc](https://download.csdn.net/download/ranbolee7/86084104)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [源码阅读及理论详解《 Informer: Beyond Efficient Transformer for Long Sequence Time-Series ...](https://blog.csdn.net/Alkaid2000/article/details/125137982)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值