把时序预测搬进频域:StemGNN 如何同时建模"序列间"和"序列内"

  • 关联论文:2103.07719

为什么重要

多变量时序预测的难处,在于要同时处理两种相关性:序列内——一条序列自己的时间结构(早高峰、日周期、季节性);序列间——不同序列的横向关联(相邻路段的车流、下游电站负载、两国疫情传播)。

2020 年前后的主流做法几乎都在"拼接":DCRNN、ST-GCN、GraphWaveNet 把路网拓扑喂给 GCN,再接 LSTM/GRU/TCN 处理时间维度。问题有三层——图和时间是两套表征靠接口对齐,不是数学上的统一;必须有先验图,电力、太阳能、心电、跨国疫情直接套不上;有了拓扑,边的定义也未必与预测任务相关。

StemGNN 提的是另一个范式:既然两半本事各自都有,为什么不在频域里合起来?论文原话——"To the best of our knowledge, StemGNN is the first work that represents both intra-series and inter-series correlations jointly in the spectral domain."

核心机制

Latent Correlation Layer:让图自己长出来。 把序列编码成向量,算出两两关联,直接把这个 N×N 的关联矩阵当邻接矩阵用。结论是:学出来的图比人画的图更好。COVID-19 案例里模型自发把 US/Canada/Mexico 聚成一群、China/Japan/Korea 聚成一群,地理邻接是数据说出来的,不是规定的。

StemGNN Block:GFT → DFT → 频域卷积 → IGFT。 一次图傅里叶变换把 N 条纠缠的序列正交分解成 N 条独立成分(解决"序列间"),再对每条做离散傅里叶变换,把时间模式转成频域卷积问题(解决"序列内"),然后用带 GLU 门控的 Spe-Seq Cell 在频域做 1D 卷积,最后变换回原空间。频域门控的直觉很顺:低频管趋势、高频管噪声,门控让网络自己学"这条频率我信多少"。

双输出:forecasting + backcasting。 借鉴 N-BEATS 的基展开,一个 block 两条分支:向前出未来预测,向后重构历史,用自编码式压力逼出有表达力的表征。

证据边界

摘要说 "nine public benchmarks",正文说九个数据集,附录才说十个(含 COVID-19)——口径要自己统一。

主结果不是全面领先。 Table 2 的 27 个单元格(9 数据集 × 3 指标)里,StemGNN 有 3 个不是最优:PEMS08 MAE 15.83 输给 DeepGLO 的 15.12;PEMS03 RMSE 21.64 输给 DeepState 的 20.21;Solar RMSE 0.07 输给 TCN 的 0.06。摘要的 "state-of-the-art on nine public benchmarks" 抹平了这三格。

"学图 > 先验图"取决于数据集。 消融里 PEMS07 换成人工先验拓扑只掉 0.014 MAE(2.144 → 2.158),几乎无损;但附录 E.2 的 METR-LA 上学图贡献可达 +8.98% MAE。真正大头在时间维:w/o Spe-Seq Cell 掉到 2.612(+22%)。正确说法是"频域时间建模是主要收益来源,学图在先验拓扑质量高的数据集上增量有限"。

聚合口径不可复算。 论文自述"MAE 平均提升 8.1%、RMSE 13.3%",但三种常见口径都复算不出(逐数据集均值 15.58%/5.32%,总和比 5.68%/0.15%,含 COVID 的 16.52%/7.21%)。论文没公开聚合口径,引用须标注"论文自述、口径未公开"。

疫情案例领先先扩后收。 7 天领先 N-BEATS 1.0 个点,14 天 1.4 个点,28 天 1.1 个点——不是单调缩小。

工程局限

  • 论文与官方代码差异很大。microsoft/StemGNN 全仓没有任何特征分解:graph_fft/get_laplacian 定义了但从未被调用,走 4 阶 Chebyshev 多项式滤波。论文口径的 O(N³) 特征分解,在代码里变成每次 forward 两次 N×N 稠密矩阵乘。
  • 显存墙在注意力张量,不在特征分解。[B,N,N] 注意力加 softmax/dropout 中间量按 O(B·N²) 增长,会先于 FLOPs 撞墙。单卡 24GB 上 N≤2000 且 batch≤32 较稳。
  • 官方实现多处与论文不同:注意力是加性标量投影(无点积、无 1/√d)、GRU 沿节点轴迭代取全部输出、整批共享一张图、softmax 后还有 p=0.5 的 dropout 把学到的边随机置零一半;Spe-Seq Cell 里没有 nn.Conv1d,GLU 用 nn.Linear;训练只优化 forecast MSE,backcasting 项在代码里不存在;两 block 输出是相加而非拼接。
  • 默认配置开箱即错三连:切分默认 7:2:1,论文 PEMS03/04/08 用 6:2:2;README 给的 --output_dir、--n_route、--validate_length 三个参数 argparse 里都不存在;COVID 按 README 配 28/28 窗口在 7:2:1 下验证集样本不足直接报错。
  • 环境陈旧:torch==1.7.1 / numpy==1.19.5,而 torch.rfft/torch.irfft 在 torch 1.8+ 已被移除,升级即崩;numpy>=1.24 删了 np.float。
  • 没有先验拓扑注入路径,想跑"学图 vs 先验图"对照必须自己改代码加 prior_W——偏偏这是决定"要不要用 StemGNN"的关键实验。
  • MAPE 口径会污染结论:单点误差上限被截断在 500%,真值为 0 时按 500% 计,且调用的是非 masked 版本。
  • 仓库没有 LICENSE 文件(raw URL 404,issue #27 就是为此开的),商用前必须自行确认授权。
  • 论文自己就承认:Conclusion 明写要研究近似方法,因为"directly applying eigenvalue decomposition is prohibitive for very large graphs"。

附:三个标题变体

  1. 把时序预测搬进频域:StemGNN 如何同时建模"序列间"和"序列内"
  2. 让图自己长出来:StemGNN 的频域统一建模与它的三处"不完美"
  3. 学出来的图更聪明,但更贵的代价——读 StemGNN 论文的正确姿势

附:小红书卡片文案

📡 时序预测冷知识

做多变量时序预测,主流做法是"拼接":图神经网络管序列之间的路网关系,LSTM/TCN 管时间上的周期。问题有两个——两套模块靠接口对齐,不是真正统一;必须先有路网拓扑,电力、太阳能、心电、跨国疫情这些场景直接套不上。

StemGNN 的解法很妙:干脆把整件事搬到频域。图傅里叶变换把 N 条纠缠的序列拆成 N 条独立成分(解决"序列间"),离散傅里叶变换再把每条的时间模式变成频率(解决"序列内"),两个正交变换串在一个 block 里端到端训。

最惊人的是"图自己长出来":不需要人给拓扑,模型自己算出的关联矩阵里,US/Canada/Mexico 自动聚成一堆,China/Japan/Korea 自动聚成一堆。

但别急着抄。它有三处不完美:① 27 个指标单元格里 3 个不是最优(PEMS08 就输给了 DeepGLO);② 论文说"MAE 平均提升 8.1%",三种口径都复算不出来;③ 官方代码和论文差得很远——没有特征分解,注意力还是加性标量投影,训练损失里连 backcasting 项都没有。

论文标题:Spectral Graph Neural Networks for Multivariate Time Series Forecasting(arXiv:2103.07719)

⚠️ 一句话建议:把它当"频域 + 图"的思想原型读,别当性能标杆读。