研一上第七周周报
一、《Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting》
Proceedings of the AAAI Conference on Artificial Intelligence 2021 被引次数:1580
1.背景
这个算法提出来是为了解决长序列预测问题,比如根据过去两个月的发电量预测未来两个月的,意思就是真实数据和预测数据数量差不多。
Transformer 有几个严重的问题,让他不适合长序列预测,包括编码器-解码器架构的二次时间复杂度,两次o(n方)、高内存使用和固有限制。
自注意力机制在 L 长度输入/输出上的 L 二次计算和内存消耗。占用资源太多,自注意力机制和Transformer 架构的效率成为将它们应用于 LSTF 问题的瓶颈。因此作者要改进Transformer。
RNN是串行结构,序列长度长的时候反向传播计算复杂,速度慢,预测结果的时候先预测h1才能预测h2,因为h2的结果和h1和x2有关,h0的信息传到ht的时候几乎消失来,无法做到参考上文。是串行,必须一个挨着一个计算,无法做并行
transfomer是并行结构,更快,全局信息丰富,但是decoder输出是一个挨着一个输出,太慢
存在的问题
自注意力的二次计算。自注意力机制的规范点积,将查询向量 Q 和键向量 K 进行点积操作,得到一个未经缩放的相似性得分矩阵,然后将矩阵中的所有元素除以一个缩放因子,常用的缩放因子是键向量的维度的平方根。
Score = Score / sqrt(d_k)
导致每层的时间复杂度和内存使用量为 O(n2)。作者改进的方向是让Attention要算的更快
长输入堆叠层的内存瓶颈。encoder是多个encoder堆叠,除了输入输出不同外,其格式完全相同,一次self-attention的计算成本已经是相当昂贵了,更何况是多个叠加。作者要求堆叠encoder也要快
预测长输出的速度下降。vanilla Transformer 的动态解码,逐步生成输出序列,使得与基于 RNN 的模型一样慢。不用动态解码的话,有可能让2号的发电量基于1号的发电量来做预测。作者要让Decoder要一次性输出所有预测还不会被后续的预测数据影响。
2.相关技术
TransFormer
QK相乘求相似度,做scale为了避免softmax得到概率的时候出现极端情况,新的向量表示暗含了Q的信息,表示对Q来说,K里面重要的是哪些信息。
自注意力机制的QKV都来源于X,通过参数三层线性变换wq,wk,wv,得到了QKV的向量。scale+softmax得到概率,
计算查询(qi)和键(K)之间的注意力得分
3.作者技术路线
1.ProbSparse 自注意力机制
在长序列中,对于每一个Q来说,只有一小部分的K和其他的有较强的关系。
"有很多的Q没有用,他和所有K相乘之后softmax得到了均匀分布的结果,那么计算这些QK相乘完全就是浪费时间。解决方法是不要把所有QK相乘,先把Q进行采样,找到活跃的Q。
稀疏"自注意力分数形成一个长尾分布,即少数点积对贡献主要注意力,而其他点积对产生微不足道的注意力。用KL散度衡量重要程度。第 i 个查询的稀疏度
计算每一个Q和均匀分布的差异,差异越多就越有用。
源码里面,输入序列长度96,随机选25个K(不是全部,因为有用的Q能在大部分K上表现差异性),有用的Q跟部分K计算的结果也可以当作分布。用多头注意力机制,96个Q跟25个K相乘得分,每一个Q有25个得分,这时计算量是9625. 如果要对这25个得分一一比较的话,计算量是962525,作者直接**直接选内积最大值,**计算比较简单,又变成9625。因为作者假设分布呈高斯分布,不会是突变型。在96个Q中选出来差异最大的25个。
两个简化,不选全部QK和算差异时直接选最大值。真正算的时候选择全部的K,选了部分Q。其他的Q,作者用V的平均向量替换,因为作者把剩余的Q直接当成均匀分布了,既然Q算出来跟平均分布差不多,作者直接不算了,用平均向量替换,大大减少计算量。
2.self-attention 蒸馏
传统Transformer使用堆叠encoder,做完attention之后还要继续堆叠。作者叠加多个1D的maxpooling,输入序列中的每个区域会被划分为固定大小为2的窗口,然后在每个窗口内取最大值,将最大值作为输出。这样可以去除部分冗余信息(均匀分布的Q),减少输入序列的长度,同时保留重要的特征。encoder改进之后,计算复杂度从n方变成nlog(n),这个算法通篇都在想怎么减少计算量。图中给的多头自注意力,头就跟卷积核差不多,从不同角度提取特征
3.传统的Encoder-Decoder,是串行的。浪费时间,传统decoder挨个输出,把第一个预测值当已知条件预测第二个,改进之后一口气输出
步骤是,给出一部分真实值,后面拼接上要预测的值,接着跟encoder的self-attention一样,不过这次加上了mask矩阵,是一个下三角矩阵,因为不能用未来的预测值推测之前的预测值,得用当前日期之前的。mask矩阵,当前日期之前的都是1,之后的都是0。然后再跟encoder的self-attention做计算,就能一口气得出全部预测结果。
再decoder还加入了时间嵌入编码。丰富时间上下文信息。不仅要绝对时间编码,还有跟时间相关的各种编码,第几周,第几月,是否节假日,
4.实验部分
-
数据集选用2 个LSTF 收集的真实世界数据集和 2 个公共基准数据集。
ETT 是电力长期部署的关键指标。是从中国两个独立的县收集了2 年的数据。创建了单独的数据集为 1 小时级别的和单位为15分钟级别的。train/val/test是 12/4/4 个月。
ECL收集了 321 个客户的用电量,将数据集转换为 2 年的每小时用电量,train/val/test 是 15/3/4 个月。
Weather包含美国近 1,600 个地点的当地气候数据,从 2010 年到 2013 年的 4 年时间里,每隔 1小时收集一次数据点。
-
单变量和多变量的长时间序列预测
Informer 在编码器中包含一个3 层堆栈和一个 1 层堆栈(1/4 输入),以及一个 2层解码器。批量大小为 32
-
参数敏感度分析
-
消融实验
batch size=8, heads=8, dim=64