时空融合图神经网络STFGNN:三图融合精准预测交通流
2026/9/16 1:52:56 网站建设 项目流程

这篇论文我前后读了三遍。第一遍图新鲜——"时空融合"这个词在交通预测里都快被说烂了;第二遍是为了复现,一层一层抠图和网络的细节;第三遍把它跟同期的STSGCN、AGCRN、Graph WaveNet放在一起比,才真正看懂它到底在"图怎么构造"这件事上下了多少功夫。论文是Mengzhang Li和Zhanxing Zhu发在AAAI 2021上的工作,模型叫STFGNN(Spatial-Temporal Fusion Graph Neural Networks for Traffic Flow Forecasting),核心主张一句话就能说清:交通流预测不能只用路网拓扑这一张图,还得把"时间序列长得像"的节点连起来,再让网络自己学一张数据驱动图,最后三图融合统一做图卷积。如果你正在入门时空图神经网络,或者被"空间依赖和时间依赖到底怎么揉在一起"这个问题卡了很久,这篇笔记应该能帮你把主干逻辑顺一遍,顺便省掉我踩过的那些坑。

1. 为什么需要时空融合:从交通预测的痛点说起

1.1 交通流预测到底难在哪

交通流预测的任务描述起来很简单:路网上分布着N个检测器,每个检测器每隔5分钟记录一次流量/速度/占有率,我们要用过去一小时(12个时间步)的观测,预测未来一小时(12个时间步)的数值。难就难在这个问题天然带着"双重耦合":空间上,一个路段的拥堵会顺着路网传导到下一条路,但传导的强度和速度都随时间变化;时间上,早晚高峰有明显的周期性,可突发事件、天气、信号灯配时调整又会在局部破坏这种规律。

生活里可以这么类比:交通流像一群人挤公交,既有固定班次的节律,也有今天堵车、明天临时改线这种说不准的事。你要预测的不是某一个人挪到哪儿,而是整个站点的人群密度怎么变化。这个"人群密度"在空间上是连片的、在时间上是延续的,任何一个视角只看一半都做不准。

1.2 已有GNN方案的共同短板

在STFGNN之前,基于图神经网络的交通预测工作已经不少。DCRNN把扩散卷积搬过来,在固定的路网距离图上做序列建模;STGCN用切比雪夫多项式近似图卷积,配上时间卷积做骨架;Graph WaveNet往前迈了一步,在固定图之外叠加了一个通过节点嵌入学出来的自适应图。这些工作有一个共同的隐含假设:节点之间的依赖关系主要由"路网距离"决定,所以图要么直接用道路距离/邻接关系构造,要么在端到端训练里自己硬学。

这个假设在真实数据里并不总能成立。举个例子:两条平行的快速路,物理上隔了十几公里,路网上完全不直接相连,但因为它们承担着相同的通勤功能,早晚高峰的拥塞曲线几乎同步出现,相关系数能到0.8以上。反过来,路网上紧挨着的两个检测器,一个在辅路一个在主路,流量模式可能天差地别。也就是说,空间相近不等于状态相似,状态相似也不一定要空间相近。只用一张固定空间图,等于丢掉了一大块非常有价值的"功能相似性"信息。

1.3 STFGNN的核心主张:让"长得像"的节点也能互相学习

STFGNN针对这个短板提出了一个很直接的办法:把图从一张变成三张。第一张是常规的空间图,用路网距离定义邻居;第二张是时间图,用动态时间规整(DTW)计算每个节点历史序列之间的形状相似度,然后把最像的K个节点连起来;第三张是数据驱动图,节点嵌入向量端到端学习,相似度由训练过程自己决定。这三张图做完归一化后加在一起,形成一张"时空融合图",后续所有图卷积都在这张融合图上做。

这个设计的聪明之处在于,它没有抛弃任何一类先验知识。空间图是物理先验,告诉模型"堵车会沿着路网传";时间图是观测先验,告诉模型"这两个节点历史上同步波动,值得互相参考";数据驱动图是学习先验,告诉模型"前面的先验不够用时,你自己找补"。三者叠加,模型既能利用显式的领域知识,又保留了从数据里发现问题结构的能力。后面我会把这三张图各自的构建细节和容易踩的坑展开讲。

