☰
长序列预测新利器Informer:原理、实践与避坑指南
2026/10/18 12:59:04 网站建设 项目流程

如果你做过一段时间序列预测,大概率经历过这种崩溃瞬间:训练好的模型在预测未来十几个点的时候还有模有样,一旦让你预测未来一百个点、几百个点,输出就开始逐级衰减、抖动,甚至直接“躺平”变成一条水平线。这套场景在电力负荷、交通流量、销量预测、气象预报里太常见了,本质就是长序列时间序列预测(Long Sequence Time-Series Forecasting,LTSF)问题。Informer这个模型能火起来,就是因为它瞄准了这类场景,用一套全新的Transformer改造方案,把长序列预测的精度、速度和显存占用一起解决了。它解决了什么痛点、核心改动到底在改什么、复现和上手时要避开哪些坑,我把自己的实操经验和理解一次讲清楚。

Informer说白了就是给Transformer做了一次针对长序列预测的“专项手术”。传统Transformer在长序列上的主要问题有两个:自注意力机制的复杂度随序列长度平方增长,以及自回归解码必须一步一步推、既慢又容易让误差越滚越大。Informer用ProbSparse自注意力把计算复杂度从O(L²)降到了O(L log L),又设计了一套生成式解码器,让模型能一次性输出整段预测结果,而不是“挤牙膏”。这篇文章适合正在做时序预测的算法工程师、相关方向的研究生,也适合刚接触Transformer在时序领域应用的读者。我会把它的设计逻辑、实操配置、复现时常见的坑都摊开讲,尽量让没读过论文的人也能直接上手用。

1. 为什么长序列预测需要Informer这样的模型

1.1 长序列预测和常规预测的本质区别

很多人一上来就把长序列预测当成“多步预测”来处理,这是最大的误区。常规的多步预测,比如用过去24小时预测未来1小时,序列长度短、依赖窗口小,LSTM或者简单的线性模型都能扛一扛。但长序列预测的场景是:用过去很长一段历史(比如480个点、720个点)预测未来同样很长的区间(96个点、168个点甚至720个点),周期多、波动大、趋势复杂。

这类任务的难点不只是“预测更多步”,而是模型能不能在超长输入里真正抓住长期依赖关系。比如电力负荷预测,你今天凌晨2点的负荷和明天凌晨2点的负荷高度相关,但和下午2点反而关系弱。这种跨时段、跨周期的“远程依赖”,恰恰是循环神经网络最不擅长的事。LSTM理论上能记住长期信息,但梯度在反向传播中经过大量时间步之后会严重衰减,实际效果就是序列一长,前面关键信息基本记不住了。

另一个问题是误差累积。你如果用多步预测的滚动方式,第一步的预测误差会作为第二步的输入。短期看误差还能忍,但预测长度一拉长,误差就被自己一步步“喂大”,最后直接崩成一条直线。Informer设计之初就盯住了这两个痛点:一个是Transformer在长序列上的复杂度瓶颈,另一个是自回归解码方式对长序列预测的低效。它的目标很明确,就是让长序列预测这件事变得“算得快”且“推得准”。

1.2 Transformer的先天不足与LTSF的矛盾

Transformer被引入时序预测,原因很直接:它的自注意力机制可以直接建模任意两个时间点之间的依赖,不受距离限制。这比LSTM强在“看得远”,但代价也很大。标准自注意力在计算权重矩阵时需要对Q和K做内积,得到一个L×L的矩阵,时间和显存都是平方级增长。假设序列长度L是1000,那就是100万个元素要参与计算;如果L到10000,直接是1亿个元素。这还没算上反向传播的梯度开销。跑长序列的Transformer就像让100个人两两握手,最后每个人都得和其余99个人握一遍,人数翻倍,握手次数直接翻四倍。

