1.时间序列预测
上一个序列数据,预测下一个序列。
(1)短序列预测;传统算法大多数只能依靠已知的时间序列预测未来很短的时间段
(2)趋势预测;
(3)精准长序列预测。长序列很难预测准, 首先做预测,然后用预测的结果再去预测,非常困难。
Informer 可以预测未来较长的一个序列
经典算法:
Prophet:适合预测趋势,但是不精准
Arima:短序列预测还算准确,但是趋势预测不准
上面的算法不适合长序列和多标签
Informer致力于长序列问题的解决,也可以多标签预测
LSTM:在长序列预测中,如果序列越长,速度越慢,效果越差。
2. Informer算法的核心思想
核心:transfomer架构,建立好长输入和长输出之间的关系
Transformer架构的优势与问题:
1.代码简单,并行的,注意力机制效果好
2.长序列中attention需要每一个点跟其它点计算(序列太长,效率低)
3.Decoder过程需要基于上一个预测结果推断下一个预测结果
要解决的三个问题
1.Attention计算更快
2.Decoder一次输出所有序列
3.堆叠encoder也要更快
Informer作者经过观察对于每一个Q来说,只有一小部分的K于其它关系较强,所以要找出有用的Q值。
1.偷懒的Q感觉就像均匀分布,没啥特点
2.Active的Q明显在某些位置比较活跃,权重差异较大
3.对于每一个Q,计算其与均匀分布的差异,差异越大则越活越
M ( q i , K ) = ln ∑ j = 1 L K e q i k j ⊤ a − 1 L K ∑ j = 1 L K q i k j ⊤ d M(\mathbf{q}_{i},\mathbf{K})=\ln\sum_{j=1}^{L_{K}}e^{\frac{\mathbf{q}_{i}\mathbf{k}_{j}^{\top}}{\sqrt{a}}}-\frac{1}{L_{K}}\sum_{j=1}^{L_{K}}\frac{\mathbf{q}_{i}\mathbf{k}_{j}^{\top}}{\sqrt{d}} M(qi,K)=lnj=1∑LKeaqikj⊤−LK1j=1∑LKdqikj⊤
ProbAttention计算方法:
输入序列长度为96,首先在K中进行采样,随机选25个K
现在要选出来的是一些重要的Q,正常情况需每一个Q跟96个K计算
重要的Q不用非得计算那么多,跟部分K计算的结果也可以当作其分布
例如源码输出结果:32,8,96,25表示8头注意力,96个Q分别跟25个K计算的内积
现在每一个Q有25个得分(分别跟25个K计算后得到的)
M ‾ ( q i , K ) = max j { q i k j ⊤ d } − 1 L K ∑ j = 1 L κ q i k j ⊤ d \overline{M}(\mathbf{q}_i,\mathbf{K})=\max_j\{\frac{\mathbf{q}_i\mathbf{k}_j^\top}{\sqrt{d}}\}-\frac1{L_K}\sum_{j=1}^{L\kappa}\frac{\mathbf{q}_i\mathbf{k}_j^\top}{\sqrt{d}} M(qi,K)=jmax{dqikj⊤}−LK1j=1∑Lκdqikj⊤
论文中做法,为了进一步加速,直接选最大值与均匀分布算差异
在96个Q中,选出来差异最大的25个(根据序列长度来定的一个参数值)
得到的QK内积为:32,8,25,96,就是只选了25个Q
那么其它位置的Q该咋办呢?没有计算其attention
直接用V(96个,表示每一个位置的特征)的均值来替代
也就是选出来的25个会更新,其他剩余的都是均值向量
Self-attention Distilling计算方法:
做完一次attention之后还要继续推叠,只不过与传统transformer不同
会先通过1D的mapool操作来进行下采样,下次输入序列就为48了
此时Q和K的深度由于序列长度变小,也会随之变小
重复堆叠多次就是lnformer的Ercoder架构了
Decoder输入
源码中decoder输入长度为72,其中前48是真实值,后24是预测值
第一步还是做自身的ProbAttention,注意这回需要加上mask
Mask的意思就是前面的不能看到后面的(不能透题)
自身计算完Attention,再算与encoder的Attention即可
位置编码信息
绝对位置编码
跟时间相关的各种编码
Encoder与Decoder都加入了