2. 三张图是怎么构建的

2.1 空间图:路网距离加阈值高斯核

空间图的构建在交通预测里已经很成熟。这里的核心距离不是欧氏直线距离,而是沿着道路网络算出来的通行距离,因为路网上的传播只能沿着路段走,跨过一条河或者隔着一座山的两点直线距离再近也不可能有直接的车流交互。论文里用的是带阈值的高斯核:

A_s[i, j] = exp(-d(i, j)^2 / σ^2),当 d(i, j) ≤ 阈值;否则为0。

σ一般取所有节点对距离的标准差或者经过交叉验证挑选,阈值的作用是让邻接矩阵变稀疏,避免每个节点连到全图。实践里这个阈值要结合路网密度来调,我的经验是让每个节点平均保留5到15个邻居比较合适,太密了图卷积退化成全局平均,太稀了信息传不远。构造完之后还要做对称归一化,即 D^{-1/2} A_s D^{-1/2},这一步后面在数值稳定性上很关键。

2.2 时间图:DTW加K近邻,还有防泄漏的部分图设计

时间图是STFGNN最核心的贡献,也是大多数读者第一眼会觉得"这不是很简单吗"、但实际实现时坑最多的地方。

为什么不用皮尔逊相关系数来定义时间相似性?因为真实的交通序列之间存在时间偏移。A路段早高峰8:00开始,B路段因为离高速入口更远,早高峰8:15才到峰值。两条曲线的形状几乎一模一样,只是错开了15分钟,皮尔逊相关系数对这种纯平移极其敏感,可能给出很低的分数。而DTW(动态时间规整)通过动态规划允许序列在时间轴上伸缩对齐,专门解决"形状像但相位不对齐"的问题。这个差异在交通数据里是真实存在的,不是理论上的吹毛求疵。

DTW的计算公式很朴素:定义代价矩阵 M[i, j] = |x_i - y_j|,然后从左上角到右下角找一条累积代价最小的路径,路径的累积代价就是两个序列的DTW距离。距离越小,序列越相似。有了距离矩阵,时间图的构建就是对每个节点取DTW距离最小的K个节点连边。

这里有一个极其重要的细节:部分时间图(Partial Temporal Graph)。如果你拿整条时间序列(包括测试集区间)去算DTW,那么在评估阶段,图结构里已经包含了未来数据的形状信息,模型等于提前"偷看"了答案,实验结果会虚高。论文的处理方式是用一个历史的、确定在预测窗口之前的时间片段来构图,只让训练阶段的观测影响到图结构。这一点很多人复现时会忽略,但它直接决定你实验结论的可靠性,后面我还会单独展开讲。

2.3 数据驱动图:让网络自己找补隐藏依赖

第三张图不再依赖任何人工定义的距离,而是给每个节点分配一个可学习的嵌入向量 e_i ∈ R^d,d一般取16到32维。所有节点的嵌入拼成矩阵 E ∈ R^{N×d},然后算 E E^T 得到节点两两的相似度,经过 ReLU 去掉负值、再对每一行做 Softmax 归一化,就得到一张数据驱动图的邻接矩阵:

A_d = Softmax(ReLU(E E^T))

这个设计的思路和Graph WaveNet的adaptive graph一脉相承,但STFGNN把它放进了"三图融合"的框架里,作用更明确:空间图和时间图都是根据我们已有的领域知识构造的,而真实数据里总有一些依赖关系是领域知识覆盖不到的——比如两个路段因为同一个大型活动周期性同时拥堵,这既不是路网邻居,历史序列形状也可能因为样本太少而没有高相似度。数据驱动图就是给模型留的一个"自选邻居"的通道,损失函数会通过反向传播告诉嵌入向量:哪些节点对预测有帮助,你们就把相似度调高。

2.4 融合:把三张图合成一张

三张图构造好之后,融合方式非常直接:

A_f = A_s + A_t + A_d

