前言
本文是在Transformer的基础上进行的改进,首先作者提出Transformer在长时间序列预测中的三个局限性:
- 自注意力的二次计算复杂度 O ( L 2 ) O(L^2) O(L2)(L表示输入序列的长度)
- 堆叠J层编码器(解码器)后会是内存使用量达到 O ( J L 2 ) O(JL^2) O(JL2),这限制了模型接收长序列输入的可伸缩性
- Transformer解码器中step-by-step推断流程,会导致在预测长输出时速度急剧下降
Transformer
既然是在Transformer的基础上,就先了解下Transformer

Transformer单看结构还是比较好理解,编解码器组合,编解码器中都是多层多头注意力和前馈神经网络组成。多头注意力思想就是执行多次注意力以达到更稳定的注意力分配,可以参考注意力机制的改进
Transfromer中使用的自注意力,公式如下

一般Q的长度等于K,故其中点积
Q
K
T
QK^T
QKT的时间复杂度达到
O
(
L
2
)
O(L^2)
O(L2)(1)
其次,Transformer在预测(inference)过程中,解码器的输入总是需要依赖上一时间步的输出(自回归的特性),这就限制了模型的预测的速度(3)。
本文贡献
- 改进原先的自注意力机制,提出一个ProbSparse self-attention mechanism,实现了 O ( L l o g L ) O(LlogL) O(LlogL)的时间复杂度和空间复杂度
- 提出自注意力蒸馏机制,降低时间和空间花费
- 提出生成式解码器,避免了step-by-step的缺陷
方法
作者可视化自注意力机制中的两个注意力分数分布,发现都符合长尾分布,即只有少数点积对贡献了主要的注意力,而大部分的可以直接忽略。

基于上述观点,作者提出了ProbSparse self-attention mechanism,即在Q中找到最重要的几个查询点,只对这几个点做自注意力计算,以此来大大降低时间复杂度。
怎么来衡量Q中哪些点比较重要呢?后面作者给出一堆数学推导证明,证明其提出的衡量方法的合理性。由于本人数学比较菜,这里就省略证明过程(可查看原文地址),直接介绍ProbSparse self-attention是怎么实现的:
对于
Q
∈
R
m
×
d
Q\in R^{m\times d}
Q∈Rm×d,
K
∈
R
n
×
d
K\in R^{n\times d}
K∈Rn×d,
V
∈
R
n
×
d
V \in R ^ {n \times d}
V∈Rn×d
1、设置超参数 c ,令
u
=
c
ln
m
u=c\ln m
u=clnm ,
U
=
m
ln
n
U=m\ln n
U=mlnn
2、从 K 中随机选择 U 个点 得到
K
′
∈
R
U
×
d
K'\in R^{U\times d}
K′∈RU×d
3、令
S
′
=
Q
K
′
T
∈
R
m
×
U
S'=QK'^T\in R^{m\times U}
S′=QK′T∈Rm×U
4、计算衡量得分
M
=
m
a
x
(
S
′
)
−
m
e
a
n
(
S
′
)
∈
R
m
×
1
M=max(S')-mean(S')\in R^{m\times 1}
M=max(S′)−mean(S′)∈Rm×1(按行计算)
5、根据 M 取最大的 u 个Q来和K计算注意力,这里就和自注意力机制一样了,但是只能得到 u 个结果
6、剩余L-u个结果直接取V的平均值,即保证了注意力层的输入和输出的长度不变
蒸馏机制就是使用卷积加池化的方式降低序列的长度
Transformer在训练中能使用teacher forcing的方式(用输入的标签中的上一步的真实值来得到下一步的预测值)使解码器一步得到所需预测长度的结果,但是在inference中,不存在标签,预测 i 步时只能使用 i-1 步得到的预测值(step-by-step)。生成式解码器是在解码器的输入中,使用预测时间前的部分序列和预测时间段的占位序列(零值),占位序列中包含了预测序列中的时间戳信息,即上下文信息。作者表明这样就能在inference中实现一步预测。(个人感觉就是用零值代替了teacher forcing中的标签,但是不能提供真实值,只能提供位置信息和预测时段的一些嵌入信息,包括周末、月份、节假日信息)

Informer的整体结构如下:
编码器输入:(b, seq_len, d)+ 其它信息的嵌入
解码器输入:(b, label_len+pred_len, d)+ 其它信息的嵌入
输出:(b, pred_len, d)解码器的输入输出维度是不变的,输出结果直接在解码器输出中截的

总结
该论文最大的亮点是对自注意力机制的时空复杂度优化,使模型轻量化的同时还能拥有强大的预测性能。看完这篇论文,对编解码的具体结构,模型的输入输出以及训练和测试的具体情况等细节还不是很清楚,后续还是要好好啃啃源码(Informer源码)
这段时间又看了下源码,细节也大致了解了,整体结构确实和Tranformer很像,解码器中非Mask注意力同样使用编码器的输出作为K和V,主要的区别点也就是作者提到的几个亮点。
1万+



被折叠的 条评论
为什么被折叠?