这就和长序列预测形成了硬矛盾:你要模型看得更长,需要的序列越长,但Transformer偏偏在序列变长时最先撑不住。不少人的应对方式是粗暴截断,只把最近一两百个点喂进去,结果模型又看不到周期性的远端依赖,精度折了。

解码端的矛盾同样尖锐。传统Transformer做预测时,解码器在每个时间步都基于上一步输出做自回归生成。长序列预测下,一步推一个点,推720个点就要做720次前向计算,慢不说,前面的误差还会给后面的生成“带偏”。Informer就是同时从这两个矛盾下手,做了一套组合拳。

2. Informer的三大核心改动,逐个拆解

2.1 ProbSparse自注意力:不是把注意力变稀疏,而是让注意力自己找稀疏

Informer最先解决的是计算复杂度问题,核心手段是ProbSparse自注意力。要理解它,先得说一个现象:在长序列场景下,标准自注意力的权重矩阵往往呈现出“长尾分布”。

什么意思呢?我做个不太严谨但很好懂的类比。一场100人的会议,真正左右决策的往往只有少数几个人,剩下的人更多是旁听,注意力权重很分散。自注意力也一样,序列里真正需要重点关注的位置并不多,但标准机制对待所有位置一视同仁,给每个位置都算了完整的内积。大量计算其实浪费在“不重要”的匹配上。

ProbSparse的出发点就是:我不做全量计算,我只找那些“值得被关注”的查询向量Q。衡量一个查询向量重不重要,可以通过计算它的注意力分布和均匀分布之间的差异来判断。差异越大,说明这个查询越“挑剔”,它只和少数几个键位置强相关,这样的查询自然更重要。这个差异在数学上可以用KL散度来度量,但直接算KL散度还得先算出完整注意力分布,那复杂度又绕回O(L²)了。

Informer解决方式是采样近似。它从K里随机抽出一部分样本来计算分数,再用一个数值上更稳妥的近似上界来代替原始KL散度。这样每个查询只需要和采样的键做内积,整体复杂度就降到了O(L log L)。这也是“ProbSparse”这个名字的来源:概率性的稀疏注意力,通过采样把昂贵的计算变成便宜的估计。

实际使用中,这套机制对长序列的效果我很认可,但注意前提是“序列够长”。如果你的序列本身很短,比如只有几十个点,稀疏采样带来的近似误差可能比它省下来的计算更碍事,这一点后文我会再展开。

2.2 自注意力蒸馏:把序列长度一点点压下去

ProbSparse把注意力计算从“全量内积”变成了“关键内积”,但序列长度本身还是很长,怎么办?Informer加了自注意力蒸馏。简单说,就是在每个注意力层之后接一个一维卷积和最大池化,让序列长度在层与层之间逐步减半。

这一手设计我理解为两个层面的考虑。第一层,纯粹是效率。深度模型要做很多层注意力,每层输入序列越短,后面层的计算就越省。第二层,也是一种特征抽象。卷积操作可以提前把相邻时间步的信息做局部融合,最大池化挑出局部最重要的响应,这和计算机视觉里用卷积池化逐级提取高层语义信息的逻辑是一样的。从原始的时间点,到局部时段模式,再到全局的周期规律,信息一层层变得更抽象、更浓缩。

这里有个容易被忽略的细节:蒸馏是发生在每个注意力块内部的,而不是整个模型的宏大下采样。这意味着每一层注意力依然是在完整语义下工作,只是下一层拿到的序列更紧凑。实测下来,这种“边注意边浓缩”的做法比先整体下采样再做注意力要稳,关键信息不容易丢。

2.3 生成式解码器:一次性生成而不是一步一推

如果说ProbSparse解决了“算不动”的问题,生成式解码器就是解决“推不动”的问题。传统Transformer解码器的自回归方式在长序列预测场景下太吃亏了,Informer换了一种思路:把解码过程从“一步步生成”改成“一次性补全”。

