Crossformer:利用跨维度依赖关系的Transformer用于多变量时间序列预测(ICLR 2023)
这是Crossformer: 利用跨维度依赖关系的Transformer用于多变量时间序列预测的原始Pytorch实现。
Crossformer的关键点
1. 维度段嵌入(DSW)
图1. DSW嵌入。左:之前基于Transformer模型的嵌入方法:同一时间步不同维度的数据点被嵌入到一个向量中;右:Crossformer的DSW嵌入:在每个维度中,时间上相邻的点形成一个段进行嵌入。
2. 两阶段注意力(TSA)层
图2. TSA层。左:整体结构:2D向量数组通过跨时间阶段和跨维度阶段获得相应的依赖关系;中:在跨维度阶段直接使用MSA建立$D$到$D$的连接会导致$O(D^2)$的复杂度。右:跨维度阶段的路由机制:固定数量($c$)的"路由器"在维度间收集和分发信息。复杂度降低到$O(2cD) = O(D)$。
3. 分层编码器-解码器(HED)
图3. HED。编码器(左)使用TSA层和段合并来捕获不同尺度的依赖关系;解码器(右)通过在每个尺度上进行预测并将它们相加来做出最终预测。
环境要求
- Python 3.7.10
- numpy==1.20.3
- pandas==1.3.2
- torch==1.8.1
- einops==0.4.1
复现步骤
-
将用于实验的数据集放入
datasets/
文件夹。我们已经将ETTh1
和ETTm1
放入其中。WTH
和ECL
可以从https://github.com/zhouhaoyi/Informer2020 下载。ILI
和Traffic
可以从https://github.com/thuml/Autoformer 下载。请注意,我们在论文中使用的WTH
是来自Informer的12维数据集,而不是来自Autoformer的21维数据集。 -
要在ETTh1数据集上获得$T=168, \tau = 24, L_{seg} = 6$的Crossformer结果,运行:
python main_crossformer.py --data ETTh1 --in_len 168 --out_len 24 --seg_len 6 --itr 1
模型将自动训练和测试。训练好的模型将保存在checkpoints/
文件夹中,评估指标将保存在results/
文件夹中。
- 你也可以通过运行以下命令来评估已训练的模型:
python eval_crossformer.py --checkpoint_root ./checkpoints --setting_name Crossformer_ETTh1_il168_ol24_sl6_win2_fa10_dm256_nh4_el3_itr0
- 要复现论文中的所有结果,运行以下脚本以获得相应结果:
bash scripts/ETTh1.sh
bash scripts/ETTm1.sh
bash scripts/WTH.sh
bash scripts/ECL.sh
bash scripts/ILI.sh
bash scripts/Traffic.sh
自定义使用
我们使用AirQuality数据集来展示如何使用自己的数据训练和评估Crossformer。
- 将
AirQualityUCI.csv
数据集修改为以下格式,其中第一列是日期(或者你可以将第一列留空),其他13列是要预测的多变量时间序列。并将修改后的文件放入datasets/
文件夹。
图4. 自定义数据集的示例。
- 这是一个每小时采样的13维数据集。我们将使用过去一周(168小时)的数据来预测下一天(24小时),段长度设置为6。因此,我们需要运行:
python main_crossformer.py --data AirQuality --data_path AirQualityUCI.csv --data_dim 13 --in_len 168 --out_len 24 --seg_len 6
- 我们可以通过运行以下命令来评估训练好的模型:
python eval_crossformer.py --setting_name Crossformer_AirQuality_il168_ol24_sl6_win2_fa10_dm256_nh4_el3_itr0 --save_pred
模型将被评估,预测和真实序列将被保存在results/Crossformer_AirQuality_il168_ol24_sl6_win2_fa10_dm256_nh4_el3_itr0
中
main_crossformer
是我们模型的入口点,还有其他可调参数。以下是它们的详细说明:
参数名称 | 参数描述 |
---|---|
data | 数据集名称 |
root_path | 数据文件的根路径(默认为 ./datasets/ ) |
data_path | 数据文件名(默认为 ETTh1.csv ) |
data_split | 训练/验证/测试集划分,可以是比例(如 0.7,0.1,0.2 )或具体数量(如 16800,2880,2880 ),(默认为 0.7,0.1,0.2 ) |
checkpoints | 存储训练模型的位置(默认为 ./checkpoints/ ) |
in_len | 输入/历史序列长度,即论文中的 $T$(默认为 96) |
out_len | 输出/未来序列长度,即论文中的 $\tau$(默认为 24) |
seg_len | DSW 嵌入中每个段的长度,即论文中的 $L_{seg}$(默认为 6) |
win_size | HED 段合并中合并相邻段的数量(默认为 2) |
factor | TSA 的跨维度阶段中路由器的数量,即论文中的 $c$(默认为 10) |
data_dim | MTS 数据的维度数,即论文中的 $D$(ETTh 和 ETTm 默认为 7) |
d_model | 隐藏状态的维度,即论文中的 $d_{model}$(默认为 256) |
d_ff | MSA 中 MLP 的维度(默认为 512) |
n_heads | MSA 中的头数(默认为 4) |
e_layers | 编码器层数,即论文中的 $N$(默认为 3) |
dropout | 随机失活概率(默认为 0.2) |
num_workers | 数据加载器的工作线程数(默认为 0) |
batch_size | 训练和测试的批量大小(默认为 32) |
train_epochs | 训练轮数(默认为 20) |
patience | 早停耐心值(默认为 3) |
learning_rate | 优化器的初始学习率(默认为 1e-4) |
lradj | 调整学习率的方式(默认为 type1 ) |
itr | 实验次数(默认为 1) |
save_pred | 是否保存预测结果。如果为 True,预测结果将以 numpy 数组形式保存在 results 文件夹中。对于 $D$ 较大的数据集,这将耗费大量时间和内存。(默认为 False ) |
use_gpu | 是否使用 GPU(默认为 True ) |
gpu | 用于训练和推理的 GPU 编号(默认为 0) |
use_multi_gpu | 是否使用多个 GPU(默认为 False ) |
devices | 多个 GPU 的设备 ID(默认为 0,1,2,3 ) |
引用
如果您在研究中发现本仓库有用,请引用:
@inproceedings{
zhang2023crossformer,
title={Crossformer: Transformer Utilizing Cross-Dimension Dependency for Multivariate Time Series Forecasting},
author={Yunhao Zhang and Junchi Yan},
booktitle={International Conference on Learning Representations},
year={2023},
}
致谢
我们感谢以下工作为时间序列预测提供的宝贵代码和数据:
https://github.com/zhouhaoyi/Informer2020
https://github.com/thuml/Autoformer
https://github.com/alipay/Pyraformer
https://github.com/MAZiqing/FEDformer
以下两个视觉 Transformer 工作也启发了我们的 DSW 嵌入和 HED 设计: