Informer:用于长序列预测的高效 Transformer
FreeGuideOnline
最新
2026-06-21
A(Q,K,V) = softmax(QK^T / √d_k) V
其中查询(Q)、键(K)、值(V)的序列长度均为 L。QK^T 的运算与存储复杂度为 O(L²),成为长序列预测的主要瓶颈。
研究人员发现,自注意力分布通常呈现**长尾稀疏性**:只有少数查询-键对贡献了主导注意力,大多数贡献可以忽略。因此,只需计算少数“重要”查询的注意力即可。
Informer 通过 **Kullback-Leibler (KL) 散度**来衡量每个查询的“稀疏度”:
M(q_i, K) = max_j { q_i k_j^T / √d_k } - 1/L_k ∑_j (q_i k_j^T / √d_k)
其中第一项是查询与所有键的最大相似度,第二项是算术平均。该度量值的统计含义是:若某个查询的注意力分布与均匀分布差异越大,则其越“活跃”,即承载的信息越多。
ProbSparse 自注意力随机采样部分键来计算近似稀疏度量,然后只选取稀疏度最高的前 `u = c·ln L_Q` 个查询来计算完整的注意力,其余查询则直接用其与所有键的平均值作为输出(即近似为均匀分布,不参与复杂的点积计算)。因此,每次查询-键的点积次数降为 `O(L ln L)`,空间复杂度也大幅降低。
### 3.2 自注意力蒸馏
标准 Transformer 编码器堆叠多层自注意力块,但序列长度保持不变,导致巨大的内存开销,尤其当 L 很大时。
Informer 在编码器每层之间加入**蒸馏操作**,通过一维卷积(Conv1D)和最大池化,将序列长度逐层减半。蒸馏公式如下:
X_{j+1}^t = MaxPool(ELU(Conv1d([X_j^t]_{AB})))
其中 `[·]_{AB}` 表示注意力块操作。这种方法强制模型聚焦于序列中的主导特征,同时构建一个层次化表示,有效减半序列长度,极大降低后续层的计算量及内存占用。
堆叠多个编码器层后,最终编码器的输出被连结为整个编码器的表征,传递给解码器。
### 3.3 生成式解码器
传统 Transformer 在预测长序列时,通常采用动态解码(如逐步生成下一个时间步,再将其拼接到输入中继续预测),这会累积误差且推理缓慢。
Informer 设计了一种**生成式解码架构**,可以直接一次前向生成整个预测序列(例如生成未来 168 个时间点)。
具体实现方式:
- 向解码器输入两部分:**起始标记序列**和**目标占位序列**。
- 起始标记序列:序列尾部截取已知部分(例如输入历史序列的后半段)。
- 目标占位序列:长度为预测长度的序列,全部填充为 0(或其他统一标记),同时配合掩码机制,使解码器在生成时只允许看到已经生成的部分,避免看到未来占位符。
- 解码器输入长度已知(例如历史序列 + 预测长度全是已知占位),经过一次前向传播,模型并行输出所有预测值,彻底抛弃逐步自回归。
生成式解码器因此极大提高了长序列预测的推理效率,并且有效缓解了误差累积。
## 4. Informer 架构详细
### 4.1 编码器(Encoder)
编码器接收历史输入序列 `X_en = {x_1, ..., x_Lx}`,经过多层处理,提取长程依赖。
每一层包含:
1. **ProbSparse 自注意力块**:基于稀疏查询的注意力计算,搭配残差连接和层归一化。
2. **蒸馏操作**:Conv1d + ELU + MaxPool,将序列长度减半,逐步压缩信息。
3. 必要时可多次堆叠,并在最后一层保留原始长度,与前面各层被蒸馏过的输出拼接,形成编码器输出。
### 4.2 解码器(Decoder)
解码器输入由两部分拼接构成:
X_de = {X_token, X_0}
- `X_token`:输入序列尾部长度 `L_token` 的真实值(已知上下文)。
- `X_0`:目标序列长度的占位符,全部用 0 填充。
解码器首先对输入加上位置编码(全局时间戳编码和局部位置编码均可)。接着通过多层自注意力块,但使用的是 **Masked ProbSparse 自注意力**,避免当前位置注意未来的占位符。
最后通过全连接层,将解码器输出映射为预测目标。
## 5. 训练与预测流程
Informer 采用经典的时间序列滚动窗口方式构造样本。例如,使用过去 96 个时间点预测未来 48 个点,窗口每次移动一个步长。
**损失函数**:通常使用均方误差损失(MSE)或平均绝对误差(MAE),对预测输出的所有时间步计算误差总和。
Loss = MSE(预测序列, 真实序列)
**评估指标**:MSE 和 MAE,也有采用平均绝对百分比误差(MAPE)等。
**训练细节**:
- 优化器:Adam,学习率可设为 1e-4 并逐步衰减。
- 批大小:根据长度调整,长序列预测任务通常使用较小的 batch size(如 32 或 16)。
- 早停机制:基于验证集损失,避免过拟合。
**推理**:
- 直接一次前向,得到所有预测步,无需自回归循环,推理速度远快于传统方法。
## 6. 实验表现对比
Informer 在多个公开长时序数据集上全面超越了其他模型。典型结果展示(以 MSE 为例,越低越好):
| 数据集 | 预测长度 | Transformer | Reformer | LogTrans | Informer |
|--------|----------|-------------|----------|----------|----------|
| ETT(电力) | 24 | 0.210 | 0.222 | 0.209 | **0.141** |
| ETT | 168 | 0.514 | 0.530 | 0.505 | **0.372** |
| Weather | 48 | 0.384 | 0.398 | 0.390 | **0.306** |
| ECL(耗电) | 336 | 1.001 | 0.995 | 0.976 | **0.567** |
不仅精度大幅提升,Informer 在训练和推理时间上也优于各对比模型,实现了效率与效果的双重突破。
## 7. 实践指南
### 7.1 环境与数据集准备
常用实验代码已开源(GitHub: zhouhaoyi/Informer2020)。您可克隆仓库并安装依赖:
```bash
git clone https://github.com/zhouhaoyi/Informer2020.git
cd Informer2020
pip install -r requirements.txt
支持的公开长时序数据集:
- ETT(电力变压器温度):含每小时、每15分钟粒度的多种数据。
- ECL(电力消耗负载):每个客户每小时用电量。
- Weather(气候):德国多个站点天气指标,10分钟级。
- 自定义 CSV 数据亦可,需符合时间列+多变量列的格式。
7.2 模型配置与运行
核心超参数在 main_informer.py 或 exp/exp_informer.py 中:
--model固定为informer--seq_len输入历史长度(如 96)--label_len解码器起始标记长度(通常设为输入长度的一半)--pred_len预测长度(如 24, 48, 168, 336, 720)--enc_in/--dec_in/--c_out输入/输出变量数--d_model模型维度(如 512)--n_heads注意力头数--e_layers编码器层数--d_layers解码器层数--factorProbSparse 采样因子(常用 5)--distil是否使用蒸馏,设置为--distil True
训练命令示例:
python -u main_informer.py --model informer --data ETTh1 --root_path ./data/ETT/ \
--data_path ETTh1.csv --features M --seq_len 96 --label_len 48 --pred_len 24 \
--e_layers 2 --d_layers 1 --attn prob --des 'Exp' --itr 1