具体做法是,解码器的输入分成两段。前一段是label token,训练时直接取预测段之前的那段真实序列;后一段是预测段的位置占位符,用标量0填充,让模型在这个位置“猜”出对应的embedding。这样做的好处是,整个预测序列可以在一次前向传播中全部生成,不用递归调用,训练和推理速度都大幅提升,同时也省去了自回归累积误差的问题。

训练时有一个需要注意的技巧:为了让模型学到从已知段到预测段的平滑过渡,训练时预测段的真实值会被“掩码处理”,也就是说模型看不到待预测位置的真值,只能看到用于占位的0。否则解码器直接复制输入尾部就能拿到很低的损失,学不到任何预测能力。这一条在复现时经常被忽视,后面排查部分我会再强调。

3. 用Informer跑一个真实预测任务:配置、参数与流程

3.1 数据准备与预处理

我建议你第一次上手Informer时,不要一上来就上自己的业务数据,先用公开数据集找出套路。比较经典的选择有电力变压器温度数据集、电力消耗数据、天气观测数据和流感样病例数据,这些数据本身有长周期、多变量、强噪声的特征,适合做基准。自己造数也行,但序列长度最好在几千个点以上,否则体验不到Informer的长序列优势。

数据预处理有三件事不能省。第一是归一化,Informer内部用的是多层注意力加全连接,输入尺度不统一训练会很不稳,我习惯在每个变量维度上做标准归一化或者min-max归一化。第二是时间特征的构造,除了原始数值,还要把时间戳信息编码进去,比如小时、星期几、月份、是否节假日。你可能会觉得“模型都这么强了还要人为加时间特征吗”?实际上非常需要,Informer的注意力机制擅长捕捉数值模式,但对“周期性起点”这类先验知识并不敏感,把时间特征作为额外变量喂进去,能让它更快锁定周期性。第三是滑窗切分,按照“输入长度+预测长度”的窗口去扫描整个数据集,生成训练样本。

一个常用的初始配置是:输入长度96,label长度48,预测长度96。什么意思呢?用过去96个点,加上真实历史中最后48个点作为解码器的起点,去预测未来96个点。你可能会问,为什么label长度取预测长度的一半?这其实是Informer论文里给出的一组经验值,原因要结合生成式解码器的设计来理解:label段是解码器的“锚点”,太短了模型缺少足够上下文,太长了则训练开销增大,而且预测段和label段的比例失衡会让训练信号变弱。实际使用中,如果预测长度很长,比如720,我会把label长度适当加长到120甚至168,模型确实会更稳。

3.2 模型结构与训练关键参数

Informer的结构可以拆成编码器和解码器两部分。编码器由多个EncoderLayer堆叠而成,每个EncoderLayer内部包含ProbSparse注意力、蒸馏模块和全连接前馈网络;解码器由多个DecoderLayer堆叠,内部包含带掩码的ProbSparse注意力和交叉注意力。

复现时建议先改“骨架参数”,再调“训练参数”。骨架参数里最需要关注的是:

  • d_model:模型特征维度,默认512,小数据可以降到256。
  • d_layers:编码器层数,默认2,数据足够复杂再上3层。
  • n_heads:注意力头数,默认8。
  • factor:ProbSparse注意力里的采样因子,控制每个查询采样的键数量,默认5。这个值不是越大越好,采样多了计算量大,采样少了近似误差大。
  • dropout:默认0.05,但如果是高噪声数据,我会先加大到0.1观察训练曲线再决定。

训练参数我用过一个比较稳的起点:优化器Adam,学习率1e-4,batch size 32,loss用MSE,早停机制盯着验证集损失。如果loss长时间不动或者波动剧烈,优先把学习率调低到5e-5,不要上来就动模型结构。Informer对学习率比较敏感,很多人一上来就崩,多半是学习率太高。

核心稀疏注意力的计算思路,用伪代码看更清晰:

def prob_sparse_attention(q, k, v, factor): # q: [B, H, L, D],L是序列长度 L = q.shape[-2] u_k = max(int(factor * log(L)), 1) # 采样键的数量 k_sample = k[:, :, randperm(L)[:u_k], :] # 随机采样部分键 # 计算每个查询与采样键的近似稀疏分数 score = matmul(q, k_sample.transpose()) / sqrt(D) # 取最大值作为稀疏性上界,再走softmax p = softmax(score, dim=-1) # 只保留最有代表性的查询 top_u = topk(p, u_q, dim=-2) out = matmul(top_u, v) return out

实际工程里,实现方式会比这段更复杂,比如要引入mask避免未来信息泄漏,但对理解来说,记住“随机采样键、求稀疏分数、挑重要查询”这条主线就够了。

3.3 评测指标与结果解读

评测预测效果,最常用的指标是MSE和MAE。MSE对异常大的误差更敏感,MAE则更能反映整体偏移水平。如果业务上更在意峰值预测,比如电力调度要防止负荷尖峰,我会更关注MSE;如果业务上更在意整体曲线的贴合度,那就主看MAE。

实操时不要只看指标数字,要画预测曲线。观察三个点:第一,模型能不能抓住趋势的上升和下降,哪怕幅度不完全准;第二,模型能不能锁定周期,比如每天固定时段的峰值是否对齐;第三,峰谷处是否出现明显的滞后,滞后一步就说明模型在“抄近期输入”,而不是真正学到了时序规律。

我最常测的预测长度是96、192、336、720这四档。趋势很明确:预测长度越往上走,MSE越高,这是正常的,不是模型坏了。Informer相对其他模型的价值恰恰在于,预测长度越长,它的优势往往越明显。因为短序列预测时大家都差不多,拉到720以后,它的一次生成式解码和长期依赖建模能力才真正拉开差距。

4. 复现与使用时最常踩的坑

4.1 稀疏注意力在短序列上反而失效

这个问题我在前面提过,这里详细说。ProbSparse注意力依赖“少数查询主导注意力分布”的前提,序列越短,这个前提越不成立。当序列长度只有二三十个点,注意力分布往往都比较均匀,采样的近似误差就变得不可忽视了。

有一次我在一个数据量较小的项目里试Informer,序列长度只有48,效果反而不如普通Transformer。排查下来就是这个问题。解决方案也很直白:给你的模型加一个序列长度判断,当长度低于某个阈值(比如64)时,自动回退到标准注意力。不要迷信“新模型一定全面优于旧模型”,工具选型永远看场景。

4.2 生成式解码器把输入尾部直接复制到预测段

这是Informer复现里最能迷惑人的坑。现象是:训练loss很低,验证loss也不差,但画出的预测曲线后半段几乎等于输入尾部平移过来,曲线整体滞后一拍,前面稍微变一下,后面全跟着变。

原因基本都出在掩码处理上。生成式解码器在训练时用0占位符表示预测位置,如果掩码机制没写对,模型在训练时能看到预测段的部分真实信息,那解码器最省力的策略就是记住输入尾部,直接把它搬到输出位置。更隐蔽的是,即使掩码没写错,如果label段长度和位置编码处理不当,模型也可能学会“直接参考最近的历史窗口”。

排查思路是:把训练时的输入尾部人为加一个大跳变,比如在某一步把输入的最后几个数全部置为非常离谱的值,然后看预测段是否也随之剧烈波动。如果跟着波动,说明它在抄输入,而不是在学规律。我个人的经验是,把dropout稍微调大一点,同时确保label段和预测段的position encoding是连续递增的,能有效减少这种“复制倾向”。

4.3 数据归一化与逆归一化要原样还原

这个坑不只在Informer里,但在它上面更容易踩。长序列预测的数据往往跨越很长的时段,不同季节的均值、方差差异很大。有人图省事,对整个数据集做一次min-max归一化,训练测试一起算,这就引入了严重的标签泄漏。测试集的信息提前进入了训练阶段的统计量,指标虚高,一上真实场景就现原形。

