☰
Informer2020 官方 PyTorch 实现:ProbSparse Attention 长序列时序预测实战指南
2026/10/15 22:30:39 网站建设 项目流程
  • 人工智能
  • 深度学习
  • 机器学习

【免费下载链接】Informer2020

The GitHub repository for the paper "Informer" accepted by AAAI 2021.

项目地址:https://gitcode.com/gh_mirrors/in/Informer2020
点击查看免费下载

本文基于 AAAI 2021 最佳论文《Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting》的官方开源实现仓库(Informer2020)编写。文章以仓库 README.md 为骨架,系统讲解 ProbSparse Attention 的核心原理、环境搭建、数据集准备、训练/测试命令、全部命令行参数含义,并结合 models、data、exp 等目录下的源码逐层印证实现细节。读完本文,你将能够独立复现论文中的单变量与多变量长序列预测实验,并能基于自定义数据快速改造运行自己的任务。

一、项目背景与仓库结构

Informer2020 是论文《Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting》(AAAI 2021 最佳论文)的原始 PyTorch 实现仓库,作者为 Haoyi Zhou 等人。该工作聚焦**长序列时间序列预测(Long Sequence Time-Series Forecasting, LSTF)**问题,针对传统 Transformer 在长序列场景下计算复杂度高、内存占用大、预测效率低的三重挑战,提出了三项核心创新:

  1. ProbSparse Self-Attention:通过概率稀疏化机制选取"活跃"的 query,将自注意力复杂度从 O(L²) 降至 O(L log L);
  2. Self-Attention Distilling:在编码器各层之间插入卷积池化层,逐层裁剪冗余特征,进一步压缩输入维度;
  3. Generative Style Decoder:一次前向推理即生成整个预测序列,无需像传统自回归方法那样逐步迭代,显著提升长序列推理速度。

仓库整体结构清晰,各模块职责分明:

目录/文件职责
main_informer.py命令行入口:参数解析、数据信息映射、训练/测试/预测主流程
exp/exp_informer.py实验封装:数据加载、模型构建、训练循环、验证、测试与预测
models/model.pyInformer 与 InformerStack 两大模型定义
models/attn.pyProbAttention 与 FullAttention 注意力实现
models/encoder.py编码器、ConvLayer 蒸馏层与 EncoderStack
models/decoder.py生成式解码器
models/embed.pyToken/Positional/Temporal 三种嵌入
data/data_loader.py四类 Dataset:ETT 小时、ETT 分钟、自定义数据、预测数据
utils/时间特征、掩码、指标、早停与学习率调整等工具
scripts/各数据集的复现实验脚本(.sh)

整个仓库的调用链可以概括为:main_informer.py解析参数 →Exp_Informer构建数据与模型 →Informer模型内部由DataEmbedding、Encoder、Decoder、投影层组成 → 注意力核心由ProbAttention(或FullAttention)实现。

二、核心原理:ProbSparse Attention

2.1 长尾分布中的"活跃 query"与"懒惰 query"

自注意力的打分矩阵会呈现出典型的长尾分布特征:其中少数"活跃"的 query 占据了打分矩阵中绝大多数的高分值(分布在"头部"区域),而大量"懒惰"的 query 对应的分值集中在"尾部",对输出的贡献微弱。Informer 的设计思路就是:只挑选"活跃"的 query 参与完整的注意力计算,而跳过"懒惰"的 query,从而用概率分布构建出一个稀疏 Transformer。

ProbSparse Attention 使用 Top-u 个活跃 query,其核心动机在原文档中有明确阐述:自注意力层的输出本质上是输入的一种重新表示(re-representation),它被形式化为值向量关于点积分数(dot-product pairs)的加权组合。Top-u 个 query 配合全部 keys,可以完整重建输入中的主导成分(leading components),等价于在所有点积对中挑选"头部"的高分项。反过来,如果选择 Top-u 个 keys,那么完整保留的 keys 只会在"长尾"分数内保留值的平凡求和,却会破坏对主导成分的重建——这正是"为什么不用 Top-u keys"的答案。

说明:以上原理性描述来自原 README 的原文表述,本文仅做转述与结构梳理,不引入外部文献内容。