然后对 A_f 做行归一化(或者对称归一化加自环)就得到最终用于图卷积的邻接矩阵。这里的取舍值得停下来想一想:为什么不分别做三个图卷积,再把特征拼接或相加?分开做看似更灵活,实际上是两套独立的传播路径,参数翻倍不说,空间邻居和时间相似邻居的信息在特征空间里是各走各的,模型很难自动对齐这两类信息。融合成一张图之后,一次图卷积就能同时从"物理邻居"和"状态相似邻居"聚合信息,相当于把每个节点的邻域扩展成了"空间邻居 ∪ 时间相似邻居 ∪ 学习到的隐藏邻居"的并集,参数共享,计算量也降下来了。

我在实际复现里还试过给三张图加可学习的权重,比如 A_f = α A_s + β A_t + γ A_d,α、β、γ让模型自己学。但测下来收益很有限,反而多了一组需要调初始值的参数。论文直接等权相加,其实是够用的,说明这个模块对权重不那么敏感,真正影响性能的还是在图的质量和网络结构上。

3. 网络结构与前向计算拆解

3.1 整体流程:编码、堆叠、输出

STFGNN的整体结构可以看成一个"编码器-堆叠-输出"的三段式管道。输入是 X ∈ R^{B×N×T×C},T是历史窗口长度(通常12),C是特征维度(交通流量、速度等,一般还会拼上时间编码,比如一天中的第几个5分钟、一周中的第几天)。先经过一个输入嵌入层把原始特征映射到隐藏维度,然后堆叠L个时空融合卷积模块,最后通过一个输出模块把隐藏特征映射到未来12个时间步的预测值。

每一个时空融合卷积模块内部是典型的两分支设计:一个分支沿着时间维度做多尺度门控卷积,专门捕捉时间依赖;另一个分支在融合图上做图卷积,负责空间和状态相似性传播。两个分支的输出通过相加或1×1卷积融合,再接残差连接保证梯度顺畅。把时间建模和空间建模做成并行分支而不是串行接起来,是这类模型的一个共同选择,好处是时间卷积和空间传播互不阻塞,信息在每个层内都能充分交互。

3.2 时间分支:多尺度门控卷积

时间分支用的是门控卷积(Gated Linear Unit,GLU),公式是:

y = tanh(W_1 * x + b_1) ⊙ sigmoid(W_2 * x + b_2)

前一项提取特征,后一项充当门控,决定哪些信息值得放行。如果只有这一个卷积核,那每个模块只能看到固定长度的时间上下文。STFGNN在这里做了一点很实用的改动——多尺度并行:同时用多个不同大小的卷积核(论文里我记得是1、2、3这几个尺寸)在时间维上做卷积,然后把结果拼起来再过一层1×1卷积融合。卷积核为1的分支看到的是瞬间的突变,核为3的分支能看到更长一点的趋势,两者叠加之后,模型对"突然拥堵"和"持续缓行"这两种时间尺度都能响应。用一个简单的代码片段大概就是这样:

class MultiScaleGatedConv(nn.Module): def __init__(self, c_in, c_out, kernels=(1, 2, 3)): super().__init__() self.convs = nn.ModuleList([ nn.Conv2d(c_in, c_out * 2, kernel_size=(k, 1), padding=(k // 2, 0), bias=False) for k in kernels ]) self.merge = nn.Conv2d(c_out * len(kernels), c_out, 1) def forward(self, x): out = [] for conv in self.convs: h = conv(x) # [B, 2*C_out, N, T] a, b = h.chunk(2, dim=1) out.append(torch.tanh(a) * torch.sigmoid(b)) return self.merge(torch.cat(out, dim=1))

这段代码里的 padding 要尤其注意。卷积核是奇数时 padding=k//2 能保证时间长度不变,但如果核是偶数,左右非对称的 padding 会引入相位偏移,对短序列影响很直接。我建议统一用奇数核(1、3、5),省心。

3.3 空间分支:融合图卷积

空间分支在融合图 A_f 上做图卷积。论文采用切比雪夫多项式近似,也就是用一个K阶多项式展开来代替完整的谱图卷积,避免对拉普拉斯矩阵做昂贵的特征分解。K阶的好处是每个节点能聚合K跳之内的邻居信息,配合堆叠多个模块,感受野会进一步扩大。一阶近似(GCN风格)也能跑,但高阶往往在交通这种长程传播明显的问题上效果更好。

图卷积之前必须做归一化。我用的流程是:先给 A_f 加单位阵(自环),再做对称归一化 D^{-1/2} A_f D^{-1/2},然后才喂给卷积算子。不做归一化,多层堆叠之后特征幅度会指数级膨胀或者收缩,训练直接崩。这个细节我在第一次复现时就栽过跟头,后面在踩坑章节里会细说。

3.4 输出层设计:双分支融合

预测输出也有一个值得记下来的设计:输出模块不是简单地把最后一层特征过一遍卷积就完事,而是走了两支——一支从堆叠后的深层特征生成预测,另一支从较早的、接近输入的特征直接映射出预测,最后把两支预测加权合并。这么做本质上是给"深层抽象"配了一条"原始信息"的捷径。

交通流量有很强的自相关性,下一时刻的值大概率接近当前时刻的值,这种"延续性"信息在深层特征里反复非线性变换后可能被削弱。保留一条从输入直接到输出的映射通道,相当于告诉模型:别光顾着学复杂模式,先把最简单也最值钱的延续性保住。实际测下来,这个输出结构比单分支稳定,尤其是预测前几个时间步(15到30分钟)时,误差明显更小。

3.5 训练配置与损失

训练方面,STFGNN用的是L1损失(MAE),而没有选L2。理由很实际:流量数据的尖峰和异常值不少,L2会把巨大误差放大,模型被迫去拟合那些本身不可预测的极端事件,反而损害常规时段的精度;L1对离群值更鲁棒,同时它和评测指标MAE是对齐的。优化器用Adam,初始学习率在0.001到0.005这个量级,配合按验证集损失衰减的调度器,再加一点梯度裁剪防止图卷积偶发的数值爆炸。批次大小一般取32或64,训练集上的归一化参数(均值和标准差)必须在训练集上统计,验证集和测试集沿用同一套,不要把全量数据的统计量掺进来。

4. 实验设计与效果解读

4.1 数据集与评价标准

STFGNN的实验在四个公开交通数据集上做的,这套数据集也是这个领域事实上的标准测试平台,基本参数我整理在下面:

数据集传感器数时间跨度采样间隔样本数
METR-LA2072012年3月-6月5分钟34272
PEMS-BAY3252017年1月-5月5分钟52116
PEMS-D43072018年1月-2月5分钟16992
PEMS-D81702016年7月-8月5分钟17856

前两个数据集偏高速公路和城市快速路,后两个来自加州PeMS系统,覆盖范围更广、周期性更强。评价指标是交通预测通用的三个:MAE(平均绝对误差)、RMSE(均方根误差)、MAPE(平均绝对百分比误差),全部是越低越好。实验协议是"用过去12步预测未来12步",报告时既可以分3、6、9、12步看,也可以对整个预测窗口求平均。

4.2 对比基线与整体结论

论文的对比基线覆盖得很全:传统方法有历史均值HA和ARIMA,深度学习方法有FC-LSTM、STGCN、DCRNN、Graph WaveNet、ASTGCN、GMAN、STSGCN、AGCRN等,基本把当时最有代表性的时空GNN都拉进来了。整体结论是:STFGNN在PEMS-D4和PEMS-D8上取得了明显的领先,在METR-LA和PEMS-BAY上基本和最强基线打平或者略优。

我记得METR-LA上的MAE能做到2.8左右、PEMS-BAY上到1.36左右这个量级,相比Graph WaveNet和STSGCN有小幅但一致的提升。这里有个值得注意的规律:时间图带来的增益在PEMS数据集上更明显。原因是PEMS数据覆盖的快速路网有很强的通勤节律,不同路段之间"功能相似"的现象比METR-LA这种城市混合路网更突出,DTW能把这种隐性同步关系挖出来,而单纯靠路网距离的空间图做不到。

4.3 消融实验看各模块贡献

消融实验是理解这套方法的关键。把时间图拿掉,性能下跌最明显,尤其是PEMS数据集——这验证了"状态相似性"是独立于"空间邻近性"的一类有效信息,而且贡献相当大。把数据驱动图拿掉,性能有小幅但稳定的下跌,说明嵌入学出来的隐藏依赖确实能在固定图之外补充信息,只是依赖强度不如手工构图的先验。把多尺度时间卷积换成单一尺度,中短期预测(15到30分钟)损失最明显,印证了多尺度并行对"短时突变"的捕捉能力。

还有一个很值得做的ablation:把DTW换成皮尔逊相关系数来定义时间图。这组对比我没有在论文原文里看到特别大篇幅的讨论,但按我对交通序列的理解,结果大概率是DTW更优,因为真实数据里普遍存在时间偏移,皮尔逊系数对这种偏移很敏感。如果你自己复现,强烈建议把这组实验加上,它能把"为什么非要用DTW"这个问题回答得明明白白。

4.4 结果里值得注意的三个细节

第一,论文报告的往往是整个预测窗口的平均指标,但分horizon看,各模块贡献并不均匀。短期(3到6步)预测主要靠多尺度卷积和时间图里的近期相似节点,长期(9到12步)预测则更依赖空间图的远端传播和周期信息。第二,时间图本质上是一种"协同过滤"式的先验——它让信息在历史行为相似的节点之间流动,这和推荐系统里"相似用户互相借鉴"的思路同构,理解成"物品与物品的协同过滤"会更通透。第三,数据驱动图的初始化和训练稳定性密切相关,随机种子不同,最终结果可能有0.05个MAE量级的波动,复现时建议固定种子并多次取平均。

5. 复现与实操:我踩过的坑

5.1 DTW太慢怎么办

DTW的时间复杂度是 O(L^2)(L是序列长度),对N个节点要算 N(N-1)/2 对,如果直接拿整段训练集去算,207个节点的METR-LA都能让你等到怀疑人生。我验证过N=207、L=288(一天)时,用纯Python的双重循环加fastdtw,大概要跑十几分钟,N到325时就更久。实际可行的方案有三个:第一,只用一段有代表性的历史窗口(比如训练集最后7天)来构图,既能刻画典型模式,又把计算量降了一个数量级;第二,用fastdtw里的radius参数限制搜索路径宽度,速度提升明显且精度损失很小;第三,节点对之间没有依赖关系,直接multiprocessing并行。代码大致长这样:

from fastdtw import fastdtw import numpy as np def build_temporal_graph(hist, k=10): # hist: [N, window] 已做z-score标准化,window是用于构图的历史片段长度 N, L = hist.shape dist = np.full((N, N), np.inf) for i in range(N): for j in range(i + 1, N): d, _ = fastdtw(hist[i], hist[j], radius=5) dist[i, j] = dist[j, i] = d / L # 按路径长度归一化 adj = np.zeros((N, N)) for i in range(N): idx = np.argsort(dist[i])[:k] adj[i, idx] = 1.0 return adj

把DTW距离除以序列长度是个容易被忽略的细节,不然长序列算出来的累积距离天然偏大,K近邻选择会失衡。

5.2 数据泄漏是最容易犯的错

这个坑值得反复强调。时间图的"部分图"设计不是为了炫技,而是为了守住因果性。如果你在整条时间序列(包含测试段)上算DTW,那么测试时刻的图结构里已经混入了未来数据的形状信息,评估结果会被系统性高估。更隐蔽的泄漏是数据标准化:用全量数据的均值和方差做z-score,等于把未来分布信息引入了训练。正确的做法是只用训练段统计归一化参数,再应用到验证和测试段。

还有一个实际部署层面的理解:真实场景里没有"测试段"这个概念,但图也会过期。道路改造、信号灯调整、新的商业区开业,都会让节点间的时间相似性发生变化。我的做法是做滚动重算——每两周或每个月,用最新积累的历史数据重新生成时间图,模型结构保持不变,只更新图结构。这个操作在论文里没有展开讲,但放到生产环境里基本是必需的。

5.3 图归一化与数值稳定

图卷积的数值稳定性问题在第一次复现时几乎一定会遇到。典型现象是训练几步之后loss突然变Nan,或者验证集表现完全不动。排查顺序一般是:先检查 A_f 有没有自环、行和是否为0、归一化后特征值是否过大;再确认切比雪夫多项式展开里用到的特征值缩放是否做了(通常要除以最大特征值的一半);最后看梯度裁剪有没有加上。另一个细节是构造空间图时 exp(-d^2/σ^2) 在d很大时下溢到0没问题,但距离矩阵里如果混入inf,K近邻和归一化都会出错,构图前先把inf和nan清理掉。

5.4 训练相关:归一化、缺失值、评价口径

数据预处理上,缺失值不能直接填0,流量缺失填0会让模型学到"这个节点经常突然归零"的假规律。一般用线性插值或者前一天同时刻的值填充,再整体做z-score。评价口径上,如果你拿论文报告的MAE对比自己的复现,一定要确认两个细节:一是MAE是在归一化空间算的还是反归一化后算的,两者数值完全不同;二是报告的是全horizon平均还是某个单步。这两个口径对不上,任何对比都没有意义。

我把踩过的比较典型的问题整理成一张速查表:

现象可能原因处理方式
训练loss变Nan图未归一化、学习率过大加自环+对称归一化、降lr、梯度裁剪
DTW构图极慢序列过长或未用radius截取历史窗口、fastdtw加radius
验证集指标虚高构图或归一化混入未来信息只用训练段统计量、用部分时间图
时间序列错位预测窗口对齐错误逐条可视化 input/label 对齐
MAPE爆炸真实值接近0导致百分比失真对低流量样本单独筛选或改用加权MAPE

6. 个人思考:这套方法的价值与边界

6.1 贡献的本质:把"相似性先验"引入图结构

如果让我提炼STFGNN最值得借鉴的地方,不是它那几层卷积模块,而是图结构的构建哲学。它把三类知识来源——物理结构(空间图)、历史观测(时间图)、学习信号(数据驱动图)——明确地拆开,再通过简单的加法融合成一个统一的计算图。这个"多先验融合"的思路比某一层的网络设计重要得多,因为它直接决定了信息传播的路径。后来的PDFormer、STAEformer等一批工作,虽然网络结构五花八门,但或多或少都在沿着"构造更丰富图结构"这条路往前走。

6.2 局限:静态图、计算成本、外因缺失

这套方法也有明显的边界。第一,三张图都是静态的,空间图和时间图一旦构造好就不再变化,而真实的交通依赖关系是时变的,早晚高峰期间的依赖强度和白天的依赖强度并不一样,静态图表达不了这种细粒度变化。第二,DTW构图的计算成本是O(N^2)对序列,换到大城市级的路网(节点数上十万)会非常吃力,邻接矩阵本身的内存占用也是O(N^2)。第三,模型完全依赖历史数据,没有把天气、事故、节假日这类外生因素接进来,在事件驱动的异常场景下预测能力会明显下降。第四,模型对新增节点的适应能力一般,换一套路网或者加一批传感器,图要重建、模型要重新训练。

6.3 可以怎么迁移:电网、水位、人群密度、工业传感

"多图融合 + 相似性构图"这套框架的适用范围远超交通。电网负荷预测里,不同变电站的负荷曲线也存在"空间相邻但形态不同"和"空间很远但形态趋同"的双重结构,完全可以直接套用时间图+空间图的组合。城市水务里的管网压力、商场或地铁站的人群密度、工业场景里的振动传感器和温控传感器,只要满足"多个传感器节点+时间序列+可以定义某种邻居关系"三个条件,就可以把STFGNN的构图思路拿过来复用。迁移时最需要改的是空间图的定义,别的领域的"空间"可能是电气距离、地理距离或者干脆是业务流程上的逻辑距离,需要根据业务语义重新构造。

我个人的体会是,这一类时空GNN项目里,真正决定效果上限的往往不是网络层数或卷积方式,而是图的质量。STFGNN把"图"从路网距离的单一视角解放出来,这件事带来的启发比模型本身的性能数字更持久。如果你也在做类似的多传感器时序预测,建议先别急着换网络结构,把你手上数据的节点对两两画出来看看,哪些节点在时间上高度同步却在空间上毫不相干——如果能找到这样的例子,你大概率就找到了提升模型的关键。论文配了公开代码,拿METR-LA跑通一遍,把三张图可视化出来,那种"原来它们是这么连起来的"的感觉,比读十遍论文都管用。

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

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

立即咨询