把 Transformer 的自注意力想象成一场“全员一对一交流”的年度大会:序列里每个时间步都是一位参会者,为了说出一句话,每个人都必须和其余所有参会者单独交换一次意见。于是 1000 人参会,需要大约 100 万次交流——这就是 O(n²) 复杂度的由来。序列一长,会场直接挤爆。 Informer 像一位聪明的会务总监:他发现真正能提出高质量问题、值得全场认真回应的“意见领袖”其实只有少数几人。于是他只安排这些关键人物提问,其他人安静旁听(这就是 ProbSparse 稀疏注意力);会后几百页纪要也被逐层精简成几页核心摘要(蒸馏);最后主持人拿着“开场提纲 + 空白答题纸”一口气念完整份结论,而不是逐字憋稿(生成式解码)。一场原本兵荒马乱的 n² 大会,变成优雅高效的 n·logn 精英质询会。
掌握 Informer,你就能在长序列预测场景中把模型从“显存爆炸无法训练”变为“秒级推理”,这是工业界时序建模的高含金量技能。
目录
可视化演示
展示Informer长序列预测三大核心创新:ProbSparse稀疏注意力用KL散度筛选活跃Query、复杂度从O(n²)降至O(n log n)、蒸馏减层与生成式解码避免误差累积。
本节配有交互动效(进入视口后自动加载,约 3KB)。
'+captions.sparse+'
注意力瓶颈:全员会议的平方级折腾
想象公司年会有一个“全员一对一交流”环节,每位员工都要与其余所有人单独聊一遍才算完成任务。100 人要聊 9900 次,1000 人就要聊近 100 万次。标准 Transformer 的自注意力就是这种开会方式:序列中每个位置(token)都是参会者,它需要和其他每一个位置交换信息,才能决定自己应该“关注”谁。
放到技术上,自注意力先把序列投影成三个角色:查询 Q(想了解信息的人)、键 K(每个人挂的胸牌)、值 V(每个人实际讲的干货)。注意力分数由 Q 与 K 逐一配对得到,配对结果是一张 L×L 的二维表。只要序列长度 L 翻一倍,这张表和对应的计算量就翻四倍——这正是 O(n²) 的典型特征。
长序列预测正是这场会议的“极限压力测试”:预测未来 336 个小时的电力数据,历史窗口动不动就上千个时间步,L×L 矩阵会让显存和算力一起爆炸。于是 Informer 决定:不再让所有人开全员会。
- 查询键点积让每个查询与所有键两两配对,得到 L×L 的相似度矩阵
- 维度缩放除以 √d,防止内积过大把 softmax 推向极端
- 概率归一化对每一行做 softmax,把分数变成和为 1 的注意力权重
- 值加权求和按权重把值矩阵列向量聚合,得到当前 token 的新表示
ProbSparse机制:只让“意见领袖”发言
真正的会议效率提升,从来不是让所有人闭嘴,而是让真正有价值的人开口。Informer 的 ProbSparse 注意力做了一件看起来大胆的事:从 L 个查询里挑出稀疏度最高的前 u 个“意见领袖”,组成一个瘦身后的查询矩阵 Q̄,只用它去和键 K 计算注意力。
为什么敢这么做?因为在真实的长序列数据里,注意力分布往往呈现“长尾”特征:少数查询对输出起决定性作用,绝大多数查询的注意力模式和均匀分布差不多,多算它们只是浪费算力。只要 u 的取值与 log L 同阶(例如 u = c·logL),点积量就从 L×L 降到 u×L,整体复杂度变为 O(L·logL)。
这场“精英质询会”开完,大家发现会议结论和全员大会几乎一样——因为真正推动结论的永远是那几位关键发言人。
- 稀疏选择用稀疏度分数挑出前 u 个重要查询,拼成瘦身矩阵
- 局部点积只让意见领袖与所有键计算相似度,分数矩阵从 L×L 缩成 u×L
- 缩放归一对选中的 u 行做缩放和 softmax,得到有效注意力权重
- 值加权聚合用这些权重加权 V;没被选中的行可以用全局均值近似,不必逐个算
稀疏度度量:给发言质量打分
怎么判断谁是“意见领袖”? Informer 用了一个非常直觉的标准:如果某个人问的问题,答案和全场默认答案一模一样,那他的问题没有信息量;相反,如果他的提问能引出最大的“意外响应”,就该被重点对待。这个“意外程度”在数学上就是注意力分布与均匀分布的 KL 散度。
完整 KL 散度要先算所有 softmax 概率,成本太高。Informer 用一个漂亮的近似来打分:对查询 qᵢ,它遍历所有键,记录下最强烈的“共鸣”分数(最大值),再算出对所有键的平均反应;两者相减。峰值很高、平均水平又低,说明这个查询只对少数键有强关注,信息很集中;如果峰值和均值差不多,说明它对谁都很平均,没有独到之处。
把所有人的分数排出来,会得到一条右边拖得很长的分布:绝大多数查询分数低,少数查询分数高。Informer 只需要排个序,截取 Top-u,自然就拿到了那批最值得发言的人。
- 逐键点积把 qᵢ 与每个键 kⱼ 算相似度,并做维度缩放
- 最大响应在所有键中找出相似度最高的峰值
- 平均响应计算该查询与全部键相似度的平均基线
- 差分打分峰值减去均值,得到该查询的稀疏度分数
自蒸馏降维:会议纪要逐层减半
精英质询会虽然省了交互次数,但每个参会者依然要记住全场所有人的发言细节,内存压力还是不小。于是 Informer 又加了一道“会议纪要”流程:每开完一轮会,秘书就把纪要压缩一半,只保留最重要的要点,下一轮会议在精简版基础上继续开。
这个操作叫自注意力蒸馏。每经过一个注意力块,Informer 先用一维卷积把相邻时间步的信息融合一下,再用 ELU 激活引入非线性,最后用最大池化把序列长度减半。长度减半意味着下一层注意力矩阵又小一倍,显存占用呈几何级数下降。
这份“越来越薄的纪要”并不会丢失关键信息,反而帮模型自动筛选出最值得保留的多尺度特征,让长序列预测更稳。
- 卷积整合用一维卷积让相邻时间步的信息互相渗透,形成局部摘要
- 非线性激活ELU 让特征表达能力更强,同时保留部分负值信息
- 池化减半最大池化按窗口取最显著特征,序列长度直接除以 2
- 循环堆叠得到下一层输入 X_{j+1},重复“蒸馏”直到特征层足够精炼
生成式解码:开场白直接念完整份结论
传统 Transformer 做预测像新闻发言人逐字憋稿:先说出第一个词,再根据第一个词想第二个词,一个词一个词往外蹦,每蹦一个词都要重新“开一轮会”。预测 336 步,就得开 336 次会,慢得让人绝望。
Informer 的改变是:主持人拿到“开场白 + 整页空白答题纸”。开场白是从真实历史序列里截取的一段上下文 token,空白答题纸就是待预测位置的占位向量(全 0)。把它俩拼在一起放进解码器,一次前向就能把整段预测结果写满。
正是因为“一次开场,全文输出”,Informer 避免了自回归解码的串行瓶颈,长 horizon 预测的推理速度大幅提升。
- 起始 token从历史序列末尾截取 L_token 长度作为引导信号
- 占位向量用全零向量填充未来 L_y 个位置,表示待预测区间
- 拼接输入把历史与占位沿长度方向拼成解码器输入
- 一次前向解码器并行输出整段长度为 L_y 的结果矩阵
复杂度实战:从平方级到线性对数的落地
把这三板斧合在一起算总账:ProbSparse 注意力把交互次数从 L² 压到 L·logL,蒸馏让每层特征长度逐层减半,生成式解码又免去逐步预测的重复开销。最终 Informer 的整体时间复杂度和内存复杂度都落在 O(L·logL)。
| 方法 | 时间复杂度 | 内存复杂度 | 典型极限长度 |
| --- | --- | --- | --- |
| 标准 Transformer | O(L²) | O(L²) | 千级显存告急 |
| Informer | O(L·logL) | O(L·logL) | 万级照样训练 |
这套设计让 Informer 在 ETTh1 电力变压器数据、交通流量等大规模长序列任务上真正跑得起来,也让它成为长 horizon 预测场景中绕不开的经典基线。
- 稀疏注意开销ProbSparse 让注意力计算量变为 LlogL 量级
- 解码并行开销生成式解码一次输出长度 L_y 的序列
- 整体量级两端相加,复杂度由最高阶主导,仍为 O(L·logL)
AI 应用场景
电力负荷长 horizon 预测
阶段:模型训练与长序列推理
解决的问题:传统 Transformer 处理上千步的电力序列时,QKᵀ 矩阵会让显存迅速耗尽;LSTM 虽然省显存,但长距离依赖建模能力弱。Informer 用 ProbSparse 注意力把复杂度压到 O(L·logL),让“过去 96 小时预测未来 336 小时”这类任务能在单卡上高效完成。
具体案例:在 ETTh1 电力变压器油温数据集上,以 96 个历史观测预测未来 336 个时间步;相比标准 Transformer,Informer 训练时间大幅缩短,同时 RMSE/MAE 指标持平甚至更优,工业上可直接用于电力调度。
城市交通流量大规模并发预测
阶段:在线推理与批量预测服务
解决的问题:上千个路口传感器需要定期预测未来车流,推理服务并发量高时,标准注意力的 O(L²) 内存开销容易让请求超时。Informer 的稀疏注意力与蒸馏让单次预测更轻量,生成式解码进一步降低响应延迟。
具体案例:交通管理中心对 768 个路口每 5 分钟采集一次流量数据,用 12 个历史观测点预测未来 24 个时间步的车流,Informer 在 GPU 上批量推理的吞吐量显著高于标准 Transformer,支撑高峰时段的信号灯调度。
Python 演示
import numpy as np def query_sparsity_scores(Q, K): """近似 KL 散度:max 与 mean 之差,分数越高越值得被采样""" scale = np.sqrt(Q.shape[-1]) dot = np.matmul(Q, K.T) / scale return dot.max(axis=1) - dot.mean(axis=1) def probsparse_attention(Q, K, V, top_u): """ProbSparse 注意力:只对 Top-u 个重要查询做完整 softmax""" L = Q.shape[0] scores = query_sparsity_scores(Q, K) top_idx = np.argsort(scores)[-top_u:] dot = np.matmul(Q[top_idx], K.T) / np.sqrt(Q.shape[-1]) attn = np.full((L, L), 1.0 / L) # 其余行用均匀分布近似 attn[top_idx] = np.exp(dot - dot.max(axis=1, keepdims=True)) attn[top_idx] /= attn[top_idx].sum(axis=1, keepdims=True) return np.matmul(attn, V) if __name__ == "__main__": np.random.seed(42) L, d, u = 512, 64, 30 Q = np.random.randn(L, d) K = np.random.randn(L, d) V = np.random.randn(L, d) out = probsparse_attention(Q, K, V, u) dense_cost = L * L sparse_cost = u * L print(f"标准注意力点积次数: {dense_cost}") print(f"ProbSparse 点积次数: {sparse_cost}") print(f"加速倍数: {dense_cost / sparse_cost:.1f}x")
dot = np.matmul(Q, K.T) / scale先算出所有查询与键的相似度矩阵,用于给每个人打分(教学演示中全量算;工业实现会采样键来避免 O(L²))scores = dot.max(axis=1) - dot.mean(axis=1)用“最大响应减平均响应”近似 KL 散度,反映查询的信息独特性top_idx = np.argsort(scores)[-top_u:]挑出分数最高的 Top-u 个查询,相当于选出意见领袖dot = np.matmul(Q[top_idx], K.T) / np.sqrt(Q.shape[-1])只让意见领袖与所有键计算点积,复杂度从 L×L 降到 u×Lattn = np.full((L, L), 1.0 / L)没被选中的查询行统一用均匀分布近似,省掉大量计算attn[top_idx] /= attn[top_idx].sum(axis=1, keepdims=True)对选中的行单独做 softmax 归一化,保证权重和为 1
常见误区
误区ProbSparse 注意力就是随机扔掉一部分查询,蒙着算,所以省快。
正解它用可度量的稀疏度分数(KL 散度的近似)给每个查询排序,只丢弃那些注意力分布接近均匀、信息量极低的查询。选谁不选谁有明确依据,就像会议只请提出高质量问题的人,而不是随机从通讯录抽人。
为何常见:一听到“稀疏”“采样”就容易联想到 Dropout 式的随机丢弃,忽略了 ProbSparse 背后基于分布的筛选逻辑。
误区复杂度记号说了 O(nlogn) 更优,那不管序列多短都应该更快。
正解复杂度比较描述的是渐进趋势。序列很短时,排序、采样等额外开销可能让两者差距不明显;只有当 L 足够大,O(n²) 的增速才会被 O(nlogn) 远远甩开。这正是 Informer 专攻长序列场景、不大做短序列的原因。
为何常见:只背复杂度记号,忽略了背后的常数项与真实硬件开销,把“渐进更优”误当成“绝对更快”。
误区蒸馏让特征长度逐层减半,多堆几层蒸馏,模型更深,效果一定更好。
正解蒸馏的本质是降冗余、省显存,不是“越薄越聪明”。过度蒸馏会丢失细节信息,反而伤害预测精度。论文实验说明合适的蒸馏层数能兼顾效率与精度,一味加层只会让纪要薄到丢失关键行动项。
为何常见:把深度学习里“加层数提升效果”的直觉生搬硬套到蒸馏模块上。
误区解码器输入是一堆全零占位向量,所以预测完全靠脑补。
正解解码输入是“历史起始 token + 零占位”的拼接。真实历史片段提供了引导信号,零占位只表示未来待填区域,模型并不是从真空开始编造,而是顺着已知上下文顺势写出整段结论。
为何常见:只看到示意图里 X₀ 的全零标记,忽略了一旁的 X_token 真实上下文。
误区论文里全是电力变压器数据,Informer 大概只适合电力领域。
正解Informer 是通用的长序列预测框架,只要数据是等间隔时间序列,交通、气象、金融、能源都能套用。电力数据只是因为公开基准(ETT 系列)最普及而显得“主场作战”。
为何常见:把论文实验数据的集中性误解成模型能力的边界。
面试题
Q1. 标准 Transformer 自注意力产生 O(n²) 复杂度的核心原因是什么?
- A.每个查询要与所有键计算分数← 正确答案
- B.每个查询只与相邻键计算分数
- C.每个键只与相邻查询计算分数
- D.查询与值直接计算输出分数
答案:A。标准注意力中 QKᵀ 将每个查询与所有键配对,形成 L×L 的分数矩阵。类比全员会议:每个人都必须与所有人交换意见,于是工作量是 n² 次交流。B、C 都把交互限制在相邻位置,D 则混淆了值与键的角色。
Q2. ProbSparse 注意力把标准 O(n²) 复杂度降为什么量级?
- A.线性级复杂度 O(n)
- B.对数线性级 O(nlogn)← 正确答案
- C.对数级复杂度 O(logn)
- D.平方级复杂度 O(n²)
答案:B。ProbSparse 只让 Top-u 个查询参与完整注意力计算,u 取与 logL 同阶的常数倍,因此 L 个查询总开销为 O(L·logL)。这相当于把全员一对一会议改成少数精英质询,交互量从平方级降到对数线性级。
Q3. 自注意力蒸馏中,哪个操作直接负责把序列长度减半?
- A.随机丢弃一半时间步
- B.复制序列再拼接成两倍
- C.卷积加最大池化降采样← 正确答案
- D.用最小池化替代全部输出
答案:C。蒸馏块先用一维卷积融合相邻信息,再用 ELU 激活,最后用最大池化对长度下采样,从而使序列长度减半。随机丢弃会丢失结构信息,复制拼接会加倍长度,最小池化也不是 Informer 采用的采样方式。
Q4. ProbSparse 的稀疏度分数近似计算(max−mean)主要衡量什么?
- A.查询与值的欧式距离
- B.注意力分布与均匀分布的差异← 正确答案
- C.查询向量自身的模长
- D.键矩阵的奇异值大小
答案:B。完整指标是注意力分布与均匀分布的 KL 散度。近似做法取“最大点积”代表最强响应,“平均点积”代表均匀基线,两者相减表示该查询有多少信息量。距离、模长、奇异值都不直接刻画这种分布偏离程度。
Q5. 未被选入 Top-u 的查询在 ProbSparse 注意力中如何处理?
- A.整行丢弃不参与任何输出
- B.用均匀分布近似其注意力← 正确答案
- C.复制邻近查询的输出结果
- D.用零向量代替该行全部输出
答案:B。非 Top-u 查询的注意力分布接近均匀,因此直接用均匀分布近似,避免逐行计算 softmax。整行丢弃会丢失信息,复制邻居或置零都会引入偏差;均匀近似是论文采用的轻量替代。
Q6. 生成式解码相比逐步自回归解码的主要优势是什么?
- A.不需要任何历史信息即可预测
- B.一次前向得到整段预测结果← 正确答案
- C.参数量直接减少一半
- D.完全不需要注意力机制
答案:B。生成式解码把“历史起始 token + 零占位”拼成完整输入,解码器一次前向输出全部 L_y 个预测点,避免了逐步解码的串行计算。它依然需要历史信息和注意力机制,参数量也不会凭空减半。
Q7. 关于生成式解码器输入的组成,下列说法正确的有?
- A.历史序列截取一段作为起始 token← 正确答案
- B.待预测位置填入全零占位向量← 正确答案
- C.拼接后进入解码器一次前向← 正确答案
- D.每次只输入一个真实标签逐步预测
答案:ABC。解码输入 = X_token(历史上下文)拼接 X_0(全零占位),一次性送入解码器。D 描述的是传统自回归解码,不是 Informer 的生成式解码方式。
Q8. 极端情况下当 u=L(选中全部查询),ProbSparse 的时间复杂度会变成什么?
- A.仍保持线性对数级复杂度
- B.退化为平方级复杂度← 正确答案
- C.变成常数级复杂度
- D.变成线性级复杂度
答案:B。ProbSparse 的复杂度核心是 u×L,u 是实际选中的查询数。当 u=L 时点积次数为 L×L,即 O(L²),退化为标准注意力。这说明 ProbSparse 的效率来自“真正只选少数关键查询”,而不是数学上无条件免费。
Q9. 关于 Informer 自注意力蒸馏,下列说法正确的是哪项?
- A.蒸馏会使编码器总层数翻倍
- B.蒸馏只能去除键值的多余信息
- C.蒸馏会让注意力变成两层级联
- D.蒸馏能降低显存占用并加速训练← 正确答案
答案:D。蒸馏块每层把序列长度减半,下一层注意力矩阵更小,显存和计算量逐层下降。它不减层数而是减特征长度,所以 A 错误;B、C 的表述也不符合蒸馏的真实机制。
Q10. Informer 在长序列预测中做了哪些关键改进?
- A.稀疏注意力降低整体复杂度← 正确答案
- B.蒸馏操作减少特征长度← 正确答案
- C.生成式解码一次输出全序列← 正确答案
- D.用循环网络替代全部注意力
答案:ABC。Informer 三大贡献正是 ProbSparse 稀疏注意力、自注意力蒸馏和生成式解码,分别解决复杂度、显存和推理速度问题。D 完全错误,Informer 仍然基于注意力机制,而不是循环网络。