文章行文思路:
目录
- 一、背景:
- 1.时间序列介绍:
- 2.LSTF介绍:
- 3.Transformer与Informer的关系:
- 二、Transformer:
- 1.Transformer简介:
- 2.Transformer整体架构:
- 3.模型输入:
- 3.1第一层Encoder输入:
- 3.11 细节说明:
- 3.111 “token”解释:
- 3.112 Embedding原理:
- 3.113 Positional Encoding原理:
- 3.114 “特征”解释:
- 3.2 第一层Decoder输入:
- 3.21 细节说明:
- 3.211 “标签列”解释:
- 4.Encoder:
- 4.1 Encoder组成与功能:
- 4.2 Self-Attention:
- 4.3 Multi-Head Attention:
- 4.4 Add残差连接:
- 4.5 Norm层归一化:
- 4.6 Feed-Forward Networks:
- 4.7 Encoder堆叠:
- 5.Decoder:
- 5.1 Decoder组成与功能:
- 5.2 Masked Multi-Head Attention:
- 5.3 Multi-Head Attention:
- 5.4 Decoder堆叠:
- 6.模型输出:
- 7.Transformer训练和预测过程总结:
- 三、Informer:
- 1.简介:
- 2.传统Transformer在时序预测方面缺点和Informer改进方法:
- 3.Informer整体架构:
- 4.Informer优化详解:
- 4.1 ProbSparse Self-attention:
- 4.2 Self-attention Distilling:
- 4.3 Generative Style Decoder:
- 4.4 Positional Encoding:
- 5.模型输入输出角度理解Informer训练和预测过程:
- 5.1 Encoder Embedding输入:
- 5.2 Decoder Embedding输入:
- 5.3 Embedding输入输出:
- 5.31 输入:
- 5.32 输出:
- 5.4 ProbSparse Self-attention输入输出:
- 5.41 输入:
- 5.42 Active输出:
- 5.43 Active+Lazy输出:
- 5.43 多头注意力合并:
- 5.5 Encoder输入输出:多个Encoder和蒸馏层的组合
- 5.51 输入:
- 5.52 输出:
- 5.6 Decoder输入输出:
- 5.61 输入:
- 5.62 输出:
- 四、Informer代码介绍:
- 五、实验
一、背景:
1.时间序列介绍:
时间序列是指将同一统计指标的数值按其发生的时间先后顺序排列而成的数列。
时间序列分析的主要目的是根据已有的历史数据对未来数据进行预测。经济数据中大多数以时间序列的形式给出。根据观察时间的不同,时间序列中的时间可以是年份、季度、月份或其他任何时间形式。
2.LSTF介绍:
LSTF(Long Sequence Time-Series Forecasting)即长序列时间序列预测。
它是时间序列预测问题的一种特殊场景,要求模型具有很高的预测能力,即能够有效地捕捉输出和输入之间精确的长程相关性耦合。在实际应用中,如用电量使用规划等问题中,需要对长序列时间序列进行预测。
3.Transformer与Informer的关系:
Informer和Transformer都是神经网络架构。
Informer是在Transformer的基础上进行了改进和优化,旨在提高处理长序列的速度和效率。
因此学习Informer前提是掌握Transformer。故我们在本文中首先详细讲解Transformer,然后在讲解Informer时主要讲解其在Transformer上的改进。
二、Transformer:
论文地址:Transformer论文地址
1.Transformer简介:
目前,在NLP领域当中,主要存在三种特征处理器——CNN、RNN以及Transformer,当前Transformer的流行程度已经大过CNN和RNN,它抛弃了传统CNN和RNN神经网络,整个网络结构完全由Attention机制以及前馈神经网络组成。
BERT算法(进击的巨人)的最重要的部分便是Transformer的概念,它本质上是Transformer的编码器部分。自从Transformer使用了抛弃RNN、CNN的纯Attention机制之后,各种基于Transformer结构的预训练模型都如雨后春笋般雄起,本文中Informer便是其中一员。
2.Transformer整体架构:
Transformer的结构图,拆解开来,主要分为图上4个部分,接下来我将按照1,2,3,4的顺序逐步介绍上图中Transformer的网络结构,这样既能够弄清楚结构原理,又能够方便理解Transformer模型的工作流程。
3.模型输入:
3.1第一层Encoder输入:
第一步: 以用电量时间序列预测为例,Inputs为n个时间步长(实验中以96h为例)的用电量数据,经过Embedding后将每个小时的用电量数据升维成d维(实验中以512维为例)的向量,因此Embedding的输出是一个包含n个token的序列,每个token用一个d维(512)向量表示,可以用矩阵x表示(x的大小是d×n)
第二步: inputs执行embedding后需要给每个token添加位置编码positional encoding,因为时间序列的时间特征也很重要,例如用电量数据往往具有周期性(周一至周五家庭用电量少,周六至周日家庭用电量多),所以我们需要对每个token进行位置编码,生成矩阵y(y的大小是d×n)。
第三步: 矩阵x与y进行相加,作为Encoder的输入。
注:仅第一层Encoder输入同上,后续Encoder的输入不再同上,而是上一层Encoder的输出。
3.11 细节说明:
3.111 “token”解释:
在时间序列预测的上下文中,token通常指的是输入序列中的一个基本单元或元素,对于用电量时间序列数据,每个token代表一个时间步长(小时)的用电量数据。例如,如果你有一个按小时记录的用电量数据集,每个token可能就是一个小时的用电量值。
3.112 Embedding原理:
Embedding对低维数据进行升维时,会把一些特征给放大,或者把笼统的特征给分开。
原理就是矩阵乘法,其中被乘数是时间序列数据,乘数是嵌入矩阵Embedding Matrix,Embedding Matrix在训练过程中根据反向传播算法和优化器进行更新,使得时间序列数据在乘Embedding Matrix后能更好地放大其数据中的特征。
因此,这个Embedding层一直在学习优化,使得整个数据升维过程慢慢形成一个良好的观察点,即Embedding Matrix。
3.113 Positional Encoding原理:
Transformer使用的是正余弦位置编码。位置编码通过使用不同频率的正弦、余弦函数生成,然后和对应的位置的词向量相加,位置向量维度必须和词向量的维度一致。
3.114 “特征”解释:
特征即数据中有用的数据信息,例如每个时间步的用电量值…
3.2 第一层Decoder输入:
Decoder的输入与Encoder的输出处理方法步骤是一样的,区别是Encoder输入为特征数据,而Decoder输入为标签target数据。
注意Decoder在训练阶段target为真实值,并且用到了mask机制(详见Decoder层),而在预测阶段target为空,即模型不接收target输入。
对应到上面例子里面就是:在多变量预测单变量的用电量预测中,使用图书馆、办公楼的用电量数据预测信息楼的用电量数据。
- 模型训练阶段 Encoder输入的是图书馆、办公楼的用电量数据,Decoder输入的是执行mask机制后信息楼的用电量数据真实值(因为mask所以每层输入的真实值个数是递增的)。
- 模型预测阶段 Encoder输入的是图书馆、办公楼的用电量数据,第一层Decoder输入为Null。Decoder每次输入是上一时刻Transformer的输出。例如,输入"“,输出"信息楼1/1用电量预测”,输入"信息楼1/1用电量预测",输出"信息楼1/1与1/2用电量预测"…
3.21 细节说明:
3.211 “标签列”解释:
在多变量预测单变量的用电量预测中,使用图书馆、办公楼的用电量数据预测信息楼的用电量数据。特征列即为图书馆、办公楼的用电量数据,标签列即为被预测的数据列,即信息楼的用电量数据。
4.Encoder:
4.1 Encoder组成与功能:
Encoder由多头注意力机制Multi-Head Attention和前馈神经网络Feed Forward Network组成,用于捕捉输入序列中的上下文关系和特征表示。Encoder重复堆叠N层有助于提取输入序列中的深层特征表示。
举例来说:用269栋建筑的用电量数据预测第270栋建筑的用电量数据时,Encoder部分负责计算269栋建筑用电量的相关性信息,并通过跨注意力机制将这些信息(编码矩阵)传递给Decoder。
4.2 Self-Attention:
简单来说,注意力Attention就是:输入序列较重要点获得较高的权重(更多的注意力),不重要的点获得较低权重(更少的注意力)
注意力机制函数入参:查询向量 Q、键向量 K、值向量 V通过对输入序列的线性变换(矩阵乘法)得到,其中X为Encoder输入的矩阵,X的每行为一个token,X通过乘三个权值矩阵WQ,WK,WV ,转变成为计算Attention值所需的Query,Keys,Values向量。其中矩阵WQ,WK,WV 为三个超参数,在模型训练阶段不断更新。
Q,K,V第n行代表的是X第n行的token的数据信息。 得到Q,K,V之后,接下来就是计算Attention值了。
- QKT是为了计算查询矩阵Q中每个行向量q(代表之前的每个token)与键矩阵K中每个行向量k之间的相关性,获得每个查询向量q与每个键向量k之间的注意力分数。
- 除根号√dk是归一化操作,目的是确保注意力权重的分布更加均匀、训练时梯度能够稳定,其中dk就是K的维度。
- Softmax()回归将输入的向量转化为具有和为1的概率分布,用概率分布更好的体现查询向量q与每个键向量k之间的相关性。
- 乘值矩阵V做加权目的是得到最终的注意力,为了突出与每个查询向量q更相关的序列部分。
注意力机制的目的是:突出查询向量q与每个键向量k之间的相关性,从而强调输入序列中与该查询向量更相关的部分。
4.3 Multi-Head Attention:
单一的注意力机制能挖掘到的信息有限,通过多次自注意力计算来关注序列不同位置的子空间表示信息,同时不同的头可以关注序列的不同特征表示,从而更好地提取输入序列中的特征。
self-attention只使用了一组WQ,WK,WV来进行变换得到Query,Keys,Values。而Multi-Head Attention使用多组WQ,WK,WV得到多组Query,Keys,Values,然后每组分别计算得到一个Z矩阵,最后将得到的多个Z矩阵进行拼接,合并输出全局特征Z。Transformer里面是使用了8组不同的WQ,WK,WV
- 每个头Head有单独的WQ,WK,WV,所有WQ,WK,WV在模型训练阶段都做为超参数不断更新。
4.4 Add残差连接:
防止在深度神经网络训练中发生退化问题,即深度神经网络通过增加网络的层数,Loss逐渐减小,然后趋于稳定达到饱和,然后再继续增加网络层数,Loss反而增大。
4.5 Norm层归一化:
能够加快训练的速度、提高训练的稳定性。归一化使得使每一行的概率和为1,归一化后的数据在进行梯度下降寻找最优参数时,更容易找到最优解。
4.6 Feed-Forward Networks:
这里的全连接层是一个两层的神经网络,先线性变换,然后ReLU非线性,再线性变换。
这两层网络就是为了将输入的Z映射到更加高维的空间中,然后通过非线性函数ReLU进行筛选,筛选完后再变回原来的维度。
通过这种前馈网络的设计,Transformer 模型能够学习到输入序列中的更复杂的特征和模式, 从而提高模型的表达能力和泛化能力。
4.7 Encoder堆叠:
Feed-Forward Networks输出经过Add&Normalize,输入下一个Encoder中,经过6个Encoder后最终输出的是每个输入token对应的上下文向量表示,也称为"编码矩阵"(encoding),其中包含了每个token与其余token的关系(全局相关性)信息,最后输入到decoder中。
5.Decoder:
5.1 Decoder组成与功能:
每个Decoder有两个Multi-Head Attention层和一个Feed Forward Network组成。第一个Multi-Head Attention层采用了Masked操作。第二个Multi-Head Attention层的K、V矩阵输入源来自Encoder的输出编码矩阵,而Q矩阵是由经过Add & Norm层之后的输出计算来的。Decoder在训练过程中通过Encoder的编码矩阵和带预测值的真实值来生成预测序列,并通过损失函数和优化算法来优化模型的预测能力。这样,模型就可以学会利用编码矩阵来预测标签列。
举例来说:用269栋建筑的用电量数据预测第270栋建筑的用电量数据时,Decoder利用Encoder的编码矩阵以及第270栋建筑的真实用电量数据来生成预测序列,并通过损失函数和优化算法来优化模型的预测能力。这样,模型就可以学会利用其他建筑的用电量数据来预测第270栋建筑的用电量。
5.2 Masked Multi-Head Attention:
Masked Multi-Head Attention的功能是为了得到之前已经预测输出的真实值信息。
mask 表示掩码,它对某些值进行掩盖,使其在参数更新时不产生效果。对于一个序列,我们的解码输出应该只能依赖于 t 时刻之前的输出,而不能依赖 t 之后的输出。因此我们需要想一个办法,把 t 之后的信息给隐藏起来。实现思路为:产生一个上三角矩阵,上三角的值全为0。把这个矩阵作用在每一个序列上,就可以达到我们的目的。
这在训练的时候有效,因为训练的时候采用Teacher Forcing的训练方式,每次我们是将target真实数据 (答案) 完整输入进Decoder中的,预测时不需要,预测的时候我们只能得到前一时刻预测出的输出。
5.3 Multi-Head Attention:
Decoder中Multi-Head Attention的功能是通过当前的输入与经过Encoder提取过的编码矩阵来预测输出。
它的输入Query来自于Masked Multi-Head Attention的输出,Keys和Values来自于Encoder中最后一层的输出。为了让Decoder能够利用Encoder中的信息,学习到输入序列的全局依赖关系和重要特征,从而更好地生成输出序列。
5.4 Decoder堆叠:
经过第二个Multi-Head Attention之后的Feed Forward Network与Encoder中一样,然后就是输出作为下一个Decoder的输入,如此经过6层Decoder之后到达最后的输出层。
6.模型输出:
首先经过一次线性变换,然后Softmax得到输出的概率分布,然后通过词典,输出概率最大对应的值作为我们的预测输出。
7.Transformer训练和预测过程总结:
用269栋建筑的用电量数据预测第270栋建筑的用电量数据为例:
- 训练阶段:
- Encoder部分负责计算269栋建筑用电量的相关性信息,并通过跨注意力机制将这些信息(编码矩阵)传递给Decoder。
- Decoder利用Encoder的编码矩阵以及第270栋建筑的真实用电量数据(注意使用mask机制)来生成预测序列,并通过损失函数和优化算法来优化模型的预测能力,获取最优超参数。这样,模型就可以学会利用其他建筑的用电量数据来预测第270栋建筑的用电量。
- 预测阶段:
- 预测阶段所有超参数已经确定,且为已知常数值。
- Encoder部分负责计算269栋建筑用电量的相关性信息,并通过跨注意力机制将这些信息(编码矩阵)传递给Decoder。
- Decoder利用Encoder的编码矩阵以及模型来生成预测序列(例如模型为y=ax+b,ab为超参数已知,通过传入编码矩阵x到模型中计算第270栋建筑的预测值y),具体来说,预测值的生成不是一次完成的,而是一个一个的,首先会给Decoder输入开始标志(第一层Decoder输入为Null),然后经过Decoder会预测出第270栋建筑11/1日的用电量预测值,然后拿着第270栋建筑11/1日的用电量预测值作为Decoder输入去预测第270栋建筑11/2日的用电量预测值,但后拿着第270栋建筑11/1、11/2日的用电量预测值作为Decoder输入去预测第270栋建筑11/3日的用电量预测值,以此类推。
三、Informer:
论文地址:Informer论文地址PDF点击即可阅读
代码地址:论文官方代码地址点击即可跳转下载GIthub链接
1.简介:
Informer是一种专为 长序列时间序列预测(LSTF) 设计的Transformer模型。相较于传统的Transformer,Informer具备了三个独特特点。首先,他采用ProbSparse自注意力机制,具有O(LlogL)的时间复杂度和内存使用。能够有效捕获序列中的长期依赖关系。其次,通过自注意力蒸馏技术,Informer能够高效处理极长的输入序列。最后,Informer的生成式解码器可以一次性预测整个长时间序列,在预测过程中大幅提高了效率。经过大规模数据集的实验验证,Informer在LSTF问题上表现优秀,为长序列时间序列预测提供了一种高效准确的解决方案,克服了传统Transformer模型的限制。
2.传统Transformer在时序预测方面缺点和Informer改进方法:
Transformer的缺点 | Informer的改进 |
---|---|
self-attention平方级的计算复杂度 | 提出ProbSparse Self-attention筛选出最重要的Q,降低计算复杂度 |
堆叠多层网络,内存占用瓶颈 | 提出Self-attention Distilling进行下采样操作,减少维度和网络参数的数量 |
step-by-step解码预测,速度较慢 | 提出Generative Style Decoder,一步可以得到所有预测的 |
3.Informer整体架构:
4.Informer优化详解:
4.1 ProbSparse Self-attention:
通过以上图可以看到,并不是每个q与k之间都具有很高的相关性(内积),即不是所有q都具有很高的活跃度,我们不需要花很多时间在处理这些弱活跃度的q上,因为这些q提取不出数据间的相关性和好的特征。这就是该算法改进的突破口。
改进算法如下:
(1)输入序列长度为96,首先在K中进行采样,随机选取25个k。
(2)计算每个q与25个k的内积,现在一个q一共有25个得分。
(3)每个q在25个得分中,选取最高分的与均值算差异。
(4)这样我们输入的96个q都有对应的差异得分,我们将差异从大到小排列,选出差异前25大的q。
(5)其他淘汰掉的q使用V向量的平均来代替。
4.2 Self-attention Distilling:
在相邻的Attention Block之间加入卷积池化操作,来对特征进行降采样。对输入维度进行修剪,堆叠n层,每层输入序列长度减半,从而将空间复杂度降低到O(nlogn)
4.3 Generative Style Decoder:
源码中的decoder输入长度为72,其中前48是真实值,后24是预测值。我们可以理解为一段有效的标签值(48个真实值)带着一群预测值(24个待预测值)进行学习,这种方法可以一步到位生成目标序列,不需要再使用动态解码。
4.4 Positional Encoding:
Informer在Transformer位置编码(Local Time Stamp)的基础上,加入了Global Time Stamp,可以更好的提取输入序列中的时间特征。
Encoder输入改进如下:
- Scalar:Embedding升维
- Local Time Stamp:位置编码
- Global Time Stamp:提取时间特征
5.模型输入输出角度理解Informer训练和预测过程:
数据集:BDG2
(小时维度的数据) 数据规格:17420 * 320
Batch_size:32
5.1 Encoder Embedding输入:
Xenc = 32 × 96 × 320
- 32为batch大小,一个batch有32个样本,一个样本代表96个时间点的数据。
- 320为每个数据的维度,表示每个时间点数据(每行)有320列。
Xmark = 32 × 96 × 4
- 32 × 96同上,表示每个时间点的数据都要有一个位置编码,Xmark与Xenc每行一一对应。
- 4为时间戳,例如我们用小时维度的数据,那么4分别代表年、月、日、小时,
5.2 Decoder Embedding输入:
Xdec = 32 × 72 × 320
Xmark = 32 × 72 × 4
- 72=48+24,其中48为Encoder96的后48个时间点数据,用这些真实值来带一带预测值,24为待预测值。
- 48为绿色部分,24为白色部分填充0(mask机制)
5.3 Embedding输入输出:
将维度为320/7的一个时间点的数据投影成维度为512的数据。
5.31 输入:
32 × 96/72 × 320
32 × 96/72 × 4
5.32 输出:
32 × 96/72 × 512
5.4 ProbSparse Self-attention输入输出:
5.41 输入:
32 × 8 × 96 × 64 (8 × 64 = 512,这也是多头的原理,即8个头)
5.42 Active输出:
32 × 8 × 25 × 64 (只取25个活跃q)
5.43 Active+Lazy输出:
32 × 8 × 96 × 64 (除了25个活跃q,其余q用V向量的平均来代替)
5.43 多头注意力合并:
32 × 96 × 512
5.5 Encoder输入输出:多个Encoder和蒸馏层的组合
5.51 输入:
32 × 96 × 512(来自上面embedding 长度为96的部分)
5.52 输出:
32 × 51 × 512(这里的51应该是conv1d卷积取整导致的,因为源码要自行调整,所以是这样的)
5.6 Decoder输入输出:
5.61 输入:
32 × 51 × 512 & 32 × 72 × 512(32 × 51 × 512是Encoder输出,32 × 72 × 512是Decoder Embedding后的输入)
5.62 输出:
32 × 72 × 512