06-Transformer :时间序列建模范式转折点

06-Transformer :时间序列建模范式转折点

导出时间:2026/1/14 20:39:09
现在从 LSTM → BiLSTM → Seq2Seq → Attention(Luong) 走到 Transformer,这个路线非常标准

1、研究背景和动机

1)Transformer 提出前的主流:Seq2Seq + RNN + Attention

在 Transformer 出现之前,解决“序列到序列”问题(翻译、语音、时间序列预测)的主流套路是:
  • Encoder:RNN/LSTM/GRU 读输入序列
  • Decoder:RNN/LSTM 生成输出序列
  • 中间加 Attention:让 Decoder 每一步“回头看 Encoder”
前面学的 Luong Attention 就是这个时代的典型代表。

2)当时的核心矛盾:Attention 很强,但 RNN 成了瓶颈

Transformer 那篇论文叫:

Attention Is All You Need(注意力就是你所需要的一切)

它提出的背景非常明确:

既然 Attention 已经能很好地“找信息/对齐”,那为什么我们还要用 RNN 这种慢且难训的结构?

换句话说:

Attention 是发动机,RNN 成了拖后腿的车架。


3)Transformer 提出的三大动机(通俗版)

动机1:RNN 天生不能并行,训练太慢

RNN/LSTM 的结构问题

RNN 是“串行处理”的:
  • 必须先算完 ht−1
  • 才能算 ht
所以训练时即使你有很强的 GPU,也会出现:

GPU 在等前一步算完,没法把所有时间步一次算出来。

形象理解

RNN 像“人工流水线”:
  • 第 1 个工人做完,第 2 个才能做
  • 必须排队
Transformer 的目标之一就是:

让序列计算可以像 CNN 一样并行化


动机2:长序列依赖很难学(即使用 LSTM 也不够理想)

虽然 LSTM 解决了部分长期依赖问题,但在很长很长的序列里依然存在困难:
  • 信息需要经过很多时间步传递
  • 关键线索要“跨越很远”才能影响后面的预测
  • 结果就是:学习效率低、表达受限

形象理解

RNN 的信息传播像“传话游戏”:

A → B → C → ... → Z 传到后面经常变味、丢信息。

Transformer 的想法是:

让任意两个位置可以直接建立联系,别再一层层传。


动机3:Attention 虽能看全局,但“Attention + RNN”仍不够干净

你学过 Attention,已经知道它的优势:

每一步输出,都可以对输入所有位置打分、取重点。

但在 Seq2Seq 中 Attention 只是“外挂”,仍然:
  • Encoder 是 RNN 串行编码
  • Decoder 是 RNN 串行生成
  • Attention 只是在 Decoder 每一步帮忙“翻书”
Transformer 的动机是更激进的:

既然注意力能解决“找重点”和“对齐”,那干脆把 Encoder/Decoder 也全部改成 Attention 结构。



4)Transformer 的关键思想:把“序列理解”变成“全局信息交互”

Transformer 的核心一句话是:

用 Self-Attention 让序列内部所有位置彼此交互,从而建模序列依赖。

Self-Attention 是什么(直觉)

  • Attention:Decoder 看 Encoder(跨序列对齐)
  • Self-Attention:序列内部自己看自己(同一序列里任意位置互相看)
形象理解:

不是“从左读到右”理解句子 而是让每个词都能同时看整句话,并决定该听谁的。




2、模型的网络结构

0)这张图整体在表达什么?

Transformer 是一个“两段式”模型:
  • 左边:Encoder(编码器)——负责“读懂输入序列”
  • 右边:Decoder(解码器)——负责“根据输入的理解,生成输出序列”
你可以把它类比成:
  • Encoder:阅读理解(把材料读懂)
  • Decoder:写作文(根据材料写答案)
image.png

1)最底部:Input Embedding + Positional Encoding

1.1 Input Embedding / Output Embedding(粉色块)

  • 输入是一个序列(在 NLP 是 token;在时间序列就是数值/特征向量)
  • 模型需要把每个位置的输入变成同一维度的向量(比如 512 维),便于后面统一计算
  • 这一步就是 Embedding(嵌入/投影)

时间序列场景里:通常不是“查表 embedding”,而是一个线性层把特征投影到 dmodeld_{model}dmodel。


1.2 Positional Encoding(位置编码,旁边的 “+”)

