前言
本文是在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)过程中,解码器的输入总是需要依赖上一时间步的输出(类似RNN),这就限制了模型的预测的速度(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的平均值,即保证了注意力层的输入和输出的长度不变
蒸馏机制就是使用卷积加池化的方式降低序列的长度
生成式解码器是在解码器的输入中,使用预测时间前的部分序列和预测时间的占位序列,作者表明这样就能在inference中实现一步预测。(由于还没看源码,这块有点迷糊)
Informer的整体结构如下:
总结
该论文最大的亮点是对自注意力机制的时空复杂度优化,使模型轻量化的同时还能拥有强大的预测性能。看完这篇论文,对编解码的具体结构,模型的输入输出以及训练和测试的具体情况等细节不清楚,后续还是要好好啃啃源码(Informer源码)