STGCN时空图卷积网络:交通预测经典模型深度解析

发布时间:2026/9/15 12:39:04
STGCN时空图卷积网络:交通预测经典模型深度解析 我大概是三年前因为要做城市路况预测被导师甩了一篇论文过来Spatio-Temporal Graph Convolutional Networks: A Deep Learning Framework for Traffic Forecasting。当时我对图神经网络的理解还停留在“好像有人用GCN做推荐系统”看到标题里的Deep Learning和Traffic Forecasting隐约觉得这就是我要找的方向。真正把它啃下来之后我才意识到这篇2018年发在IJCAI上的工作几乎成了后来所有时空图模型绕不开的起点——Graph WaveNet、AGCRN、STSGCN甚至现在火得一塌糊涂的时空Transformer很多思路都能在STGCN里找到影子。这篇笔记我不会只给你把公式抄一遍而是把论文的核心动机、三个核心组件图卷积、门控时间卷积、ST-Conv Block拆开揉碎再结合我自己复现时的体验讲清楚它为什么有效、哪里容易踩坑、以及现在回头看有哪些设计仍然值得借鉴。如果你正在做交通流量、速度或出行时间预测或者刚接触时空图网络这篇文章应该能帮你少走不少弯路。1. 交通预测这个问题的本质一个时空耦合的图回归问题1.1 问题定义路网不是网格传感器不是像素先看STGCN怎么定义任务的。交通预测的典型设定是你把一个城市或一条高速路网抽象成一张图 G(V, E)V是传感器节点E是节点之间的道路连接。每个传感器每隔一段时间通常是5分钟上报一个数值比如平均车速、车流量或道路占用率。你现在手里有过去M个时间步的观测 X^(t-M1), ..., X^(t)希望预测未来H个时间步的路况 Y。这里有两个关键约束。第一时间粒度是固定的5分钟一个点预测15分钟就是3步、30分钟就是6步、60分钟就是12步步数越多误差越大。第二空间结构是非欧几里得的路网不是图片那种规则网格你不能把传感器数据直接拼成一张矩形矩阵扔给标准卷积神经网络。一个传感器附近的邻居是拓扑意义上的“邻居”而不是图像里上下左右那种网格邻居。这个直觉是理解STGCN的起点要预测某条路未来的速度你需要重点考虑它周边几条相连路段的状态而不是全城两三百个传感器一概而论。论文把预测目标归结为一个学习函数 f输入是历史观测和图的邻接关系输出是未来H步的预测值。整个过程是一个典型的监督回归问题训练时用真实观测和预测值的差异作为损失。听起来不复杂但难点全在“怎么建模图结构”和“怎么建模时间依赖”这两件事上。1.2 传统方法的瓶颈线性假设和结构化输入的缺失如果你去翻STGCN论文的实验对比表会发现基线模型排了一长串HA、ARIMA、VAR、SVR、FC-LSTM。这些模型其实代表了三个时代的困境。ARIMA和VAR这类统计方法的核心假设是线性依赖它们可以捕捉时间序列里的自相关和交叉相关但交通数据里有明显的非线性突变比如事故导致的迅速拥堵、早高峰的突发流量这些用线性模型很难描述。SVR这类机器学习方法能拟合非线性但需要人工设计大量特征而且当传感器数量扩展到几百上千个时特征工程几乎不可维护。FC-LSTM这类循环神经网络把问题往前推了一大步它能自动学习时间依赖也不再需要对道路特征做手工设计。但FC-LSTM有一个致命问题它把路网上所有传感器当成一个长向量展开输入到LSTM的每个时间步里。这相当于彻底丢掉了“哪些传感器靠得近、哪些路段直接相连”这个信息。打个比方你在全城所有路口的传感器数据拼成一个1D向量LSTM只能学到一个全连接的隐层它认为每个节点和另外299个节点都有同等关系这显然不符合交通传播的物理规律。所以STGCN作者的核心洞察是交通预测本质上是一个发生在图结构数据上的时空序列预测问题。空间维度必须用能感知拓扑关系的模型时间维度需要高效的序列建模两者缺一不可。1.3 为什么选择图卷积而不是别的空间模型2017年前后已经有了不少图上的方法比如GraphSAGE、GAT图注意力网络也有DCRNN这类把扩散过程类比成图上卷积的工作。STGCN选择图卷积GCN而不是图注意力有一个很实际的原因计算效率与确定性。GAT需要在每个注意力头上计算节点之间的注意力权重训练开销更大而且注意力权重解释性并不如邻接矩阵来得直接。GCN的做法更“硬核”直接用预定义的邻接矩阵做消息传递一层图卷积就是一次邻居聚合堆叠多层就得到多跳邻居的信息。对于交通路网这种结构相对稳定的场景固定的拓扑先验已经足够强不需要模型再去学一个attention来发现邻居关系。这也是STGCN能做到轻量、快速训练的原因之一。2. STGCN模型架构拆解三明治结构的ST-Conv Block2.1 整体框架两块ST-Conv加一个输出层STGCN的总体结构用一句话概括输入先经过两个堆叠的ST-Conv Block再接一个全连接输出层得到未来H步的预测结果。每个ST-Conv Block内部是三明治结构时间门控卷积 - 空间图卷积 - 时间门控卷积并且保留了残差连接。为什么是“时间-空间-时间”的顺序而不是反过来我的理解是这样第一层时间卷积相当于对每个节点单独做一次特征变换和时间窗口内的去噪它先让每个传感器节点自己的历史数据形成一个更有表达力的特征表示。然后空间图卷积让相邻传感器之间交换信息——这一步才是真正把路网的拓扑结构用起来的地方。最后再叠一层时间卷积把经过空间传播后的信息在时间维度上重新整合。如果你把输入想象成一个三维张量维度分别是时间步、节点数、特征通道数那么ST-Conv Block做的事情就是交替在这三个维度上“揉面”时间卷积沿着时间轴滑动空间图卷积沿着节点轴做邻居聚合。整个网络不是一个Recurrent结构而是一个全卷积结构所以可以并行训练这也是它和DCRNN最本质的差别。关于残差连接ST-Conv Block内部加了一层残差让梯度可以更顺畅地穿过两个Block。交通数据是强非平稳的残差连接在这里不只是一个“锦上添花”的trick而是稳定深层卷积训练的关键。没有这个连接我复现时明显感觉到模型在60分钟长时预测上更容易发散。2.2 空间图卷积从谱图理论到一阶近似再到重归一化空间图卷积是整个STGCN里数学密度最高、也最容易劝退新人的部分。我不打算跳过公式但我会尽量用直白的方式讲清楚每一行在干什么。图上的卷积类比图像卷积可以定义在频域里。对一个图信号 x每个节点一个标量首先做图傅里叶变换把x投影到拉普拉斯矩阵L的特征向量U上得到频域表示。然后在频域里用一个滤波器g_θ对每个频率分量做缩放最后再做逆变换回到节点域。这一整套过程写成公式就是g_θ(L) * x U g_θ(Λ) U^T x问题在于直接算U和Λ需要对N×N的拉普拉斯矩阵做特征分解复杂度是O(N^3)。当你有300个传感器这个开销勉强能接受但如果是几千个节点直接特征分解就不现实了。STGCN沿用了Hammond等人提出的切比雪夫多项式近似用一个K阶切比雪夫多项式去逼近滤波器g_θ于是图卷积变成对K跳邻居信息的加权求和。这样就不需要做特征分解了计算复杂度降到了O(K|E|)也就是只跟边的数量相关。如果你只用一阶近似K1这一层就变成了每个节点只聚合自己直接邻居的信息。但一阶近似有个数值稳定性问题如果直接用 I D^{-1/2} A D^{-1/2} 作为传播矩阵它的特征值范围是[0, 2]堆叠多层之后特征值会不断被放大或缩小导致数值不稳定。Kipf和Welling在GCN论文里提出的重归一化技巧解决了这个问题把 I A 合并成一个新的邻接矩阵 Ã A I再计算对应的度矩阵 D~用 D~^{-1/2} Ã D~^{-1/2} 做传播矩阵。这样做的好处是显式加入了每个节点的自环同时把特征值范围拉回到一个更稳定的区间。STGCN的空间图卷积层本质上用的就是这个带自环的传播矩阵。一层图卷积的输出可以写成Z ReLU( D~^{-1/2} Ã D~^{-1/2} X W )其中W是可学习的权重矩阵X是输入特征。论文里还给这个图卷积层加了残差连接因为纯GCN层堆叠过深会面临过平滑问题——所有节点表示趋于一致。2.3 时间门控卷积为什么STGCN敢不用RNN在STGCN出现之前大多数时空预测模型处理时间维度都默认上LSTM或GRU。LSTM确实擅长建模序列但它的训练是逐步展开的每一时间步都依赖前一步的计算无法充分并行。当你有300个传感器、24小时的历史数据时这种串行计算会让训练时间非常可观。STGCN的时间维度用的是门控一维卷积更准确地说是带门控线性单元GLU的因果卷积。所谓因果卷积就是卷积输出只依赖当前时刻及之前的历史窗口不使用未来信息。这保证了预测时信息不会泄漏。门控线性单元的结构是同一个时间卷积核输出两组特征P和Q然后把P经过sigmoid激活得到的值作为门去控制另一组特征的输出(P b) ⊙ σ(Q c)其中⊙表示逐元素相乘σ是sigmoid函数把Q压到0到1之间。这个门的作用很像LSTM里的遗忘门它决定前面提取的时间特征中有多少信息应该“流通”到下一层。区别在于这里没有循环结构门值是通过卷积并行算出来的训练效率完全不同。用GLU而不是普通ReLU我自己的体会是很明显的。交通数据里存在大量“正常模式”比如工作日早晚高峰的形状几乎是固定的如果用一个普通ReLU直接通过模型很容易把所有历史信息一股脑往后传导致对突发事件的响应变钝。加上了门控机制后模型可以在特征层面学会“什么时候该信历史、什么时候该信当前”对事故导致的突然异常更敏感。实验里STGCN在60分钟长时预测上的优势很大程度就要归功于这个门控设计。2.4 输入输出组织细节从历史窗口到未来多步输入张量的形状是 (批次, 时间步, 节点数, 特征维度)在论文的符号里是 M×n×C。M是历史窗口长度实验里取12也就是12个5分钟总共1小时的历史。C是每个节点的特征数可以只取速度一个特征也可以把速度、流量、占用率拼在一起。预测目标Y是未来H个时间步的值H分别取3、6、12对应15分钟、30分钟、60分钟。这里有一个容易被忽略的细节预测输出是直接由最后一个ST-Conv Block的输出经过一个全连接层得到的这个全连接层本质上是一个多步输出层。也就是说STGCN同时预测未来所有时间步而不是像RNN那样逐时间步生成。后者的问题是误差会随着递归传递而累积一步错步步错。STGCN这种直接多步输出的方式避免了误差累积这也是它长时预测能稳住的另一个重要原因。损失函数方面论文用的是L2损失即预测值和真实值的均方误差。但实际训练中还有一个关键处理mask掉缺失节点。真实路况数据里传感器经常离线或上报异常如果不加mask这些脏数据会把梯度带跑偏。3. 实验效果与关键结论从METR-LA到PEMS-BAY3.1 数据集与预处理STGCN实验用了两个公开数据集这两个数据集在后来的DCRNN、Graph WaveNet论文里也成了标配。METR-LA洛杉矶高速公路网207个传感器覆盖约4个月的数据时间跨度为2012年3月到6月。PEMS-BAY旧金山湾区的高速路网325个传感器覆盖6个月数据。两者的时间粒度都是5分钟特征以平均行车速度为主。数据划分按时间顺序切分前70%训练、10%验证、20%测试这个划分协议后来被很多论文沿用。预处理环节里有两点很重要。一是对每个传感器单独做Z-score归一化也就是减均值除以标准差。因为不同路段的平均速度差异很大市中心路段常年时速40公里郊区高速能到100公里如果不单独归一化高值节点会主导梯度的计算。二是对缺失值做处理常用做法是线性插值把传感器故障导致的空洞先补上再进模型。3.2 基线模型对比为什么STGCN能全面胜出论文对比了大量基线我把主要几类梳理一下HA历史平均、ARIMA、VAR三个统计模型主要用来检验数据里的线性和周期性成分能被传统方法学到多少。SVR是非线性机器学习模型的代表。FC-LSTM是循环网络基线它把图结构完全弃置。DCRNN是当时最强的时空图深度学习模型它用扩散图卷积加Seq2Seq结构和STGCN直接对标。一个直观的印象是传统统计方法在15分钟预测上还能勉强顶住但到了60分钟预测误差会迅速放大。FC-LSTM在所有设定下都明显弱于STGCN和DCRNN这正好印证了前面说的忽略拓扑结构时间序列模型的天花板很低。STGCN和DCRNN的对比是论文里最有意思的部分。两者在预测精度上你追我赶15分钟预测时DCRNN略好一点60分钟甚至更长步数时STGCN往往和它打成平手有时更好。但在训练时间和资源消耗上STGCN的优势是压倒性的。DCRNN是Seq2Seq架构编码器解码器都用循环网络训练要按时间步递归展开STGCN是完全卷积架构训练过程可以充分并行。从我自己的复现记录来看STGCN在同等数据规模下单卡训练时间大概是DCRNN的三分之一甚至更少。这也是为什么后来很多工程落地场景优先选择STGCN而非DCRNN的问题所在在效果相差不大时训练效率和部署成本更关键。3.3 超参数选择的经验值论文里给出的关键超参数我可以直接列出来作为参考。历史窗口M12也就是用1小时历史预测未来。预测步长H3/6/12。时间卷积核宽度设为3覆盖15分钟。ST-Conv Block堆叠2层。通道数每层卷积的特征数用64。图卷积层的切比雪夫阶数K取3但在实际实现里等价于聚合3跳以内的邻居。优化器用Adam初始学习率按常见配置选0.001批次大小是50训练轮数50左右。梯度裁剪设为5防止个别异常batch造成梯度爆炸。这里有一个值得强调的点历史窗口长度不是越大越好。我之前试过把M加到24甚至48模型没有变好反而因为输入维度变大、训练变慢。交通数据虽然有长期趋势但当前时刻的路况和未来15到60分钟的路况主要关联还是在最近1到2小时的窗口内。更长的历史并不能凭空增加有效信息反而稀释了关键信号的权重。4. 复现与工程落地中的实操心得4.1 邻接矩阵究竟怎么造STGCN对图结构的依赖其实比很多人想象中更大。你用什么邻接矩阵几乎就决定了模型能学到的空间模式上限。常规做法是DCRNN论文里那套基于距离的高斯核构造法。首先计算每对传感器之间的实际道路距离不是直线距离然后对任意两个节点如果距离小于某个阈值就在邻接矩阵里填上高斯核权重A_ij exp( -d_ij^2 / σ^2 )其中σ是一组距离的标准差通常取所有距离的中位数附近的值阈值根据路网密度手动调整。这个公式的含义很直观两个传感器距离越近图上边的权重越大信息交换越“容易”距离越远权重指数衰减。但这里有个实操层面的坑如果阈值设得太小会切出很多子图出现大量孤立节点这些节点因为无法聚合邻居信息预测效果会很差。阈值设得太大所有节点都近乎全连接模型退化成一个“胖”的全连接层丢失了局部性。一个可用的经验是构造完成后统计一下每个节点的度分布确保绝大多数节点有3到8个邻居是相对合理的图结构。另外别忘了处理自环传播矩阵里要用到 Ã A I如果邻接矩阵本身已经带了自环前面加I时就会重复加权。4.2 训练配置和数值稳定性复现STGCN时最常见的两个问题一个是loss震荡另一个是梯度爆炸。交通数据的分布受节假日、恶劣天气影响很大即使归一化过也会出现某些样本的局部数值特别大的情况触发梯度异常。梯度裁剪基本上属于必备操作。第二个问题是学习率。很多人一上来就用默认的0.001在STGCN上其实也可以用但需要配合学习率衰减。我习惯用余弦退火或等间隔衰减前10个epoch可以让模型快速收敛后面用更小的学习率精调。如果发现验证集loss在某个epoch之后持续走高而训练集loss还在下降那就是过拟合了可以适当增大dropout比例或减小通道数。还有一个值得提的点归一化方式会影响预测上限。论文里的实现通常对每个传感器独立做Z-score但预测结果在使用时要反归一化回真实速度。如果你忘了在测试阶段做反归一化评估指标会直接爆炸这个低级错误我在第一次复现时踩过排查了很久才发现是评估代码的问题。4.3 评估指标里的小陷阱STGCN用的评估指标是MAE、RMSE和MAPE。前两个没什么好说的MAPE这里有个容易被忽视的坑当真实值接近0时MAPE会变成无穷大。交通速度数据还好因为速度为0意味着彻底堵死实际出现概率不高但如果用这个框架预测流量或占用率0值很常见MAPE指标就会失真。所以如果你想迁移STGCN到流量预测场景建议把MAPE替换成MASE或SMAPE这类对0值更鲁棒的指标。另一个评估细节是千万不能用测试集里某一天的归一化参数去归一一整段测试数据。正确的做法是用训练集的均值和标准差去归一化验证集和测试集而不是每段数据各自归一化。否则等于偷偷把目标分布的信息泄露给了模型。4.4 常见问题速查表现象可能原因排查/解决方法训练loss很高且不下降学习率太大或邻接矩阵几乎全零调小学习率检查图连通性loss快速下降但验证集性能差过拟合增大dropout减少通道数或层数预测结果全部接近均值过平滑图卷积层太深减少图卷积层数或Block数测试集指标远差于验证集数据划分或归一化泄露检查是否用了测试集的统计量做归一化60分钟长时预测发散残差连接失效检查ST-Conv Block里残差连接是否加对5. 现在回头看STGCN的贡献、局限和后续发展5.1 三个不该被忘记的技术贡献STGCN在这篇论文里做了三件值得记下的事。第一把交通预测定义成时空图学习问题这个“定义”本身就是一次范式转换。在它之前很多工作还是把路网展平成向量在它之后图卷积几乎成了交通预测模型的标配模块。第二用纯卷积架构替代循环网络来处理时间维度把训练效率提升了一个量级这给后来Graph WaveNet等模型铺了路。第三在模块设计上把GLU门控、残差连接、批归一化这些当时最前沿的训练技巧组合进了一个统一框架让模型既有理论根基又有工程可复现性。STGCN的公式推导现在看起来不算复杂但它在一个错误方向上频繁碰壁的时期当时大家默认序列预测必须用RNN用卷积方案给出了一个更优解。这种“反直觉但有效”的贡献比单纯刷一个SOTA指标更有价值。5.2 局限图结构依赖和数据瓶颈STGCN有一个明显局限它依赖预先定义好的静态图结构。如果传感器之间的距离计算不准确或者路网本身发生了结构性变化比如新开通一条路固定邻接矩阵就会成为瓶颈。后来的Graph WaveNet提出自适应邻接矩阵本质上就是针对这个痛点。另一个局限是它对每个节点单独做归一化和特征变换在传感器数量非常庞大几千个时参数量和计算开销会增长。你可以用参数共享来缓解但共享之后模型又会损失节点个性化这是一个需要权衡的问题。5.3 一个容易混淆的提醒最后提醒一下STGCN这套论文笔记很容易和2018年同年发表在AAAI上的另一篇同名工作混淆——那篇论文题目也叫Spatial Temporal Graph Convolutional Networks但做的是骨架动作识别skeleton-based action recognition。两篇论文缩写都是STGCN核心结构也都有“图卷积时间卷积”的影子但问题领域完全不同。查资料的时候一定要看清楚数据集和应用场景别把交通预测的结论套到动作识别上反过来也一样。读论文的时候被公式卡住是正常的我的经验是先跳过推导把架构图里“时间GCN空间GCN交替堆叠”这个主干记住再回头看公式就会顺很多。真正动手复现一遍STGCN之后你再看后续的时空预测论文会发现很多设计的出发点都能归结到本文提出的两个问题上如何让消息在图结构上充分传播如何让时间卷积在不同尺度上有效捕捉依赖。把这两件事想透比记住任何一个模型的超参数都更重要。