2.2 源码中的稀疏测量与采样实现

在 models/attn.py 中,ProbAttention通过两步完成稀疏化计算:

第一步:随机采样估计稀疏性得分。方法_prob_QK先对 K 按 query 维度扩展,然后从 L_K 个 key 中随机采样sample_k = U_part个,计算采样后的 Q·K 得分,并据此估计每个 query 的稀疏性度量 M:

M = Q_K_sample.max(-1)[0] - torch.div(Q_K_sample.sum(-1), L_K) M_top = M.topk(n_top, sorted=False)[1]

其中采样数量与保留数量均由factor参数控制(见 models/attn.py):

U_part = self.factor * np.ceil(np.log(L_K)).astype('int').item() # c*ln(L_k) u = self.factor * np.ceil(np.log(L_Q)).astype('int').item() # c*ln(L_q)

也就是说,真实参与完整计算的 query 数为factor × ln(L_Q),采样 key 数为factor × ln(L_K),两者都做了上限截断以防超出实际长度。这解释了为什么 ProbSparse 的复杂度是 O(L log L) 级别。

第二步:用选出的 Top-u query 计算完整注意力并更新上下文。_get_initial_context先用均值(非掩码情形)或前缀和(掩码情形,见 models/attn.py)初始化每个 query 的上下文向量,然后在_update_context中仅用选中的索引更新对应的上下文:

context_in[..., index, :] = torch.matmul(attn, V).type_as(context_in)

这种"先给默认值、再定点更新"的策略保证了被丢弃的"懒惰" query 依然有合理的上下文表示,同时把完整 softmax 的计算量压缩到 Top-u 个 query 上。

2.3 与 FullAttention 的对比与切换

同一文件中的FullAttention(models/attn.py)是标准 Transformer 注意力:通过torch.einsum("blhe,bshe->bhls")计算全部打分,配合TriangularCausalMask因果掩码做 masked softmax。模型按--attn参数二选一(见 models/model.py):

Attn = ProbAttention if attn=='prob' else FullAttention

在编码器中使用Attn(False, factor, ...)(不启用掩码),在解码器的自注意力子层中使用Attn(True, factor, ...)(启用因果掩码),而解码器的交叉注意力子层固定使用FullAttention(见 models/model.py)。这意味着你可以通过--attn full把编码器换成标准 Transformer 注意力,作为对比实验。

说明:ProbSparse 选择 Top-u query 而非 Top-u keys 的动机阐述,源自原 README 的 ProbSparse Attention 小节;源码结构可参见 models/attn.py。

三、环境要求与安装

原 README 给出了严格的依赖版本清单,为保证实验可复现,建议按以下版本安装:

依赖版本
Python3.6
matplotlib3.1.1
numpy1.19.4
pandas0.25.1
scikit_learn0.21.3
torch1.8.0

依赖清单同时记录在 requirements.txt 中,可直接执行:

pip install -r requirements.txt

仓库还提供了基于 conda 的 environment.yml(包含与上述一致的 Python 3.6 与各库版本),以及用于构建 Docker 镜像的 Dockerfile(基于continuumio/miniconda3:4.7.12,通过 mamba 更新 base 环境)。两种方式均可用于搭建与论文一致的运行环境。

四、数据集准备

4.1 ETT 数据集

论文使用的 ETT(Electricity Transformer Temperature)数据集可从 ETDataset 仓库获取。下载后需要把数据文件放入data/ETT/目录。原 README 指出:本实现中每个数据集的输入都做了零均值归一化(zero-mean normalized)。

ETT 数据在 data/data_loader.py 中有两类 Dataset 与之对应:

  • Dataset_ETT_hour(data/data_loader.py):对应 ETTh1/ETTh2,按小时采样,训练/验证/测试集边界按12×30×24小时为切分基准;
  • Dataset_ETT_minute(data/data_loader.py):对应 ETTm1/ETTm2,按 15 分钟采样,边界按12×30×24×4为切分基准。

归一化由 utils/tools.py 中的StandardScaler完成:fit阶段只在训练段上计算均值和标准差,transform/inverse_transform分别完成标准化与反标准化。这也与--inverse参数(反标准化输出)的实现一一对应。

