把 Transformer 的自注意力想象成一场“全员一对一交流”的年度大会:序列里每个时间步都是一位参会者,为了说出一句话,每个人都必须和其余所有参会者单独交换一次意见。于是 1000 人参会,需要大约 100 万次交流——这就是 O(n²) 复杂度的由来。序列一长,会场直接挤爆。 Informer 像一位聪明的会务总监:他发现真正能提出高质量问题、值得全场认真回应的“意见领袖”其实只有少数几人。于是他只安排这些关键人物提问,其他人安静旁听(这就是 ProbSparse 稀疏注意力);会后几百页纪要也被逐层精简成几页核心摘要(蒸馏);最后主持人拿着“开场提纲 + 空白答题纸”一口气念完整份结论,而不是逐字憋稿(生成式解码)。一场原本兵荒马乱的 n² 大会,变成优雅高效的 n·logn 精英质询会。

岗位关联

掌握 Informer,你就能在长序列预测场景中把模型从“显存爆炸无法训练”变为“秒级推理”,这是工业界时序建模的高含金量技能。

目录
  1. 可视化演示
  2. 注意力瓶颈:全员会议的平方级折腾
  3. ProbSparse机制:只让“意见领袖”发言
  4. 稀疏度度量:给发言质量打分
  5. 自蒸馏降维:会议纪要逐层减半
  6. 生成式解码:开场白直接念完整份结论
  7. 复杂度实战:从平方级到线性对数的落地
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示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 决定:不再让所有人开全员会。

A=softmax(QK⊤d)VA = \text{softmax}\left(\frac{QK^\top}{\sqrt{d}}\right)V
通俗说:公式就是“先看我和谁最相关,再按相关程度吸收对方的信息”。问题在于“看相关程度”这一步要生成 L×L 的大表。
  1. 查询键点积让每个查询与所有键两两配对,得到 L×L 的相似度矩阵
    QK⊤QK^\top
  2. 维度缩放除以 √d,防止内积过大把 softmax 推向极端
    1d\frac{1}{\sqrt{d}}
  3. 概率归一化对每一行做 softmax,把分数变成和为 1 的注意力权重
    softmax(⋅)\text{softmax}(\cdot)
  4. 值加权求和按权重把值矩阵列向量聚合,得到当前 token 的新表示
    ×V\times V

ProbSparse机制:只让“意见领袖”发言

真正的会议效率提升,从来不是让所有人闭嘴,而是让真正有价值的人开口。Informer 的 ProbSparse 注意力做了一件看起来大胆的事:从 L 个查询里挑出稀疏度最高的前 u 个“意见领袖”,组成一个瘦身后的查询矩阵 Q̄,只用它去和键 K 计算注意力。

为什么敢这么做?因为在真实的长序列数据里,注意力分布往往呈现“长尾”特征:少数查询对输出起决定性作用,绝大多数查询的注意力模式和均匀分布差不多,多算它们只是浪费算力。只要 u 的取值与 log L 同阶(例如 u = c·logL),点积量就从 L×L 降到 u×L,整体复杂度变为 O(L·logL)。

这场“精英质询会”开完,大家发现会议结论和全员大会几乎一样——因为真正推动结论的永远是那几位关键发言人。

A=softmax(QˉK⊤d)VA = \text{softmax}\left(\frac{\bar{Q}K^\top}{\sqrt{d}}\right)V
Q̄ 是“精简后的参会名单”,只保留 Top-u 名意见领袖;K 与 V 的规模不变,依然代表全场所有人的信息供给。
  1. 稀疏选择用稀疏度分数挑出前 u 个重要查询,拼成瘦身矩阵
    Qˉ\bar{Q}
  2. 局部点积只让意见领袖与所有键计算相似度,分数矩阵从 L×L 缩成 u×L
    QˉK⊤\bar{Q}K^\top
  3. 缩放归一对选中的 u 行做缩放和 softmax,得到有效注意力权重
    softmax(⋅d)\text{softmax}\left(\frac{\cdot}{\sqrt{d}}\right)
  4. 值加权聚合用这些权重加权 V;没被选中的行可以用全局均值近似,不必逐个算
    ×V\times V

稀疏度度量:给发言质量打分

怎么判断谁是“意见领袖”? Informer 用了一个非常直觉的标准:如果某个人问的问题,答案和全场默认答案一模一样,那他的问题没有信息量;相反,如果他的提问能引出最大的“意外响应”,就该被重点对待。这个“意外程度”在数学上就是注意力分布与均匀分布的 KL 散度。

