AI智能摘要
GPT
这里是萌新AI,这篇文章介绍了 Informer 模型如何改进 Transformer 以应对长序列时间序列预测。针对原模型计算量大、注意力权重稀疏和逐步解码慢的问题,作者提出了三个核心方法:概率稀疏注意力机制,通过 KL 散度筛选重要权重以减少计算;注意力蒸馏,压缩编码层以降低内存;以及一次性解码输出,提升预测效率。这些改进共同使模型更高效、准确。
URL
type
status
date
slug
summary
tags
category
icon
password
最近读了一篇关于时序预测的论文!博主在这里记录一下自己的理解,以及Debug源码注意细节。
📝 论文内容和代码
本篇论文使用TransFormer解决长时间序列(LSTF)问题。但是,原TransFormer具有以下几个问题:
- 如果输入序列长度增加,则需要计算的参数量以及占用GPU显存增加。同时,不是所有的Q*K.T权重值都能发挥作用,具有长尾分布特征。
- 编码层和解码层都会堆叠n个Attention blok,导致参数量和GPU显存占用直接增加2*n倍(编码层和解码层)。
- 传统TransFormer的解码层通过循环输出最终结果,这会浪费大量时间。
针对上述的三个问题,论文作者分别提出如下三种方法联合解决这三个问题。
概率稀疏注意力机制
研究表明QK点积后的权重具有一定的稀疏性,即仅有少数QK点积贡献了主要注意力权重,其余点积对产生的注意力权重则微乎其微。
如果QK点积计算的权重值接近均匀分布:1/L_k,那么自主力机制会退化为对V的简单求和。这种情况下,QK的作用便会失效。
基于上诉权重失效的问题,论文作者使用了KL损失计算QK点积每个权重与1/L_k的不相关性。如果QK点积中的权重之与1/L_k存在相关性,则该权重值会被放弃,即被稀疏掉。如下是KL离散计算公式:
接下来,我们将QK点积的权重与1/L_k带入KL公式中:
首先,我们需要了解QK点积后需要经过softmax,所以KL中的Q(x_i)公式如下:
接着,KL中P(x_i)公式如下:
再接着,将两公式带入KL中。公式如下:
再接着,将KL公式中log项展开。公式如下:
再接着,将KL中的第一项展开。公式如下:
再接着,将KL中的第二项展开。公式如下:
其中,公式8的第二项变化为公式9的第二项是因为每个1/L_k都乘以相同的对数值,所以可以直接计算L_k个1/L_k。
紧接着,将公式9带入公式6.公式如下:
再接着,因为L_k为常数,可以直接去掉。公式如下:
最后,循环计算每个q_i查询向量对所有的k的KL值,并对KL值从大到小排序,选择排序靠前top_k的q_i查询向量。
如上便是,论文作者如何查询稀疏的方法。但是,在计算过程中,仍然进行了QK全矩阵的点积运算,并没有起到降低运算显存占用的作用。
基于上述理论基础,论文作者进一步提出概率稀疏注意力机制。即先随机抽取n个K值,然后每个q_i与这个n个K值进行点积运算。通过公式11计算相关性,进行从大到小排序。最后,挑选排名靠前的top_k个q_i。
但是,公式11的第一项计算依然有点复杂,论文作者为了简便公式11的第一项,进行了如下转换:
接着,将公式12带入公式10。公式如下:
将公式13和公式11进行对比,发现公式13大大降低了计算复杂度,缩减运行时间。那么,上诉便是论文作者进行概率稀疏自注意力机制的数学理论分析。
代码如下:
总结:
结合代码分析,概率稀疏中的概率主要是在K矩阵中随机抽样n个k_i向量。每个q_i与抽样出的n个k_i值进行点积运算。然后,通过公式13计算相关性,筛选稀疏index。接着,将Q矩阵通过index筛选出目标q_i。最后,使用目标q_i与K进行点积计算。
其中,概率-随机抽样K值提升了模型泛化性,即每个K值都有一定的概率被抽到用于筛选q_i向量。
注意力机制蒸馏
每个编码层和解码层都包含了多个Attention Block。每个Attention Block都是等维对应的。在模型训练中,Block间的连接输入,并不是所有都有效。针对此问题,论文作者提出了注意力机制蒸馏。如下图:

代码如下:
总结:
从代码中,我们可以发现论文作者通过一个最大池化层实现注意力机制蒸馏的效果。
Decode一次性输出预测值
传统TransFormer的Decode是循环输出,即一个token一个token输出,无法一次性输出所有目标token。针对此问题,论文作者对传统TransFormer的Decode输出层做了修改,一次性输出所有目标预测值。
代码如下:
总结:
从代码中,我们可以发现论文作者将传统TransFormer的生成层作为一次性输出层。其实,这里转换里层的概念理解,只不过损失函数是MSE损失函数,不再是KL损失计算相似度。
🤗 借鉴代码
上诉是论文的核心思想。在复现论文作者代码时,博主发现论文作者处理时序信息的方式和代码值得我们去借鉴,甚至可以直接拿来使用。
以下代码主要用于将时序特征进行词嵌入。
📎 参考文章
以上便是此次博客的主要内容,欢迎您在底部评论区留言,一起交流~
- 作者:不爱吃香菜的萌新
- 链接:https://hexo.levsongsw.com//paper/informer1
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。