4.2 ECL 与 Weather 数据

ECL(电力消费)与 Weather(气象)数据集可通过原 README 提供的 Google Drive / 百度网盘链接下载(百度网盘密码为6gan)。在main_informer.py内置的数据信息表中,这两个数据集分别对应:

'WTH': {'data': 'WTH.csv', 'T': 'WetBulbCelsius', 'M': [12, 12, 12], 'S': [1, 1, 1], 'MS': [12, 12, 1]}, 'ECL': {'data': 'ECL.csv', 'T': 'MT_320', 'M': [321, 321, 321], 'S': [1, 1, 1], 'MS': [321, 321, 1]},

即 WTH 默认有 12 个特征、目标列为WetBulbCelsius;ECL 默认 321 个特征、目标列为MT_320。这两类数据在代码中走Dataset_Custom(data/data_loader.py),按 7:2:1 比例切分训练/验证/测试集。Solar数据集(137 维)也已内置支持。

4.3 自定义数据

如果你的数据不是 ETT/ECL/WTH/Solar 之一,可在运行命令中指定--data custom,走Dataset_Custom/Dataset_Pred路径。自定义 CSV 的列结构要求为:date列 + 若干特征列 + 目标列。可以通过--cols参数指定参与训练的特征列,通过--target指定目标列,通过--features M/S/MS决定预测任务类型。

五、快速复现:Makefile + Docker 一键流程

原 README 提供了一套基于 Makefile 的复现流程,Makefile的具体实现见 Makefile:

  1. 初始化 Docker 镜像:make init,等价于docker build -t informer .(基于 Dockerfile 构建);
  2. 下载数据集:make dataset,脚本会创建data/ETT/目录,并依次下载 ETTh1.csv、ETTh2.csv、ETTm1.csv、ETTm2.csv、ECL.csv、WTH.csv 到该目录(见 Makefile);
  3. 逐个运行脚本:make run_module module="bash ETTh1.sh",对 scripts/ 下的每个脚本执行一次;
  4. 批量运行全部脚本:
for file in `ls scripts`; do make run_module module="bash scripts/$script"; done

注意原文档中的这条批量命令存在笔误($script应为$file),实际执行时请改为:

for file in `ls scripts`; do make run_module module="bash scripts/$file"; done

run_module的实现是挂载仓库根目录到容器内/app并以当前用户运行(见 Makefile),因此容器内的数据与产出会直接落在宿主机仓库目录中。此外 Makefile 还提供了jupyter(启动 Jupyter Lab,端口 8888)与bash_docker(进入容器交互 shell)两个辅助目标,便于调试与可视化。

六、训练与测试命令

6.1 三个数据集的快速入门命令

原 README 给出了使用 ProbSparse 自注意力在 ETTh1、ETTh2、ETTm1 上训练与测试模型的最简命令:

# ETTh1 python -u main_informer.py --model informer --data ETTh1 --attn prob --freq h # ETTh2 python -u main_informer.py --model informer --data ETTh2 --attn prob --freq h # ETTm1 python -u main_informer.py --model informer --data ETTm1 --attn prob --freq t

其中--freq指定时间特征编码的频率粒度(h表示小时级,t表示分钟级),其余参数全部走默认值:seq_len=96、label_len=48、pred_len=24、e_layers=2、d_layers=1、d_model=512、n_heads=8等(详见下文参数表)。

main_informer.py会根据--data自动补齐数据集信息:它内置了一张数据字典表(见 main_informer.py),当--data命中内置名称时,会自动覆盖data_path、target与enc_in/dec_in/c_out三个维度值(按--features取值)。例如--data ETTh1 --features M会自动把enc_in、dec_in、c_out都设为 7,无需手工指定。

每次实验都会打印实验标识 setting,格式为:

{model}_{data}_ft{features}_sl{seq_len}_ll{label_len}_pl{pred_len}_dm{d_model}_nh{n_heads}_el{e_layers}_dl{d_layers}_df{d_ff}_at{attn}_fc{factor}_eb{embed}_dt{distil}_mx{mix}_{des}_{itr序号}

