除夕前夜,城中最大的饭店要承办一场连续十天、每天八千人的“长桌宴”。总厨需要提前排出一份覆盖上百道菜的完整出餐计划。他手头有厚厚一摞往年档案——过去五年的菜单、客流、天气、节日记录。普通厨师会翻遍每一份档案、为每道菜比对全部历史,假如 1000 道菜对 1000 份档案,就要比对 100 万次。老师傅却有门道:他先快速判断哪些档案“与众不同”——去年冬至的爆单、上回台风的备货危机——只精读这几本关键档案,其余掠过;再把几十种调料熬成一碗高汤,越熬越少、精华越稠。这位“聪明厨师”的思路,正是今天要讲的 Informer——一个专为超长序列预测而生的深度学习模型。 Informer 针对注意力机制“每个查询都要和所有键配对”的平方级开销,提出 ProbSparse 自注意力:先给每个查询算一个“稀疏度评分”,只保留信息量最大的 Top-K 少数查询;再用“蒸馏”把序列逐层浓缩减半;配合能读懂周几、月份、节假日的时序编码。最终,它让电力、交通这类按小时甚至按分钟滚动记录的超长数据预测,以接近线性的复杂度逼近全注意力的精度。
掌握 Informer,等于拿到长序列预测的“工业级钥匙”——在算力可控的前提下做出接近全注意力精度的长期预测,这是时序算法工程师的核心竞争力之一。
可视化演示
展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。
本节配有交互动效(进入视口后自动加载,约 3KB)。
系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T
一、长序列预测困境
总厨要在除夕前排出十天完整菜单。最笨的办法是任何新人都会的:每设计一道菜,就把五年档案从头翻到尾。一千道菜对一千份档案,就是一百万次配对。菜单还没排完,人先累垮了——这个“每道新菜都去比对全部老档案”的动作,在深度学习中有一个响当当的名字:注意力机制。
在 Transformer 模型里,序列中的每个时间步都会产生一个“查询”(query,相当于“想找什么资料的问题”),历史序列的其他时间步则是“键”(key,相当于“档案的标签”)和“值”(value,相当于“档案正文”)。计算注意力,就是让每个查询去和所有键比对相似度,再按相似度把值加权汇总。序列长度记为 L,每个查询要配对所有 L 个键,总共就是 L×L = L² 次计算。序列翻一倍,计算量变四倍,这就是“平方复杂度”的含义。
长序列预测的头号敌人正是它:序列稍长,训练时间与显存双双失控。标准自注意力的公式如下:
试想,总厨若真的把 1000×1000 次比对全部做完,光查档案就要好几天;换成机器,序列长度从 1000 涨到 2000,花费会变成四倍。长序列预测最难的不是数据不够,而是算不过来。幸好,老师傅另有心法——只看关键档案。
- 相似度矩阵 QKᵀ让每个查询与每个键做点积,得到 L×L 的得分矩阵——相当于把所有新菜与所有老档案逐一比对,一张都不能少。
- 缩放因子 √d_k特征维度越大,点积数值越大,Softmax 越容易“一边倒”导致梯度消失;除以 √d_k 把分数压回温和区间。
- Softmax 归一化对每一行做指数归一化,让得分变成总和为 1 的权重,突出最相关的键、压低无关键。
- 加权求和得输出用权重对 V 做加权平均,每个查询得到融合了全部历史信息的输出向量。
二、概率稀疏注意力
老师傅有个习惯:新菜单动笔前,只在档案堆里抽几本——去年冬至的爆单记录、上回台风断供的账本、今年春节的备货单。徒弟问为什么。“大部分日子都差不多,真正改变菜单的就那么几份。读透它们,其他按经验走。”这就是稀疏性的直觉:绝大多数配对是冗余的。
研究发现,长序列的注意力矩阵天然是“稀疏”的:只有少数“活跃查询”的注意力分布尖锐地集中在一两个键上,主导了输出;大部分查询的注意力近似均匀,跟谁都差不多,算不算它们对结果影响很小。于是 Informer 提出 ProbSparse 自注意力——先对每个查询做稀疏度评估,挑出信息量最大的 Top-K 个,只对它们计算注意力。
稀疏注意力把查询矩阵从 L 个压到 K 个,但键仍然完整保留。公式如下:
于是总厨把“翻一千遍档案”改成“精读五六本、粗看一遍摘要”,时间省下几个数量级。但新问题来了:怎么在翻档案之前就知道哪几本值得精读?这就要靠稀疏度度量这双火眼金睛。
- 稀疏查询矩阵 Q̄只把稀疏度评分最高的 Top-K 个查询向量装进来,其余查询直接跳过,不参与点积——这是省下绝大部分计算的关键。
- 完整键矩阵 Kᵀ键一个都不能少,因为任何查询都可能与某个历史键高度相关,丢掉键等于丢掉历史。
- 缩放因子 √d_k与标准注意力相同,防止点积数值过大破坏 Softmax 的梯度。
- Softmax 与加权输出对选中查询的得分归一化后与 V 加权求和;未选中的查询不产生任何计算成本。
三、稀疏度度量
徒弟问:“师傅,您怎么一眼看出哪几本档案关键?”老师傅说:“看它跟普通档案差多少。冬至那本客流是平时三倍,台风那本备货余量几乎归零。凡是跟平均水平差得离谱的,就是关键。”
这正是稀疏度度量的思想:一个查询的注意力分布如果越偏离“均匀分布”,说明它越“挑食”——只对极少数键倾注超高关注,这样的查询承载了大量信息。Informer 用“查询分布与均匀分布的 KL 散度”来量化这种偏离,略去常数项后得到一个简洁的公式:
品菜师不必喝完整锅汤,尝三五勺就敢写评语——采样近似让“挑关键档案”这件事本身也极其便宜。选出了 Top-K 查询,我们还要对付另一个开销:序列太长,内存和计算仍然吃紧。下一节,老师傅的“熬高汤”绝活登场。
- LogSumExp 第一项对当前查询与所有键的得分求指数和再取对数,近似等于“最匹配的键有多大优势”;若某个键异常匹配,这一项会明显偏大。
- 算术平均第二项所有键得分的平均值,代表这份查询的“普通水平”;两项相减,正好是“突出程度减平均程度”。
- 差值即稀疏度M 越大,说明该查询的注意力越集中在少数键上,是“活跃查询”;M 越小,说明注意力越均匀、越冗余。
- 采样近似每轮都为 L 个查询算全量键太贵,Informer 随机采样 $U=L_K\ln L_K$ 个键来估算第一项,把评估成本从 O(L²) 降到 O(L ln L)。
四、蒸馏编码器
长桌宴备料时,老师傅会熬一锅高汤:骨头、鸡架、干贝丢进去,大火烧开、小火慢煨,滤掉浮沫;汤收到一半,兑水再熬,再收……每一轮汤的体积减半,鲜味却更浓。最后那一小碗汤,是一整锅食材的精华。
Informer 的编码器有一模一样的操作,叫做蒸馏(distillation)。在 ProbSparse 注意力之后,每一层编码器都对序列做一次“浓缩”:先用一维卷积把相邻时间步的信息融合起来,再做非线性激活,最后用步长为 2 的最大池化让序列长度直接减半。层数越深,序列越短,计算和内存开销同步下降。
蒸馏层公式如下:
当原始序列从 1000 步被浓缩到几十步,后面的注意力只在这“一小碗高汤”上工作,成本一降再降。可这时候老师傅又发现一个细节:同样的客流数字,出现在周三下午和年三十晚上,意义完全不同。模型该怎么读懂日历?这就是时序特征编码的舞台。
- 一维卷积 Conv1d用滑动窗口扫过时间维度,把相邻时间步的信息“拌”成局部特征,相当于高汤里的食材先切碎。
- ELU 激活对卷积结果做非线性变换,负值平滑饱和、正值基本保留,增强特征表达能力。
- 最大池化 MaxPool以步长 2 对时间维取最大值,序列长度减半;每个窗口里最强的信号留下,弱信号丢弃。
- 层级堆叠编码器第 j 层的输出送入第 j+1 层继续浓缩,序列越来越短、特征越来越浓缩。
五、时序特征编码
老师傅排菜单从不只看数字,还要看日子:冬至前后饺子多备三倍,周五晚上客流是周二的两倍,大年初一大家不来饭店要改外卖。同样一串营业额数字,配上“星期几、几月几号、是否节日”,意思完全不一样。
时间序列数据自带丰富的日历属性:分钟、小时、星期几、几月几号,乃至节假日。Informer 把这些信息编码成向量喂给模型,让注意力知道“我看到的这个时刻,是年三十还是普通周三”。其中最主要的编码是位置编码——它告诉模型“这是第几个时间步”,让模型能区分先后顺序。
位置编码用不同频率的正余弦函数生成:
有了这把“时间尺”和这张“黄历”,模型终于知道历史中哪些“同一天”“同类日子”值得借鉴。日历读懂了,关键档案挑出来了,高汤也熬好了——整套流程足以应对超长序列。最后我们来看,这套组合拳到底省了多少、准不准。
- 位置序号 pospos 是时间步在第几个位置,从 0 开始数;位置不同,编码向量就不同。
- 维度下标 i特征维度被分成一对对(2i 与 2i+1),分别用正弦和余弦编码;维度越高频率越低。
- 频率分母 10000^{2i/d}让不同维度拥有不同刻度——低维快变、高维慢变,像尺子上从毫米到米的刻度。
- 正余弦交替偶数维正弦、奇数维余弦,保证任意两个位置都有可区分的相位组合。
六、效率与精度
十天的长桌宴终于开席。客人络绎不绝,总厨一手翻着浓缩好的高汤菜单、一手兼顾后厨,从容不迫。徒弟记录:这次排菜单只用了两小时,客人满意度几乎满分。消息传开,同行纷纷表示:“这不比那家熬三天三夜的传统馆子差,还快得多。”
消息传回技术圈就是三组数字:标准 Transformer 的复杂度是 O(L²),序列一长就爆炸;Informer 把 ProbSparse 注意力、蒸馏、采样评估组合起来,整体复杂度降到 O(L ln L),接近线性;而实验精度在电力变压器温度、交通流量等长程预测任务上与全注意力几乎持平,某些指标甚至更优。
复杂度对比公式如下:
从此,长桌宴不再是少数老店的传说——Informer 让任何一台普通算力服务器都能在电力负荷、交通流量这类动辄上万步的时序数据上,做出接近全注意力精度的长期预测。总厨的经验,如今变成了公开的菜谱。
---
- 原来平方复杂度 O(L²):标准注意力中每个查询必须与全部键配对,计算量是 L×L,序列翻倍成本变四倍。
- 现在线性对数复杂度 O(L ln L):ProbSparse 只保留 c·ln L 个活跃查询,稀疏度评估用 U = L ln L 个采样键近似,整体计算量随 L 近乎线性增长。
- 蒸馏再减半编码器每一层蒸馏让序列长度减半,堆叠 d 层后主要计算集中在一个长度为 L/2^d 的精华序列上,内存占用同步下降。
- 精度何以不降注意力本就高度稀疏,丢弃冗余配对等于去噪;蒸馏保留下最显著的时间特征,二者让“省算”与“保准”兼得。
AI 应用场景
场景一:电力负荷预测——电网调度中心的“长桌宴”
阶段:数据预处理与模型训练
解决的问题:电网要提前 3-7 天预测逐小时负荷曲线,传统 ARIMA 只能做短步长,误差随预测长度快速累积;标准 Transformer 在 1000 步以上的序列上平方复杂度吃不消。Informer 用 ProbSparse 自注意力加蒸馏,把两年多的逐小时负荷(附带温度、节假日标记)编码成特征,一次前向输出一整周 168 小时负荷曲线,像总厨一口气排出十天菜谱。
具体案例:某省级电力调度中心将历史负荷与天气、星期、节假日拼成特征表,训练 Informer 后,96 步长预测误差与全注意力模型接近,训练显存却只用了原来的小零头,模型每天凌晨自动重训并下发调度建议。
场景二:交通流量预测——智慧城市的“客流日历”
阶段:特征工程与模型评估
解决的问题:交通部门需要预测未来 48 小时各主干道车流量以调整信号灯与诱导屏。传统统计模型难以捕捉“工作日早晚高峰 + 周末出游 + 节假日返程”的复合节奏;Informer 的时序编码正好把日历属性写进模型,稀疏注意力又能从一年前的同类型日子中翻出关键档案。
具体案例:某市交通大数据平台用量化路口线圈数据训练 Informer,输出未来 48 小时逐 15 分钟流量预测,调度中心据此提前放行主路、切换潮汐车道,高峰拥堵指数下降约 12%。
场景三:零售库存补货——供应链的“备货单”
阶段:模型推理与业务集成
解决的问题:连锁零售商要为上千个 SKU 预测未来 90 天销量来安排补货和库容,长程预测误差会被层层放大——备多了压资金、备少了断货。Informer 能在线性开销内处理 90 天长序列,并利用促销、节假日时间戳修正需求波动,就像总厨提前三个月就知道年三十该备多少货。
具体案例:某连锁超市用三年日销量数据训练 Informer,预测未来一个季度每个 SKU 的日销量,补货计划从人工周更改为系统日更,缺货率下降 8%,库存周转天数缩短 11%。
Python 演示
import numpy as np def sparsity_measure(Q, K, d): S = Q @ K.T / np.sqrt(d) # 所有查询与键的点积分数 row_max = S.max(axis=1, keepdims=True) lse = np.log(np.sum(np.exp(S - row_max), axis=1)) + row_max[:, 0] mean = np.mean(S, axis=1) # 算术平均项 return lse - mean # 稀疏度评分 def prob_sparse_attention(Q, K, V, c=3, sample_ratio=0.5): L_q, d = Q.shape L_k = K.shape[0] M = sparsity_measure(Q, K, d) # 为每个查询打分 top_n = max(1, min(int(c * np.log(L_q)) + 1, L_q)) query_idx = np.argsort(M)[-top_n:] # 取 Top-K 活跃查询 key_n = max(1, min(int(sample_ratio * L_k), L_k)) key_idx = np.random.choice(L_k, key_n, replace=False) key_idx.sort() # 采样键用于近似评分 S = Q[query_idx] @ K[key_idx].T / np.sqrt(d) A = np.exp(S - S.max(axis=1, keepdims=True)) A = A / A.sum(axis=1, keepdims=True) # 稀疏 Softmax out = np.zeros_like(Q) out[query_idx] = A @ V[key_idx] # 仅回写选中查询 pairs = top_n * key_n return out, M, pairs if __name__ == "__main__": rng = np.random.default_rng(42) L, d = 64, 16 Q = rng.normal(size=(L, d)) K = rng.normal(size=(L, d)) V = rng.normal(size=(L, d)) out, M, pairs = prob_sparse_attention(Q, K, V) total = L * L print("输出形状:", out.shape) print("稀疏度评分示例:", np.round(M[:5], 3)) print("Top-3 查询索引:", np.argsort(M)[-3:].tolist()) print("计算配对 %d, 占全量 %.1f%%" % (pairs, 100.0 * pairs / total))
M = sparsity_measure(Q, K, d)给每个查询算“口味偏离分”,分数越高越值得精读,这就是稀疏度度量。query_idx = np.argsort(M)[-top_n:]按分数从高到低取 Top-K 查询,对应老师傅“只翻关键档案”。key_idx = np.random.choice(L_k, key_n, replace=False)随机采样部分键来近似评分,相当于“尝几口判断整锅汤”。out[query_idx] = A @ V[key_idx]只把注意力结果写回被选中的查询,其余查询保持零向量。print("计算配对 %d, 占全量 %.1f%%" % (pairs, 100.0 * pairs / total))打印真实配对开销,直观看到省掉了多少计算。
常见误区
误区我以为 ProbSparse 自注意力就是像 Dropout 一样随机丢一些查询,丢谁全靠运气,这样当然会丢信息。
正解ProbSparse 一点不随机敲查询:它用稀疏度评分给每个查询打分,只保留得分最高的 Top-K 个“活跃查询”。随机性只出现在“评估稀疏度时的键采样”上——那是为了省钱的数学近似,选出来的查询本身严格按信息量排序。打个比方:老师傅不是闭眼抽档案,而是先看标题再挑重点。
为何常见:论文里反复出现“采样”字样,且“稀疏=随机”是常见直觉;没仔细分清“对键采样”与“对查询挑选”是两件事。
误区少算了那么多配对,精度肯定掉得厉害,Informer 不过是拿精度换速度的妥协方案。
正解长序列的注意力分布天然高度稀疏,绝大多数查询的注意力近乎均匀分布,贡献接近于噪声。只算 Top-K 活跃查询相当于去噪,反而让模型聚焦关键时间步。在 ETT 电力、交通流量等基准上,Informer 的精度与全注意力几乎持平,部分长程指标更好。
为何常见:把“计算量减少”直接等同于“信息损失”,忽略了冗余计算本身价值很低。
误区蒸馏层让序列长度减半,不就是把序列隔一个采一个吗?那我也能写。
正解简单跳步会丢失相邻时间步的局部结构;Informer 的蒸馏是先做一维卷积把邻域信息“拌”成局部特征,再过 ELU 激活,最后用步长 2 的最大池化选择最强信号。“浓缩”保留精华,“抽稀”只是丢掉数据,二者有本质区别。
为何常见:只看到“长度减半”的结果,忽略了卷积先融合信息的过程。
误区Informer 能处理长序列,所以我把训练输入拼命拉长,比如把三年数据全塞进去,效果肯定最好。
正解过长的输入会引入大量与预测目标无关的历史片段,稀释关键信号,还可能放大噪声;Informer 的意义是让“长序列预测在算力上可行”,而不是“越长越好”。实际工程中要根据数据周期性和任务步长,选择合适的输入窗口与蒸馏层数。
为何常见:把“支持长序列”的能力误解为“所有场景下长输入都更优”。
面试题
Q1. Informer 模型最擅长的任务是下列哪一项?
- A.图像分类与目标检测
- B.长序列时间序列预测← 正确答案
- C.自然语言机器翻译
- D.语音识别与语音合成
答案:B。Informer 是专门为长序列时间序列预测设计的模型,核心卖点是把注意力复杂度从平方降到线性对数。图像分类是 CNN 的强项,机器翻译和语音识别虽用 Transformer,但不是 Informer 的主战场,就像总厨的独门菜谱是为长桌宴准备的,不适合拿去做甜点。
Q2. 标准自注意力机制的计算复杂度是多少?
- A.常数复杂度 O(1)
- B.平方复杂度 O(L²)← 正确答案
- C.线性复杂度 O(L)
- D.对数复杂度 O(lnL)
答案:B。标准自注意力中每个查询都要与全部键配对,L 个查询乘 L 个键就是 L² 次点积。序列翻倍计算量变四倍,这正是长序列预测的头号敌人。常数、线性、对数复杂度都比它低,但都不符合标准注意力的计算方式。
Q3. Informer 将注意力整体复杂度降到了什么量级?
- A.常数复杂度O(1)
- B.平方复杂度O(L²)
- C.线性对数O(LlnL)← 正确答案
- D.指数复杂度O(2^L)
答案:C。Informer 通过 ProbSparse 注意力把查询数压到 c·ln L 个,稀疏度评估用采样近似,整体复杂度收敛到 O(L ln L),处于线性与平方之间的“接近线性”水平。常数与指数复杂度分别低估和高估了它。
Q4. ProbSparse 自注意力靠什么挑选重要的查询?
- A.随机均匀采样查询
- B.按稀疏度评分取TopK← 正确答案
- C.按时间先后顺序取
- D.按查询数值大小取
答案:B。ProbSparse 用稀疏度评分度量“查询注意力分布偏离均匀的程度”,只保留评分最高的 Top-K 个查询,选择过程按信息量排序而非随机或按时间。就像总厨挑档案时专挑“长得最离谱”的先看,而不是闭眼抽一本。
Q5. 稀疏度评分 M(q,K) 由哪两个部分构成?
- A.LogSumExp加均值项← 正确答案
- B.均值项加方差项
- C.最大项加最小项值
- D.正弦项加余弦项值
答案:A。稀疏度评分 M = LogSumExp - 算术平均。第一项刻画“最匹配键的突出程度”,第二项刻画平均得分,差值越大说明注意力越集中在少数键上。均值与方差、最大值与最小值、正弦与余弦都不是这两个组成部分。
Q6. 蒸馏层中序列长度是如何被减半的?
- A.卷积加池化综合浓缩← 正确答案
- B.随机丢弃一半时间步
- C.全连接层直接降维
- D.对序列做线性插值
答案:A。蒸馏层先做一维卷积融合相邻时间步信息,再用 ELU 激活去杂,最后用步长 2 的最大池化让序列长度减半。它是“浓缩”而非简单抽稀,因此能层层保留主导特征。随机丢弃、全连接降维、线性插值都只做下采样或降维,不做邻域融合。
Q7. 关于时序编码中的多频率正余弦,正确的说法有?
- A.偶数维用正弦编码← 正确答案
- B.让不同维度刻度不同← 正确答案
- C.位置不同编码就不同← 正确答案
- D.直接决定预测数值大小
答案:ABC。多频率正余弦位置编码的目的是:偶数维用正弦、奇数维用余弦,不同维度拥有不同频率刻度,从而使任意两个位置的编码都可区分。加快收敛、减少参数量、防止梯度消失都不是位置编码的设计目标。
Q8. 关于稀疏度评估的键采样近似,正确说法是?
- A.只为降低稀疏度评估成本← 正确答案
- B.采样结果直接决定注意力输出
- C.采样键必须覆盖全部时间步
- D.采样键数量必须等于序列长度
答案:A。采样键只用于快速近似稀疏度评分,从而挑出 Top-K 查询;真正计算注意力输出时,选中的查询使用的仍是完整的键矩阵。所以采样不会直接决定输出,也无需覆盖全部时间步,更不等于序列长度。
Q9. 长序列预测面临的主要挑战包括哪些?
- A.注意力平方复杂度← 正确答案
- B.长期依赖难以捕捉← 正确答案
- C.计算内存占用较大← 正确答案
- D.训练数据必须单调
答案:ABC。长序列预测的三大挑战:注意力平方复杂度、长期依赖难以捕捉、内存占用巨大。“数据必须单调”不是挑战特征——时间序列通常是非平稳、有波动的,单调反而是特例。
Q10. 关于 ProbSparse 注意力,下列说法正确的有?
- A.只对TopK查询算输出← 正确答案
- B.所有查询都要算稀疏度← 正确答案
- C.键矩阵必须整体随机采样
- D.精度接近标准全注意力← 正确答案
答案:ABD。ProbSparse 对全部查询计算稀疏度评分,然后只对 Top-K 查询计算注意力输出;键矩阵在计算输出时完整保留,采样只发生在评分阶段。由于注意力本就高度稀疏,其精度可以接近标准全注意力。