完整 KL 散度要先算所有 softmax 概率,成本太高。Informer 用一个漂亮的近似来打分:对查询 qᵢ,它遍历所有键,记录下最强烈的“共鸣”分数(最大值),再算出对所有键的平均反应;两者相减。峰值很高、平均水平又低,说明这个查询只对少数键有强关注,信息很集中;如果峰值和均值差不多,说明它对谁都很平均,没有独到之处。

把所有人的分数排出来,会得到一条右边拖得很长的分布:绝大多数查询分数低,少数查询分数高。Informer 只需要排个序,截取 Top-u,自然就拿到了那批最值得发言的人。

M(qi,K)=max⁡jqikj⊤d−1L∑j=1Lqikj⊤dM(q_i, K) = \max_j \frac{q_i k_j^\top}{\sqrt{d}} - \frac{1}{L} \sum_{j=1}^{L} \frac{q_i k_j^\top}{\sqrt{d}}
通俗说:先找出“最戳中我的那个人”给我的反应有多强,再减去“全场平均反应”。差值越大,说明我的问题越有针对性、越值得被回答。
  1. 逐键点积把 qᵢ 与每个键 kⱼ 算相似度,并做维度缩放
    qikj⊤d\frac{q_i k_j^\top}{\sqrt{d}}
  2. 最大响应在所有键中找出相似度最高的峰值
    max⁡j(⋅)\max_j(\cdot)
  3. 平均响应计算该查询与全部键相似度的平均基线
    1L∑j=1L(⋅)\frac{1}{L}\sum_{j=1}^{L}(\cdot)
  4. 差分打分峰值减去均值,得到该查询的稀疏度分数
    max⁡(⋅)−mean(⋅)\max(\cdot) - \text{mean}(\cdot)

自蒸馏降维:会议纪要逐层减半

精英质询会虽然省了交互次数,但每个参会者依然要记住全场所有人的发言细节,内存压力还是不小。于是 Informer 又加了一道“会议纪要”流程:每开完一轮会,秘书就把纪要压缩一半,只保留最重要的要点,下一轮会议在精简版基础上继续开。

这个操作叫自注意力蒸馏。每经过一个注意力块,Informer 先用一维卷积把相邻时间步的信息融合一下,再用 ELU 激活引入非线性,最后用最大池化把序列长度减半。长度减半意味着下一层注意力矩阵又小一倍,显存占用呈几何级数下降。

这份“越来越薄的纪要”并不会丢失关键信息,反而帮模型自动筛选出最值得保留的多尺度特征,让长序列预测更稳。

Xj+1=MaxPool(ELU(Conv1d([Xj]AB)))X_{j+1} = \text{MaxPool}\left(\text{ELU}\left(\text{Conv1d}\left([X_j]_\text{AB}\right)\right)\right)
一句话:卷积负责“把相邻段落合成一段摘要”,ELU 负责润色,池化负责“砍掉一半篇幅”。每层都这么做,纪要越翻越薄。
  1. 卷积整合用一维卷积让相邻时间步的信息互相渗透,形成局部摘要
    Conv1d([Xj]AB)\text{Conv1d}\left([X_j]_\text{AB}\right)
  2. 非线性激活ELU 让特征表达能力更强,同时保留部分负值信息
    ELU(⋅)\text{ELU}(\cdot)
  3. 池化减半最大池化按窗口取最显著特征,序列长度直接除以 2
    MaxPool(⋅)\text{MaxPool}(\cdot)
  4. 循环堆叠得到下一层输入 X_{j+1},重复“蒸馏”直到特征层足够精炼
    Xj+1X_{j+1}

生成式解码:开场白直接念完整份结论

传统 Transformer 做预测像新闻发言人逐字憋稿:先说出第一个词,再根据第一个词想第二个词,一个词一个词往外蹦,每蹦一个词都要重新“开一轮会”。预测 336 步,就得开 336 次会,慢得让人绝望。

Informer 的改变是:主持人拿到“开场白 + 整页空白答题纸”。开场白是从真实历史序列里截取的一段上下文 token,空白答题纸就是待预测位置的占位向量(全 0)。把它俩拼在一起放进解码器,一次前向就能把整段预测结果写满。

正是因为“一次开场,全文输出”,Informer 避免了自回归解码的串行瓶颈,长 horizon 预测的推理速度大幅提升。