该标识同时用作 checkpoint 目录名与结果目录名,训练/测试/预测的产物分别写入./checkpoints/<setting>/与./results/<setting>/(见 exp/exp_informer.py)。

6.2 完整命令行模板

原 README 提供了覆盖全部参数的最完整命令模板,直接照抄即可:

python -u main_informer.py --model <model> --data <data> --root_path <root_path> --data_path <data_path> --features <features> --target <target> --freq <freq> --checkpoints <checkpoints> --seq_len <seq_len> --label_len <label_len> --pred_len <pred_len> --enc_in <enc_in> --dec_in <dec_in> --c_out <c_out> --d_model <d_model> --n_heads <n_heads> --e_layers <e_layers> --d_layers <d_layers> --s_layers <s_layers> --d_ff <d_ff> --factor <factor> --padding <padding> --distil --dropout <dropout> --attn <attn> --embed <embed> --activation <activation> --output_attention --do_predict --mix --cols <cols> --itr <itr> --num_workers <num_workers> --train_epochs <train_epochs> --batch_size <batch_size> --patience <patience> --des <des> --learning_rate <learning_rate> --loss <loss> --lradj <lradj> --use_amp --inverse --use_gpu <use_gpu> --gpu <gpu> --use_multi_gpu --devices <devices>

6.3 全部参数详解(源自原 README 参数表,并对照 main_informer.py 源码核验)

参数名参数说明
model实验所用模型,可选informer、informerstack、informerlight(TBD)。其中informerstack在 models/model.py 中实现为多组编码器堆叠(EncoderStack,默认s_layers=3,2,1,每层按输入长度 2 的幂次逐层裁剪后拼接),对应 exp/exp_informer.py 中e_layers与s_layers的切换逻辑
data数据集名称,支持ETTh1、ETTh2、ETTm1、ETTm2、WTH、ECL、Solar、custom(内置映射见 main_informer.py)
root_path数据文件的根路径(默认./data/ETT/)
data_path数据文件名(默认ETTh1.csv)
features预测任务类型(默认M)。M:多变量预测多变量;S:单变量预测单变量;MS:多变量预测单变量
targetS 或 MS 任务中的目标特征(默认OT)
freq时间特征编码频率(默认h)。可选s(秒级)、t(分钟级)、h(小时级)、d(日级)、b(工作日)、w(周级)、m(月级);也支持更细粒度写法如15min、3h。源码中args.freq = args.freq[-1:]会把15min归一为t(见 main_informer.py)
checkpoints模型 checkpoint 存放位置(默认./checkpoints/)
seq_lenInformer 编码器输入序列长度(默认 96)
label_lenInformer 解码器起始 token(start token)长度(默认 48)
pred_len预测序列长度(默认 24)
enc_in编码器输入维度(默认 7)
dec_in解码器输入维度(默认 7)
c_out输出维度(默认 7)
d_model模型维度(默认 512)
n_heads注意力头数(默认 8)
e_layers编码器层数(默认 2)
d_layers解码器层数(默认 1)
s_layers堆叠编码器(informerstack)各层数(默认3,2,1,源码中按逗号分隔解析为整数列表,见 main_informer.py)
d_ff前馈网络(fcn)维度(默认 2048)
factorProbSparse 注意力因子(默认 5),控制factor × ln(L)的采样/保留规模
padding解码器输入填充类型(默认 0)。0表示用零填充pred_len段,1表示用 1 填充(见 exp/exp_informer.py)
distil是否在编码器中使用蒸馏。注意这是action='store_false'参数:带上该参数表示不使用蒸馏,默认值True表示默认启用蒸馏
dropoutdropout 概率(默认 0.05)
attn编码器所用注意力(默认prob)。可选prob(Informer)、full(标准 Transformer)
embed时间特征编码方式(默认timeF)。可选timeF(线性映射连续时间特征)、fixed(固定三角函数嵌入)、learned(可学习嵌入)
activation激活函数(默认gelu),可选relu/gelu,见 models/encoder.py
output_attention是否输出编码器注意力,带上该参数表示输出注意力(默认False),开启后模型返回(dec_out, attns)二元组
do_predict是否预测未见过的未来数据,带上该参数表示执行预测(默认False),开启后训练测试完毕会调用exp.predict(setting, True)并保存real_prediction.npy(见 main_informer.py)
mix生成式解码器中是否使用 mix attention,带上该参数表示不使用 mix attention(默认True)
cols从数据文件中选取的特定特征列作为输入(nargs='+',可传多个列名)
num_workersDataLoader 工作进程数(默认 0)
itr实验重复次数(默认 2),main_informer.py外层循环对每次实验用递增序号 ii 生成 setting
train_epochs训练轮数(默认 6)
batch_size训练批次大小(默认 32)
patience早停耐心值(默认 3),对应 utils/tools.py 中EarlyStopping的实现
learning_rate优化器学习率(默认 0.0001),优化器为 Adam(见 exp/exp_informer.py)
des实验描述(默认test),会拼入 setting 字符串
loss损失函数(默认mse),源码中实际固定使用nn.MSELoss()
lradj学习率调整方式(默认type1)。type1:每 1 个 epoch 学习率减半(lr × 0.5^(epoch-1));type2:按预设 epoch 表阶梯下降(见 utils/tools.py)
use_amp是否使用自动混合精度训练,带上该参数表示启用 AMP(默认False),启用后使用torch.cuda.amp.GradScaler与autocast(见 exp/exp_informer.py)
inverse是否对输出数据做反标准化,带上该参数表示反标准化输出(默认False),依赖 Dataset 的inverse_transform方法
use_gpu是否使用 GPU(默认True)。实际生效条件为torch.cuda.is_available() and args.use_gpu(见 main_informer.py)
gpu训练与推理使用的 GPU 编号(默认 0)
use_multi_gpu是否使用多 GPU,带上该参数表示启用多卡(默认False),启用时以nn.DataParallel包装模型(见 exp/exp_informer.py)
devices多 GPU 设备 ID 列表(默认0,1,2,3)