Transformer 没有 RNN 的顺序递推,所以它本身不知道“第1个点”和“第10个点”的先后关系。 因此需要把“位置信息”加进去。
图里就是: Embedding 向量 + 位置编码 = 带位置信息的表示
形象理解:
  • Embedding:每个词/每个时间点“是什么内容”
  • Positional Encoding:这个内容“在第几位/什么时候发生”

2)左边:Encoder 堆叠 N 次(标 N×)

你图左边大框旁边写 ,意思是 Encoder block 会重复 N 层(例如 6 层)。
每一层 Encoder 都有两块核心:
  1. Multi-Head Attention(注意力)
  2. Feed Forward(前馈网络)
并且每块外面都有 Add & Norm(残差连接 + LayerNorm)。

2.1 Encoder 的 Multi-Head Attention(图中黄色块)

这是 Self-Attention(自己看自己)

序列中每个位置,都去“参考”同一个序列里其它所有位置,然后更新自己的表示。

形象理解(非常重要):
  • 你在读一句话时,理解某个词,会参考其他词
  • 你在看时间序列某个时刻,也会参考其它时刻(比如周期点、趋势点、突变点)
**Multi-Head(多头)**的意义:
  • 不是只用一种“相关性”看全局
  • 而是并行用多种视角去看(像多名专家分别关注不同模式)
    • 一个头可能专门抓“短期邻近关系”
    • 另一个头抓“周期性”
    • 另一个头抓“突变/异常关联”

最后把多个头的结果合并,让表示更丰富。


2.2 Add & Norm(图中浅黄色条)

每个子层后面都有 Add & Norm
  • Add(残差连接):把“原输入”加回去 目的:信息不容易丢、梯度更好传、训练更稳定
  • Norm(LayerNorm):把数值尺度拉回稳定范围 目的:训练更快、更稳
形象理解:
  • Add:保底机制,“不要把原来的意思丢了”
  • Norm:校准机制,“别让数值越算越飞”

2.3 Feed Forward(图中蓝色块)

这是一个对每个位置独立作用的“小 MLP”(通常两层线性 + 激活)。
它做的事很像:

位置之间的信息交互(Attention)做完以后,再对每个位置的表示做一次“非线性加工与提炼”。

形象理解:
  • Attention:负责“抄资料/查关联”
  • Feed Forward:负责“消化吸收/总结提炼”

3)右边:Decoder 堆叠 N 次(也是 N×)

Decoder 的每一层比 Encoder 多一块,所以你图里 Decoder 每层有三块:
  1. Masked Multi-Head Attention(带遮罩的自注意力)
  2. Multi-Head Attention(对 Encoder 输出的注意力,叫 Cross-Attention)
  3. Feed Forward
同样每块后都有 Add & Norm。

3.1 Outputs (shifted right)(右下角那句)

Decoder 的输入不是直接用目标序列本身,而是右移一位
  • 训练时:把真实输出序列右移后喂给 decoder
  • 让 decoder 学会“用前面的输出预测下一个”
形象理解:
  • 你写作文时:写第2个字只能看第1个字,不能偷看未来的字

3.2 Masked Multi-Head Attention(最底部黄色块)

这是 Decoder 的自注意力,但加了 mask(遮罩)

在生成第 t 个位置时,只能看 1..t-1 的内容,不能看 t+1..末尾。

为什么必须 mask?
因为解码是“逐步生成”的,如果能看到未来,就等于作弊。
形象理解:
  • 写答案时不能提前看到后面自己将写的句子

时间序列预测里,如果你是在预测未来,mask 的意义尤其重要:不能用未来真实值影响当前预测。

3.3 Decoder 中间那块 Multi-Head Attention(Cross-Attention)

这块是 Decoder 去“看 Encoder 的输出”。
也就是你之前学过的“Attention”思想在 Transformer 里的位置:
  • Decoder 当前状态(像 query)提出“我现在需要什么信息”
  • Encoder 输出(像 key/value)提供“输入材料的所有信息”
  • Decoder 从中挑重点,得到支持当前生成的上下文
形象理解:
  • Encoder:资料库(输入序列的理解结果)
  • Decoder:写作的人(生成输出)
  • Cross-Attention:写作时翻资料库查证据

3.4 Feed Forward(同 Encoder)

同样是对每个位置独立加工。

4)最顶部:Linear + Softmax(输出层)

图最上面是:
  • Linear:把 decoder 的表示映射到输出空间
  • Softmax:输出概率(NLP 是词表概率)

在时间序列预测里,往往不是 softmax,而是线性层直接输出数值(回归),或者输出均值/方差等参数(概率预测)。



3、Attention

一、先用一句话理解 Attention 在干嘛

Attention 可以理解成:

在一堆信息里挑重点,然后把重点内容汇总成一个更好的表示。

就像你写作业/预测未来时,不会把历史所有信息都平均看待,而是:
  • 有的时间点更重要
  • 有的词更关键
Attention 就是自动学习“谁更重要”。
image.png

二、左图:Scaled Dot-Product Attention(缩放点积注意力)

左边这张流程图,你可以把它看成一条流水线

1)Q / K / V 是什么(必须先懂)

这是 Attention 最关键的三个输入:

✅ Q(Query,问题)

我现在想找什么信息?

✅ K(Key,索引/标签)

每条信息的“标题/关键词”是什么?

✅ V(Value,内容)

每条信息真正的内容是什么?

形象类比:查资料
  • Q:你在搜“明天销量为什么变化”
  • K:每条历史记录的标题(时间点特征)
  • V:每条历史记录的具体内容(该时刻的信息)

2)按图中方块顺序解释(从下到上)

(1)MatMul(Q × K)

图中第一步是 MatMul,意思是做乘法:

把 Q 和所有 K 计算“相似度/相关性分数”

通俗讲就是:

我现在的问题,和每条历史信息有多相关?

相关越大,说明越该关注那条信息。

(2)Scale(缩放)

接下来是 Scale(缩放)。
这是 Transformer 特有的小技巧:
把上面的相关性分数除以一个系数(通常是 dk\sqrt{d_k}dk)。
你不用纠结数学,记住一个直觉就行:

防止分数太大,softmax 变得极端,训练不稳定。

形象类比:
  • 不缩放:某个人票数爆表,其他人都变 0 票(太极端)
  • 缩放:票数合理,模型更好学

(3)Mask(可选)

然后是 Mask (opt.)
Mask 的作用是:

把某些位置“禁止关注”(强行设成看不到)

最常见场景(时间序列预测/语言生成):

不能偷看未来!

例如预测 t+1t+1t+1 时:
  • 可以看 t,t−1,...t, t-1, ...t,t−1,...
  • 不能看 t+2t+2t+2 或真实未来
Mask 就像:

把未来信息用黑布盖住。


(4)Softmax

Softmax 的作用:

把相关性分数变成“权重”(0~1),并且所有权重加起来=1

形象类比:

投票结束后,把票数换算成每个人的权重占比。

例如:
  • 历史点1:0.6
  • 历史点2:0.3
  • 历史点3:0.1

(5)MatMul(权重 × V)

最后一个 MatMul 是:

用权重对 V 做加权求和

通俗解释:

把重要的信息多拿一点,不重要的少拿一点,最后混合成一个“汇总结果”。

这个结果就是 Attention 的输出。

✅ 左图一句话总结

Scaled Dot-Product Attention 的全过程就是:

Q 去和所有 K 算相关性 → softmax 得到权重 → 对 V 加权平均得到输出。


三、右图:Multi-Head Attention(多头注意力)

右图看起来复杂,其实核心思想一句话就够:

不要只用一种角度看问题,要用多种角度同时看。


1)为什么要“多头”?

如果只有一个 Attention,相当于:

全班只有一个老师判断重点

但一段序列里可能同时存在多种关系:
  • 短期关系(最近几步)
  • 周期关系(上周同一时刻)
  • 趋势关系(长期上升/下降)
  • 异常点关系(突变)
一个头很难全顾到。
所以 Transformer 让多个头并行:

第1个头:专门关注短期 第2个头:专门关注周期 第3个头:专门关注突变 …


2)按右图结构解释(从下到上)

(1)Linear(对 Q/K/V 各做一次线性变换)

你看到 Q/K/V 底下各有一个 Linear。
意思是:

每个头会生成自己版本的 Q/K/V(不同视角)

就像每个专家会用自己的理解方式去看同一段输入。

(2)Scaled Dot-Product Attention(并行 h 次)

中间那个大紫色框:注意力本体。
右图表示:

同时跑 h 个 attention(h 个头)

每个头都会输出一个结果。

(3)Concat(拼接)

多个头的输出拼接在一起(Concat)。

(4)Linear(融合)

拼接后再过一个 Linear:

把多个头的信息融合成最终输出表示

形象类比:

各位专家写了各自的摘要 → 最后整理成一份总报告


✅ 右图一句话总结

Multi-Head Attention 就是:

并行做多次 attention(多种视角)→ 拼起来 → 再融合成最终输出。