06-Transformer :时间序列建模范式转折点
1、研究背景和动机
1)Transformer 提出前的主流:Seq2Seq + RNN + Attention
- Encoder:RNN/LSTM/GRU 读输入序列
- Decoder:RNN/LSTM 生成输出序列
- 中间加 Attention:让 Decoder 每一步“回头看 Encoder”
2)当时的核心矛盾:Attention 很强,但 RNN 成了瓶颈
Attention Is All You Need(注意力就是你所需要的一切)
既然 Attention 已经能很好地“找信息/对齐”,那为什么我们还要用 RNN 这种慢且难训的结构?
Attention 是发动机,RNN 成了拖后腿的车架。
3)Transformer 提出的三大动机(通俗版)
动机1:RNN 天生不能并行,训练太慢
RNN/LSTM 的结构问题
- 必须先算完 ht−1
- 才能算 ht
GPU 在等前一步算完,没法把所有时间步一次算出来。
形象理解
- 第 1 个工人做完,第 2 个才能做
- 必须排队
让序列计算可以像 CNN 一样并行化。
动机2:长序列依赖很难学(即使用 LSTM 也不够理想)
- 信息需要经过很多时间步传递
- 关键线索要“跨越很远”才能影响后面的预测
- 结果就是:学习效率低、表达受限
形象理解
A → B → C → ... → Z 传到后面经常变味、丢信息。
让任意两个位置可以直接建立联系,别再一层层传。
动机3:Attention 虽能看全局,但“Attention + RNN”仍不够干净
每一步输出,都可以对输入所有位置打分、取重点。
- Encoder 是 RNN 串行编码
- Decoder 是 RNN 串行生成
- Attention 只是在 Decoder 每一步帮忙“翻书”
既然注意力能解决“找重点”和“对齐”,那干脆把 Encoder/Decoder 也全部改成 Attention 结构。
4)Transformer 的关键思想:把“序列理解”变成“全局信息交互”
用 Self-Attention 让序列内部所有位置彼此交互,从而建模序列依赖。
Self-Attention 是什么(直觉)
- Attention:Decoder 看 Encoder(跨序列对齐)
- Self-Attention:序列内部自己看自己(同一序列里任意位置互相看)
不是“从左读到右”理解句子 而是让每个词都能同时看整句话,并决定该听谁的。
2、模型的网络结构
0)这张图整体在表达什么?
- 左边:Encoder(编码器)——负责“读懂输入序列”
- 右边:Decoder(解码器)——负责“根据输入的理解,生成输出序列”
- Encoder:阅读理解(把材料读懂)
- Decoder:写作文(根据材料写答案)
1)最底部:Input Embedding + Positional Encoding
1.1 Input Embedding / Output Embedding(粉色块)
- 输入是一个序列(在 NLP 是 token;在时间序列就是数值/特征向量)
- 模型需要把每个位置的输入变成同一维度的向量(比如 512 维),便于后面统一计算
- 这一步就是 Embedding(嵌入/投影)
时间序列场景里:通常不是“查表 embedding”,而是一个线性层把特征投影到 dmodeld_{model}dmodel。
1.2 Positional Encoding(位置编码,旁边的 “+”)
- Embedding:每个词/每个时间点“是什么内容”
- Positional Encoding:这个内容“在第几位/什么时候发生”
2)左边:Encoder 堆叠 N 次(标 N×)
- Multi-Head Attention(注意力)
- Feed Forward(前馈网络)
2.1 Encoder 的 Multi-Head Attention(图中黄色块)
序列中每个位置,都去“参考”同一个序列里其它所有位置,然后更新自己的表示。
- 你在读一句话时,理解某个词,会参考其他词
- 你在看时间序列某个时刻,也会参考其它时刻(比如周期点、趋势点、突变点)
- 不是只用一种“相关性”看全局
- 而是并行用多种视角去看(像多名专家分别关注不同模式)
- 一个头可能专门抓“短期邻近关系”
- 另一个头抓“周期性”
- 另一个头抓“突变/异常关联”
最后把多个头的结果合并,让表示更丰富。
2.2 Add & Norm(图中浅黄色条)
- Add(残差连接):把“原输入”加回去 目的:信息不容易丢、梯度更好传、训练更稳定
- Norm(LayerNorm):把数值尺度拉回稳定范围 目的:训练更快、更稳
- Add:保底机制,“不要把原来的意思丢了”
- Norm:校准机制,“别让数值越算越飞”
2.3 Feed Forward(图中蓝色块)
位置之间的信息交互(Attention)做完以后,再对每个位置的表示做一次“非线性加工与提炼”。
- Attention:负责“抄资料/查关联”
- Feed Forward:负责“消化吸收/总结提炼”
3)右边:Decoder 堆叠 N 次(也是 N×)
- Masked Multi-Head Attention(带遮罩的自注意力)
- Multi-Head Attention(对 Encoder 输出的注意力,叫 Cross-Attention)
- Feed Forward
3.1 Outputs (shifted right)(右下角那句)
- 训练时:把真实输出序列右移后喂给 decoder
- 让 decoder 学会“用前面的输出预测下一个”
- 你写作文时:写第2个字只能看第1个字,不能偷看未来的字
3.2 Masked Multi-Head Attention(最底部黄色块)
在生成第 t 个位置时,只能看 1..t-1 的内容,不能看 t+1..末尾。
- 写答案时不能提前看到后面自己将写的句子
时间序列预测里,如果你是在预测未来,mask 的意义尤其重要:不能用未来真实值影响当前预测。
3.3 Decoder 中间那块 Multi-Head Attention(Cross-Attention)
- 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 在干嘛
在一堆信息里挑重点,然后把重点内容汇总成一个更好的表示。
- 有的时间点更重要
- 有的词更关键
二、左图:Scaled Dot-Product Attention(缩放点积注意力)
1)Q / K / V 是什么(必须先懂)
✅ Q(Query,问题)
我现在想找什么信息?
✅ K(Key,索引/标签)
每条信息的“标题/关键词”是什么?
✅ V(Value,内容)
每条信息真正的内容是什么?
- Q:你在搜“明天销量为什么变化”
- K:每条历史记录的标题(时间点特征)
- V:每条历史记录的具体内容(该时刻的信息)
2)按图中方块顺序解释(从下到上)
(1)MatMul(Q × K)
把 Q 和所有 K 计算“相似度/相关性分数”
我现在的问题,和每条历史信息有多相关?
(2)Scale(缩放)
防止分数太大,softmax 变得极端,训练不稳定。
- 不缩放:某个人票数爆表,其他人都变 0 票(太极端)
- 缩放:票数合理,模型更好学
(3)Mask(可选)
把某些位置“禁止关注”(强行设成看不到)
不能偷看未来!
- 可以看 t,t−1,...t, t-1, ...t,t−1,...
- 不能看 t+2t+2t+2 或真实未来
把未来信息用黑布盖住。
(4)Softmax
把相关性分数变成“权重”(0~1),并且所有权重加起来=1
投票结束后,把票数换算成每个人的权重占比。
- 历史点1:0.6
- 历史点2:0.3
- 历史点3:0.1
(5)MatMul(权重 × V)
用权重对 V 做加权求和
把重要的信息多拿一点,不重要的少拿一点,最后混合成一个“汇总结果”。
✅ 左图一句话总结
Q 去和所有 K 算相关性 → softmax 得到权重 → 对 V 加权平均得到输出。
三、右图:Multi-Head Attention(多头注意力)
不要只用一种角度看问题,要用多种角度同时看。
1)为什么要“多头”?
全班只有一个老师判断重点
- 短期关系(最近几步)
- 周期关系(上周同一时刻)
- 趋势关系(长期上升/下降)
- 异常点关系(突变)
第1个头:专门关注短期 第2个头:专门关注周期 第3个头:专门关注突变 …
2)按右图结构解释(从下到上)
(1)Linear(对 Q/K/V 各做一次线性变换)
每个头会生成自己版本的 Q/K/V(不同视角)
(2)Scaled Dot-Product Attention(并行 h 次)
同时跑 h 个 attention(h 个头)
(3)Concat(拼接)
(4)Linear(融合)
把多个头的信息融合成最终输出表示
各位专家写了各自的摘要 → 最后整理成一份总报告
✅ 右图一句话总结
并行做多次 attention(多种视角)→ 拼起来 → 再融合成最终输出。