Xfe=Concat(Xtoken,X0)∈R(Ltoken+Ly)×dX_{fe} = \text{Concat}\left(X_{\text{token}}, X_0\right) \in \mathbb{R}^{(L_{\text{token}} + L_y) \times d}
左边的 X_token 是“已知的历史开场”,右边的 X_0 是“留给未来的空位”。拼成一条长输入,解码器一口气输出全部预测。
  1. 起始 token从历史序列末尾截取 L_token 长度作为引导信号
    XtokenX_{\text{token}}
  2. 占位向量用全零向量填充未来 L_y 个位置,表示待预测区间
    X0X_0
  3. 拼接输入把历史与占位沿长度方向拼成解码器输入
    Concat(⋅)\text{Concat}(\cdot)
  4. 一次前向解码器并行输出整段长度为 L_y 的结果矩阵
    R(Ltoken+Ly)×d\mathbb{R}^{(L_{\text{token}} + L_y) \times d}

复杂度实战:从平方级到线性对数的落地

把这三板斧合在一起算总账:ProbSparse 注意力把交互次数从 L² 压到 L·logL,蒸馏让每层特征长度逐层减半,生成式解码又免去逐步预测的重复开销。最终 Informer 的整体时间复杂度和内存复杂度都落在 O(L·logL)。

| 方法 | 时间复杂度 | 内存复杂度 | 典型极限长度 |

| --- | --- | --- | --- |

| 标准 Transformer | O(L²) | O(L²) | 千级显存告急 |

| Informer | O(L·logL) | O(L·logL) | 万级照样训练 |

这套设计让 Informer 在 ETTh1 电力变压器数据、交通流量等大规模长序列任务上真正跑得起来,也让它成为长 horizon 预测场景中绕不开的经典基线。

CInformer=O(Llog⁡L+Ly)C_{\text{Informer}} = O(L\log L + L_y)
L 是历史窗口长度,L_y 是预测长度。注意力部分只花 LlogL,解码部分花 L_y,整体不再是可怕的平方级。
  1. 稀疏注意开销ProbSparse 让注意力计算量变为 LlogL 量级
    Llog⁡LL\log L
  2. 解码并行开销生成式解码一次输出长度 L_y 的序列
    LyL_y
  3. 整体量级两端相加,复杂度由最高阶主导,仍为 O(L·logL)
    O(Llog⁡L+Ly)O(L\log L + L_y)

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 演示

python37 行
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")
目的:演示 ProbSparse 注意力的核心流程——先给每个查询算稀疏度分数,再只对 Top-u 个“意见领袖”做完整注意力计算,展示点积次数从 L² 降到 u·L。
  1. dot = np.matmul(Q, K.T) / scale先算出所有查询与键的相似度矩阵,用于给每个人打分(教学演示中全量算;工业实现会采样键来避免 O(L²))
  2. scores = dot.max(axis=1) - dot.mean(axis=1)用“最大响应减平均响应”近似 KL 散度,反映查询的信息独特性
  3. top_idx = np.argsort(scores)[-top_u:]挑出分数最高的 Top-u 个查询,相当于选出意见领袖
  4. dot = np.matmul(Q[top_idx], K.T) / np.sqrt(Q.shape[-1])只让意见领袖与所有键计算点积,复杂度从 L×L 降到 u×L
  5. attn = np.full((L, L), 1.0 / L)没被选中的查询行统一用均匀分布近似,省掉大量计算
  6. 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²) 复杂度的核心原因是什么?

单选题 · easy

  • A.每个查询要与所有键计算分数← 正确答案
  • B.每个查询只与相邻键计算分数
  • C.每个键只与相邻查询计算分数
  • D.查询与值直接计算输出分数

答案:A。标准注意力中 QKᵀ 将每个查询与所有键配对,形成 L×L 的分数矩阵。类比全员会议:每个人都必须与所有人交换意见,于是工作量是 n² 次交流。B、C 都把交互限制在相邻位置,D 则混淆了值与键的角色。

Q2. ProbSparse 注意力把标准 O(n²) 复杂度降为什么量级?

单选题 · easy

  • A.线性级复杂度 O(n)
  • B.对数线性级 O(nlogn)← 正确答案
  • C.对数级复杂度 O(logn)
  • D.平方级复杂度 O(n²)

答案:B。ProbSparse 只让 Top-u 个查询参与完整注意力计算,u 取与 logL 同阶的常数倍,因此 L 个查询总开销为 O(L·logL)。这相当于把全员一对一会议改成少数精英质询,交互量从平方级降到对数线性级。