6.4 编码器与解码器的输入构造细节

main_informer.py源码中的注释揭示了解码器输入的构造方式:

# Informer decoder input: concat[start token series(label_len), zero padding series(pred_len)]

具体实现见 exp/exp_informer.py:解码器输入 =batch_y的前label_len个真实值(start token)+ 长度为pred_len的零(或一)填充段。正是这种"生成式"输入设计,让解码器可以在一次前向中并行输出整个预测序列,而无需自回归迭代。

七、复现脚本与超参数设置

原 README 指出:每个数据集的实验参数都格式化存放在 scripts/ 目录下的 .sh 文件中,可直接参考这些参数复现论文结果,也可以调整参数以获得更好的 MSE/MAE 指标或更漂亮的预测图。以下摘录 scripts/ETTh1.sh 的部分实验命令作为示例:

# ETTh1 多变量预测(M) python -u main_informer.py --model informer --data ETTh1 --features M --seq_len 48 --label_len 48 --pred_len 24 --e_layers 2 --d_layers 1 --attn prob --des 'Exp' --itr 5 --factor 3 python -u main_informer.py --model informer --data ETTh1 --features M --seq_len 96 --label_len 48 --pred_len 48 --e_layers 2 --d_layers 1 --attn prob --des 'Exp' --itr 5 python -u main_informer.py --model informer --data ETTh1 --features M --seq_len 336 --label_len 336 --pred_len 720 --e_layers 2 --d_layers 1 --attn prob --des 'Exp' --itr 5 # ETTh1 单变量预测(S) python -u main_informer.py --model informer --data ETTh1 --features S --seq_len 720 --label_len 168 --pred_len 24 --e_layers 2 --d_layers 1 --attn prob --des 'Exp' --itr 5 python -u main_informer.py --model informer --data ETTh1 --features S --seq_len 720 --label_len 336 --pred_len 720 --e_layers 2 --d_layers 1 --attn prob --des 'Exp' --itr 5

从 scripts/ 四个脚本可以观察到复现实验的常见模式:

  • 短预测(pred_len ≤ 48)通常使用较短的seq_len(如 48/96),甚至单独用较小的factor(如 ETTh1 的--factor 3);
  • 长预测(pred_len ≥ 168)普遍使用seq_len = 720或 336,且label_len往往与seq_len或预测长度联动;
  • ETTh2 与 WTH 在长预测任务上倾向于加深网络(e_layers 3 --d_layers 2);
  • 全部脚本固定--attn prob,重复实验次数--itr 5,描述符--des 'Exp';
  • WTH 脚本(scripts/WTH.sh)展示了"不显式指定维度参数、完全依赖内置映射"的简洁用法。

八、评估指标与结果输出

测试阶段(见 exp/exp_informer.py)会计算并打印五个指标,其定义位于 utils/metrics.py:

  • MAE:平均绝对误差(np.mean(np.abs(pred-true)))
  • MSE:均方误差(np.mean((pred-true)**2))
  • RMSE:均方根误差(np.sqrt(MSE))
  • MAPE:平均绝对百分比误差
  • MSPE:均方百分比误差

测试结束后,pred.npy、true.npy与metrics.npy(依次保存[mae, mse, rmse, mape, mspe])会被写入./results/<setting>/目录;若开启--do_predict,还会额外生成real_prediction.npy(见 exp/exp_informer.py)。

九、常见问题(FAQ)

原 README 记录了一个高频报错的解决方案:

若遇到RuntimeError: The size of tensor a (98) must match the size of tensor b (96) at non-singleton dimension 1,请检查 torch 版本,或参考models/embed.py中TokenEmbedding的Conv1d的 circular padding 方式修改代码——因为不同 torch 版本中Conv1d的 circular padding 模式实现有变化。

对应的源码位置是 models/embed.py(TokenEmbedding)以及 models/encoder.py(ConvLayer)。两者都按 torch 版本条件设置 padding:

padding = 1 if torch.__version__>='1.5.0' else 2 self.tokenConv = nn.Conv1d(..., padding=padding, padding_mode='circular')

如果你的环境报出类似的张量尺寸不匹配错误,优先核对 torch 版本与这两处 padding 设置是否与当前版本一致。

十、引用与致谢

如果你的研究工作中使用了本仓库,建议引用论文。原 README 给出了两篇参考文献的 BibTeX 条目:

@article{haoyietal-informerEx-2023, author = {Haoyi Zhou and Jianxin Li and Shanghang Zhang and Shuai Zhang and Mengyi Yan and Hui Xiong}, title = {Expanding the prediction capacity in long sequence time-series forecasting}, journal = {Artificial Intelligence}, volume = {318}, pages = {103886}, year = {2023}, } @inproceedings{haoyietal-informer-2021, author = {Haoyi Zhou and Shanghang Zhang and Jieqi Peng and Shuai Zhang and Jianxin Li and Hui Xiong and Wancai Zhang}, title = {Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting}, booktitle = {The Thirty-Fifth {AAAI} Conference on Artificial Intelligence, {AAAI} 2021, Virtual Conference}, volume = {35}, number = {12}, pages = {11106--11115}, publisher = {{AAAI} Press}, year = {2021}, }

小结

Informer2020 仓库围绕"ProbSparse Attention + 自注意力蒸馏 + 生成式解码器"三件套,为长序列时序预测提供了一个完整、可复现、易扩展的 PyTorch 基准实现。从本文的梳理可以看到:原 README 提供的命令模板与参数表可以无缝对接到 main_informer.py 的参数解析逻辑;scripts/ 中每个.sh文件都是一组可直接运行的复现实验;而 models/attn.py 中的稀疏采样实现则从源码层面印证了 O(L log L) 复杂度的来源。上手时建议按"装环境 → 下数据 → 跑 scripts/ETTh1.sh → 对照参数表调参 → 开启--do_predict外推"的顺序进行,即可快速从复现走向自己的长序列预测实验。

  • 人工智能
  • 深度学习
  • 机器学习

【免费下载链接】Informer2020

The GitHub repository for the paper "Informer" accepted by AAAI 2021.

项目地址:https://gitcode.com/gh_mirrors/in/Informer2020
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

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

立即咨询