正确做法是:只用训练集的统计量来做归一化,测试集和验证集都沿用同一套min-max参数。预测完成后,逆归一化也要用同一套参数把预测值还原回原始尺度。这一点看起来平平无奇,我见过不止一个团队最后在线上的误差比离线翻倍,最后查下来就是这里出了问题。

4.4 训练不稳定:学习率与优化器

Informer训练时最常见的灾难现场是:loss在某个step突然跳到NaN。大多数时候是学习率过大,少数时候是数据里混了NaN值。我建议训练初期把学习率压在1e-4以下,batch size 32起步,如果显存够大再加到64,但学习率不要跟着batch size盲目调大。

另一个容易被忽略的是warmup。Transformer类模型在训练初期对学习率极其敏感,上来就用大学习率容易让损失函数震荡。给优化器加一个线性warmup,前几个epoch学习率从0平滑爬到设定值,这个操作能非常有效地减少NaN和发散问题。

4.5 长预测时的分布偏移与外部因素缺失

Informer再强,它也是一个纯历史数据驱动的模型。在预测长度拉到720时,预测区间内可能发生的事件——比如节假日、极端天气、临时政策——这些在历史数据里没有直接对应,模型只能靠周期模式外推,性能必然受限。

做项目时别把模型当“全知先知”。如果业务场景有强外部因素,优先把外部变量作为额外特征拼进输入;如果外部因素不可得,至少要把预测区间切短,或者配合在线微调策略,让模型在真实数据滚动到达时持续更新。这个思路比单纯堆模型复杂度实用得多。

5. 从Informer延伸出去的实操建议

5.1 它的思路影响了很多后来的长序列模型

Informer的这套设计思路,后来很多长序列预测模型都沿用了。稀疏注意力虽然各家实现方式不同,但“降低全量注意力复杂度”这个方向大家是一致的;一次生成式解码也在很多模型里以不同形态出现。后来的分解式Transformer、基于Patch思想的模型,本质上都是在“长序列建模”这件事上做不同的取舍。

这说明了一个道理:做长序列预测,真正的核心不是某一个模型,而是“怎么高效地让模型看到更长的历史,同时不付出过高的算力代价、不累积误差”。Informer是这条路上一个标志性的解决方案,但它不是终点。你在自己的任务里如果发现Informer有短板,完全可以借鉴它的思路去改其他模型。

5.2 什么场景适合用Informer,什么场景不适合

结合实操经验,我建议按下面这个速查表来决定到底用不用Informer。

场景特征是否建议Informer原因
历史数据长(几百上千点)、有明显周期与长依赖推荐稀疏注意力和蒸馏能发挥优势
预测长度长(96以上)且要求一次预测整段推荐生成式解码器避免自回归累积误差
数据量小、序列短(<64)不建议稀疏注意力近似误差会拖后腿
需要高频在线实时预测谨慎模型较重,可先评估推理时延
强外部因素主导的预测场景谨慎纯历史建模容易失效,需另加特征

如果你的场景落在“推荐”区间,上手路径就是:先把公开数据集跑通,再把数据预处理换成自己的业务数据,最后再针对业务特点调label长度和factor。

最后再分享一个个人体会。Informer这类模型的落地价值,不在于它在一两个指标上比别的模型高了多少,而在于它让“预测未来很长一段”这件事在工程上变得可以接受了。以前做720步预测,要么等着LSTM一步步滚出结果,要么看着Transformer在显存上直接爆掉;Informer把这套流程变成了正常训练一次、一次前向推理出全部结果。这个使用体验的改善,比单纯的指标提升更打动我。

如果你刚开始接触它,建议别急着调参,先把它在公开基准上的结果复现出来,感受一下训练速度和预测曲线的形态。跑通一次之后,你自然就知道后面该往哪个方向使劲了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询