Q3. 自注意力蒸馏中,哪个操作直接负责把序列长度减半?

单选题 · easy

  • A.随机丢弃一半时间步
  • B.复制序列再拼接成两倍
  • C.卷积加最大池化降采样← 正确答案
  • D.用最小池化替代全部输出

答案:C。蒸馏块先用一维卷积融合相邻信息,再用 ELU 激活,最后用最大池化对长度下采样,从而使序列长度减半。随机丢弃会丢失结构信息,复制拼接会加倍长度,最小池化也不是 Informer 采用的采样方式。

Q4. ProbSparse 的稀疏度分数近似计算(max−mean)主要衡量什么?

单选题 · mid

  • A.查询与值的欧式距离
  • B.注意力分布与均匀分布的差异← 正确答案
  • C.查询向量自身的模长
  • D.键矩阵的奇异值大小

答案:B。完整指标是注意力分布与均匀分布的 KL 散度。近似做法取“最大点积”代表最强响应,“平均点积”代表均匀基线,两者相减表示该查询有多少信息量。距离、模长、奇异值都不直接刻画这种分布偏离程度。

Q5. 未被选入 Top-u 的查询在 ProbSparse 注意力中如何处理?

单选题 · mid

  • A.整行丢弃不参与任何输出
  • B.用均匀分布近似其注意力← 正确答案
  • C.复制邻近查询的输出结果
  • D.用零向量代替该行全部输出

答案:B。非 Top-u 查询的注意力分布接近均匀,因此直接用均匀分布近似,避免逐行计算 softmax。整行丢弃会丢失信息,复制邻居或置零都会引入偏差;均匀近似是论文采用的轻量替代。

Q6. 生成式解码相比逐步自回归解码的主要优势是什么?

单选题 · mid

  • A.不需要任何历史信息即可预测
  • B.一次前向得到整段预测结果← 正确答案
  • C.参数量直接减少一半
  • D.完全不需要注意力机制

答案:B。生成式解码把“历史起始 token + 零占位”拼成完整输入,解码器一次前向输出全部 L_y 个预测点,避免了逐步解码的串行计算。它依然需要历史信息和注意力机制,参数量也不会凭空减半。

Q7. 关于生成式解码器输入的组成,下列说法正确的有?

多选题 · mid

  • A.历史序列截取一段作为起始 token← 正确答案
  • B.待预测位置填入全零占位向量← 正确答案
  • C.拼接后进入解码器一次前向← 正确答案
  • D.每次只输入一个真实标签逐步预测

答案:ABC。解码输入 = X_token(历史上下文)拼接 X_0(全零占位),一次性送入解码器。D 描述的是传统自回归解码,不是 Informer 的生成式解码方式。

Q8. 极端情况下当 u=L(选中全部查询),ProbSparse 的时间复杂度会变成什么?

单选题 · hard

  • A.仍保持线性对数级复杂度
  • B.退化为平方级复杂度← 正确答案
  • C.变成常数级复杂度
  • D.变成线性级复杂度

答案:B。ProbSparse 的复杂度核心是 u×L,u 是实际选中的查询数。当 u=L 时点积次数为 L×L,即 O(L²),退化为标准注意力。这说明 ProbSparse 的效率来自“真正只选少数关键查询”,而不是数学上无条件免费。

Q9. 关于 Informer 自注意力蒸馏,下列说法正确的是哪项?

单选题 · hard

  • A.蒸馏会使编码器总层数翻倍
  • B.蒸馏只能去除键值的多余信息
  • C.蒸馏会让注意力变成两层级联
  • D.蒸馏能降低显存占用并加速训练← 正确答案

答案:D。蒸馏块每层把序列长度减半,下一层注意力矩阵更小,显存和计算量逐层下降。它不减层数而是减特征长度,所以 A 错误;B、C 的表述也不符合蒸馏的真实机制。

Q10. Informer 在长序列预测中做了哪些关键改进?

多选题 · hard

  • A.稀疏注意力降低整体复杂度← 正确答案
  • B.蒸馏操作减少特征长度← 正确答案
  • C.生成式解码一次输出全序列← 正确答案
  • D.用循环网络替代全部注意力

答案:ABC。Informer 三大贡献正是 ProbSparse 稀疏注意力、自注意力蒸馏和生成式解码,分别解决复杂度、显存和推理速度问题。D 完全错误,Informer 仍然基于注意力机制,而不是循环网络。