系列文章目录
时空图神经网络1——GNN和GCN
时空图神经网络2——RNN和GRU
时序图神经网络3——T-GCN
时序图神经网络4——GAT
时序图神经网络5——TCN
文章目录
前言
我想先说两句A3T-GCN
。我在之前之所以写 TGCN
,目的就是想学习 A3TGCN
,后者是基于前者写的。但是经过这段时间的了解,我觉得(个人觉得)A3TGCN
虽然有自己的可取之处(添加了注意力机制),但也不是特别让人惊艳的一个架构,就是 TCN
添加了注意力机制而已。然而该架构的原文看起来很难理解(可能是我自己的问题),而且代码跟原文不一样。对于代码的讲解,可以看A3T-GCN架构预测交通流量,我个人是不建议研究这篇论文和代码。原文是A3T-GCN: Attention Temporal Graph Convolutional Network for Traffic Forecasting,源代码可访问链接。
增强时空图卷积网络 ASTGCN
是从一个交通流量预测的场景中提出的,原理上看起来比 A3TGCN
要好,因为该架构将外部因素建模为动态属性和静态属性,并设计了一个属性增强单元,将这些因素编码并整合到时空图卷积模型中。具体来说,静态因素不会随时间持续变化,但会对特定时刻的交通状态产生影响。例如,在有大量餐厅的路段,用餐时段的交通状态会与其他时段有显著差异;而动态因素会随时间变化,进而导致交通状况的改变。以天气状况为例,当天气从晴天转为大雨时,交通速度通常会下降。
本文将外部因素视为道路网络中路段的属性,同时对路段的属性和交通特征进行建模,以获得增强的特征向量。通过这种方式,模型对外部信息的感知能力得到增强,从而提高了预测的准确性。
真的绷不住,原来还有个
ASTGCN
,我本来应该是想看这一篇的,因为这是Pytorch Geometric Temporal
中有的一个模型,结果我看原文看的AST-GCN
。
一、AST-GCN 原理
1. 问题定义
交通预测的目标是基于历史状态和辅助信息来预测未来的交通状态。路段的交通状态主要通过平均交通流量、速度和占有率来描述,本文以平均交通速度为例来说明研究工作。因此,本文的交通预测任务主要是基于过去一段时间的交通速度以及影响交通的外部因素,来预测未来的交通速度。
- 道路网络 G G G:城市道路网络的拓扑结构表示为 G = ( V , E ) G = (V, E) G=(V,E),其中 V = { v 1 , v 2 , ⋅ ⋅ ⋅ , v n } V = \{v_1, v_2, ···, v_n\} V={v1,v2,⋅⋅⋅,vn} 是路段集合, n n n 是路段数量。 E E E 是边的集合, E = { e 1 , e 2 , ⋅ ⋅ ⋅ , e m } E = \{e_1, e_2, ···, e_m\} E={e1,e2,⋅⋅⋅,em} 反映了路段之间的连接关系, m m m 是边数量。使用邻接矩阵 A A A 表示路段的连通性,当 G G G 是无权网络时,A是一个由 0 和 1 组成的矩阵,其中 1 表示相应的路段是连通的,0 则表示不连通。
- 特征矩阵
X
X
X:交通特征矩阵
X
X
X。在本文中,交通速度被视为城市道路网络中每个节点的固有属性,用矩阵
X
X
X 表示,其中
x
i
t
x_{i}^{t}
xit 表示在时间
t
t
t 时第
i
i
i 个路段的交通速度 ,所以矩阵
X
X
X 的尺寸是
[num_nodes, num_features, seq_length]
。在这里num_features=1
。 - 属性矩阵 K K K:在本文中,将影响交通状况的外部因素视为城市道路网络中路段的辅助属性。这些因素可以构成一个属性矩阵 K = { K 1 , K 2 , … , K l } K = \{K_1, K_2, \ldots, K_l\} K={K1,K2,…,Kl},其中 l l l 是辅助信息的类别数量。第 j j j 类辅助信息的集合表示为 K j = { j 1 , j 2 , … , j t } , j i t K_j = \{j^1, j^2, \ldots, j^t\},j_{i}^{t} Kj={j1,j2,…,jt},jit 是在时间 t t t 时第 i i i 个路段的第 j j j 个辅助信息。
综上所述,交通预测问题可以理解为在道路网络的基本拓扑结构 G G G、特征矩阵 X X X 和属性矩阵 K K K 的基础上,学习函数 f f f,以获得未来时间段 T T T 的交通信息,用公式表示如下: [ x t + 1 , x t + 2 , … , x t + T ] = f ( G , X ∣ K ) [x_{t+1}, x_{t+2}, \ldots, x_{t+T}]=f(G,X|K) [xt+1,xt+2,…,xt+T]=f(G,X∣K)
2. 属性增强单元
为了全面考虑影响交通状态的因素,本研究将外部因素建模为道路网络中路段的动态
D
D
D 和静态
S
S
S 属性。然后,将交通特征矩阵X和属性矩阵
K
=
{
S
,
D
}
K = \{S, D\}
K={S,D} 输入到属性增强单元A-Cell
中,以得到增强矩阵。
- 静态属性
S
S
S:是
p
p
p 个不同静态属性的集合,也就是
{
s
1
,
s
2
,
…
,
s
p
}
\{s_1, s_2, \dots, s_p\}
{s1,s2,…,sp},由于属性值不随时间变化,在生成增强矩阵的过程中,始终使用整个矩阵
S
S
S,而在每个时间戳,仅从特征矩阵
X
X
X 中提取相应的列。具体来说,在时间
t
t
t 由静态属性增强的矩阵形式为:
E
s
t
=
[
X
t
,
S
]
,
E
s
t
∈
R
n
×
(
p
+
l
)
E_{s}^{t}=\left[X^{t}, S\right], E_{s}^{t} \in R^{n\times(p + l)}
Est=[Xt,S],Est∈Rn×(p+l)在此看出静态属性的形状是
[num_nodes, p]
,静态属性的增强矩阵形状是[num_nodes, p+l]
。
这个
l
我是有疑问的,上文提到 l l l 的时候是属性矩阵 K K K 有 l l l 个辅助信息特征,不是 X X X 中的,所以我觉得这里增强矩阵的尺寸应该是[num_nodes, p + num_features]
- 动态属性
D
D
D:是
w
w
w 个不同动态属性的集合,也就是
{
D
1
,
D
2
,
…
,
D
w
}
\{D_1, D_2, \dots, D_w\}
{D1,D2,…,Dw},由于属性值要随时间变化,其形状为
[num_nodes, seq_length, w]
。我们在计算 t t t 时刻时,可能下意识觉得使用 D w t D_w^t Dwt 就可以了。实际上动态属性是有积累效应的,我们要考虑一段时间的动态属性值,对属性 s s s 来说也就是 D w t − m , t = [ D w t − m , D w t − m + 1 , … , D w t ] D_w^{t-m,t}=[D_w^{t-m}, D_w^{t-m+1}, \dots, D_w^{t}] Dwt−m,t=[Dwt−m,Dwt−m+1,…,Dwt]。然后通过属性增强矩阵,形成在 t t t 时刻包含静态和动态外部属性以及交通特征信息的增强矩阵: E s t = [ X t , S , D 1 t − m , t , D 2 t − m , t , … , D w t − m , t ] , E s t ∈ R n × ( p + l + w ( m + 1 ) ) E_{s}^{t}=\left[X^{t}, S, D_1^{t-m,t}, D_2^{t-m,t}, \dots, D_w^{t-m,t}\right], E_{s}^{t} \in R^{n\times(p + l + w(m+1))} Est=[Xt,S,D1t−m,t,D2t−m,t,…,Dwt−m,t],Est∈Rn×(p+l+w(m+1))
我们可以发现,虽然
E
s
t
E_{s}^{t}
Est 看起来很复杂,实际上就是把特征矩阵、动态属性和静态属性拼接起来,而且其尺寸第一维和
X
t
X^t
Xt 没有区别,仍然是 num_nodes
,只是在特征维度上拼接了。也就是说在图卷积的运算中,
E
s
t
E_{s}^{t}
Est 就是输入,尺寸是[num_nodes, num_features]
,其中 num_features = p + l + w(m+1)
。
与静态部分相同,我个人认为 l l l 是节点的特征,在这里是 1,前文中说的 K K K 的辅助信息类别是 l l l,我认为 l = p + w l=p+w l=p+w。
2. 时空图卷积网络
通过结合 GCN
和 GRU
模型,可以实现捕捉现实世界交通数据中时空依赖关系的目的。GCN
模型用于生成路段的表示,这些表示在每个时间戳捕捉道路网络上的空间依赖关系。然后,将这些随时间变化的表示输入到 GRU
模型中,以捕捉时间依赖关系。这一部分的详细内容分别在系列文章中的 GCN
部分,GRU
部分和 TCN
部分都已经写过了,可以去看一下。
3. 属性增强时空图卷积模型(AST-GCN)
如图所示,属性增强单元通过融入静态和动态外部属性来扩展原始特征矩阵的维度。在时间
t
t
t,从原始交通特征矩阵
X
X
X 中提取
X
t
X^t
Xt,
{
D
t
−
m
,
…
,
D
t
}
\{D^{t - m}, \ldots, D^{t}\}
{Dt−m,…,Dt} 是从时间
t
−
m
t - m
t−m 到
t
t
t 的动态信息集合,
S
S
S 是静态属性,在不同时间戳下保持不变,
E
t
E^{t}
Et 是外部属性与原始交通特征融合后的增强矩阵。然后,增强矩阵
E
E
E 被用作时空模型
f
f
f 的输入,以获得最终的预测结果
y
=
f
(
A
,
X
,
E
)
y=f(A, X, E)
y=f(A,X,E)。具体而言,增强矩阵被输入到一系列 GCN 中,以生成编码交通状态空间特征的路段时变特征。然后,这些特征序列被用作 GRU 的输入,对时间依赖关系进行建模,并推导隐藏的交通状态。
图中式子只看框架的话,明显是 GRU
架构,之前专门展开讲过了;我们回顾一下 GRU
的公式就知道,GRU
中的当前输入,在这里是
g
c
(
E
t
,
A
)
gc(E^t,A)
gc(Et,A),其中
g
c
gc
gc 是图卷积操作。通过一次卷积操作聚合各个节点的特征,然后放入 GRU
中就结束了。整体框架如下图所示:
写到这里由于发现搞错了,想看的是 ASTGCN
而不是 AST-GCN
,自然也就不再继续往下写了,不过写到这里也差不多结束了,剩下的就只有代码要看了。虽然很不开心但是这篇论文的思路也是有可取之处的,重在学习!
我不甘心啊,所以我决定看看真正的 ASTGCN
,因为我觉得他的方法很吸引我。
二、ASTGCN 原理
1. 交通网络
在本研究中,我们将交通网络定义为一个无向图
G
=
(
V
,
E
,
A
)
G=(V, E, A)
G=(V,E,A),如图中(a)所示,其中
V
V
V 是一个有限节点集,
∣
V
∣
=
N
|V| = N
∣V∣=N;
E
E
E 是边集,表示节点之间的连通性;
A
∈
R
N
×
N
A \in \mathbb{R}^{N × N}
A∈RN×N表示图
G
G
G 的邻接矩阵。交通网络
G
G
G 上的每个节点以相同的采样频率检测
F
F
F 种测量值,也就是说,每个节点在每个时间片都会生成一个长度为
F
F
F 的特征向量,如图中(b)的实线所示。
2. 交通流量预测
基于我们前面写过的很多内容来说,我们的输入尺寸其实都差不多,在这里也是一样[num_nodes, seq_length, num_features]
,或者变换一下顺序。但是为了讲的清楚,要在这里写出原文中的内容防止后面出现混乱。假设在交通网络
G
G
G 中,每个节点记录的第
f
f
f 个时间序列为交通流量序列,且
f
∈
(
1
,
.
.
.
,
F
)
f \in (1, ..., F)
f∈(1,...,F)。我们用
x
t
c
,
i
∈
R
x_{t}^{c, i} \in \mathbb{R}
xtc,i∈R 表示在时刻
t
t
t 节点
i
i
i 的第
c
c
c 个特征的值,
x
t
i
∈
R
F
x_{t}^{i} \in \mathbb{R}^{F}
xti∈RF表示时刻
t
t
t 节点
i
i
i 的所有特征的值,
x
t
=
(
x
t
1
,
x
t
2
,
.
.
.
,
x
t
N
)
T
∈
R
N
×
F
x_{t} = (x_{t}^{1}, x_{t}^{2}, ..., x_{t}^{N})^{T} \in \mathbb{R}^{N × F}
xt=(xt1,xt2,...,xtN)T∈RN×F表示时刻
t
t
t 所有节点的所有特征的值,
X
=
(
X
1
,
X
2
,
.
.
.
,
X
τ
)
T
∈
R
N
×
F
×
τ
X = (X_{1}, X_{2}, ..., X_{\tau})^{T} \in \mathbb{R}^{N × F × \tau}
X=(X1,X2,...,Xτ)T∈RN×F×τ 表示所有节点在
T
T
T 个时间片内的所有特征的值。此外,我们设
y
t
i
=
x
t
f
,
i
∈
R
y_{t}^{i} = x_{t}^{f, i} \in \mathbb{R}
yti=xtf,i∈R,表示未来时刻
t
t
t 节点
i
i
i 的交通流量 。所以用文中的符号来表示的话,
X
X
X 的形状是 [N, F, τ]
。
3. 数据采样
假设采样频率为每天 q q q 次。假定当前时间为 t 0 t_{0} t0 ,预测窗口大小为 T p T_{p} Tp 。如图所示,我们沿时间轴截取长度分别为 T h T_{h} Th、 T d T_{d} Td 和 T w T_{w} Tw 的三个时间序列段,分别作为近期、日周期和周周期组件的输入,其中 T h T_{h} Th、 T d T_{d} Td 和 T w T_{w} Tw 均为 T p T_{p} Tp 的整数倍。这三个时间序列段的详细信息如下:
- 近期段:这是一段与预测期直接相邻的历史时间序列,如图中绿色部分所示。直观来看,交通拥堵的形成和消散是渐进的。因此,刚刚过去的交通流量不可避免地会对未来的交通流量产生影响。
- 日周期段:由过去几天与预测期同一时间段的片段组成,如图中红色部分所示。由于人们日常活动的规律性,交通数据可能会呈现出重复的模式,比如每日的早高峰。日周期组件的目的是对交通数据的日周期性进行建模。
- 周周期段:由过去几周中与预测期具有相同星期属性和时间间隔的片段构成,如图中蓝色部分所示。通常,周一的交通模式与历史上周一的交通模式具有一定的相似性,但可能与周末的交通模式有很大差异。因此,周周期组件旨在捕捉交通数据中的周周期特征。
据说效果很好的 TimesNet 也有类似的思想,即把时间按照不同周期划分,分别捕捉规律。
这三个组件共享相同的网络结构,每个组件都由几个时空块和一个全连接层组成。每个时空块中都有一个时空注意力模块和一个时空卷积模块。为了优化训练效率,在每个组件中采用了残差学习框架。最后,三个组件的输出基于一个参数矩阵进一步融合,以获得最终的预测结果。
上图中分别体现出了空间、不同时间和其他特征对交通流量的影响程度示意图。
4. ASTGCN 架构
ASTGCN
架构如上图所示,SAtt
代表空间注意力,TAtt
代表时间注意力,GCN
代表图卷积,CNN
代表卷积,FC
代表全连接,ST
代表时空块,我们依次来看。
4.1 空间注意力机制
以近期组件中的空间注意力机制为例(下表为 h
):
S
=
V
s
⋅
σ
(
(
X
h
(
r
−
1
)
W
1
)
W
2
(
W
3
X
h
(
r
−
1
)
)
T
+
b
s
)
(1)
\mathbf{S} = \mathbf{V}_s \cdot \sigma((\mathcal{X}_{h}^{(r - 1)}\mathbf{W}_1)\mathbf{W}_2(\mathbf{W}_3\mathcal{X}_{h}^{(r - 1)})^T + \mathbf{b}_s) \tag{1}
S=Vs⋅σ((Xh(r−1)W1)W2(W3Xh(r−1))T+bs)(1)
S
i
,
j
′
=
exp
(
S
i
,
j
)
∑
j
=
1
N
exp
(
S
i
,
j
)
(2)
S'_{i,j} = \frac{\exp(S_{i,j})}{\sum_{j = 1}^{N} \exp(S_{i,j})} \tag{2}
Si,j′=∑j=1Nexp(Si,j)exp(Si,j)(2)
其中,
X
h
(
r
−
1
)
=
(
X
1
,
X
2
,
…
,
X
T
r
−
1
)
∈
R
N
×
C
r
−
1
×
T
r
−
1
\mathcal{X}_{h}^{(r - 1)} = (X_{1}, X_{2}, \ldots, X_{T_{r - 1}}) \in \mathbb{R}^{N \times C_{r - 1} \times T_{r - 1}}
Xh(r−1)=(X1,X2,…,XTr−1)∈RN×Cr−1×Tr−1,是第
r
r
r 个时空块的输入,
r
=
1
r=1
r=1 时即
X
h
0
\mathcal{X}_{h}^0
Xh0。
C
r
−
1
C_{r-1}
Cr−1 是第
r
r
r 个时空块(第
r
r
r 层)的通道(特征)数,
r
=
1
r=1
r=1 时
C
=
F
C=F
C=F。
T
r
−
1
T_{r - 1}
Tr−1 是第
r
r
r 层时间维度的长度。当
r
=
1
r = 1
r=1 时,在近期组件中
T
0
=
T
h
T_{0} = T_{h}
T0=Th(在日周期组件中
T
0
=
T
d
T_{0} = T_{d}
T0=Td,在周周期组件中
T
0
=
T
w
T_{0} = T_{w}
T0=Tw )。
V
s
,
b
s
∈
R
N
×
N
V_s, b_s \in \mathbb{R}^{N \times N}
Vs,bs∈RN×N,
W
1
∈
R
T
r
−
1
W_1 \in \mathbb{R}^{T_{r-1}}
W1∈RTr−1,
W
2
∈
R
C
r
−
1
×
T
r
−
1
W_2 \in \mathbb{R}^{C_{r-1} \times T_{r-1}}
W2∈RCr−1×Tr−1,
W
3
∈
R
C
r
−
1
W_3 \in \mathbb{R}^{C_{r-1}}
W3∈RCr−1 是可学习参数,再使用 sigmoid
函数激活,注意力矩阵
S
S
S 是根据该层的当前输入动态计算得出的。**元素
S
i
,
j
S_{i, j}
Si,j 的值在语义上表示节点
i
i
i 和节点
j
j
j 之间的相关强度。**然后,使用 softmax
函数确保一个节点的注意力权重之和为 1。在进行图卷积时,我们会将邻接矩阵
A
A
A 与空间注意力矩阵
S
′
∈
R
N
×
N
S' \in \mathbb{R}^{N×N}
S′∈RN×N 相结合,以动态调整节点之间的影响权重。
公式已经看了,也知道符号是什么意思,我们怎么理解这个公式?
我们之前提过,注意力机制可以简单理解为相关性,重点考虑相关性大的。先说公式(2),softmax
是注意力机制里的常见操作,一个作用是把注意力的“评分”
S
S
S 控制在 (0,1)
的范围中,另一个作用是让大的数值变得更大,也就突出了重要信息。那么 “评分”
S
S
S 是怎么算出来的?让我们忽略权重矩阵,也就只有
X
h
(
r
−
1
)
\mathcal{X}_{h}^{(r - 1)}
Xh(r−1)和其转置起实质作用,自己乘自己,也就是自注意力机制。这样的操作得到每个节点对其他所有节点的依赖关系。
4.2 时间注意力机制
在时间维度上,不同时间片的交通状况之间存在相关性,并且这些相关性在不同情况下也会有所变化。
E
=
V
e
⋅
σ
(
(
X
h
(
r
−
1
)
U
1
)
U
2
(
U
3
X
h
(
r
−
1
)
)
T
+
b
e
)
(1)
\mathbf{E} = \mathbf{V}_e \cdot \sigma((\mathcal{X}_{h}^{(r - 1)}\mathbf{U}_1)\mathbf{U}_2(\mathbf{U}_3\mathcal{X}_{h}^{(r - 1)})^T + \mathbf{b}_e) \tag{1}
E=Ve⋅σ((Xh(r−1)U1)U2(U3Xh(r−1))T+be)(1)
E
i
,
j
′
=
exp
(
E
i
,
j
)
∑
j
=
1
N
exp
(
E
i
,
j
)
(2)
E'_{i,j} = \frac{\exp(E_{i,j})}{\sum_{j = 1}^{N} \exp(E_{i,j})} \tag{2}
Ei,j′=∑j=1Nexp(Ei,j)exp(Ei,j)(2)
其中,
V
e
,
b
e
∈
R
T
r
−
1
×
T
r
−
1
V_e, b_e \in \mathbb{R}^{T_{r-1} \times T_{r-1}}
Ve,be∈RTr−1×Tr−1,
U
1
∈
R
N
U_1 \in \mathbb{R}^{N}
U1∈RN,
U
2
∈
R
C
r
−
1
×
N
U_2 \in \mathbb{R}^{C_{r-1} \times N}
U2∈RCr−1×N,
U
3
∈
R
C
r
−
1
U_3 \in \mathbb{R}^{C_{r-1}}
U3∈RCr−1 是可学习参数,元素
E
i
,
j
E_{i, j}
Ei,j 的值在语义上表示时间
i
i
i 和时间
j
j
j 之间的相关强度。到这里可能就不用再多说了,我们可以看出,公式的形式与空间注意力机制部分完全一样!通过改变可学习参数矩阵的形状,改变计算相关性的维度,实现从计算每个节点对其他所有结点的依赖,到每个时间点对其他所有时间点的依赖的转变。
4.3 时空卷积
时空注意力模块让网络自动对有价值的信息给予相对更多关注。经注意力机制调整后的输入被送入时空卷积模块,其结构如图所示。这里提出的时空卷积模块由空间维度的图卷积和时间维度的卷积组成,前者从邻域中捕获空间依赖关系,后者从相邻时间片挖掘时间依赖关系。
就是 GCN
和 TCN
的有机结合。具体来说,当图的规模很大时,GCN
中直接对拉普拉斯矩阵进行特征值分解是非常昂贵的。因此,本文采用切比雪夫多项式实现图卷积,来近似但有效地解决这个问题;这里的时间卷积比 TCN
更简单,只用了用标准 2D 卷积捕获时间维特征,并采用ReLU激活函数。
4.4 多组件融合
在本节中,我们将讨论如何整合三个组件的输出。以预测周五上午 8 点整个交通网络的交通流量为例。可以观察到,一些区域的交通流量在早上有明显的高峰期,因此日周期和周周期组件的输出更为关键。然而,在其他一些地方,并没有明显的交通周期模式,因此日周期和周周期组件可能作用不大。因此,在融合不同组件的输出时,三个组件对每个节点的影响权重是不同的,这些权重应该从历史数据中学习得到。所以融合后的最终预测结果为: Y ^ = W h ⊙ Y ^ h + W d ⊙ Y ^ d + W w ⊙ Y ^ w \hat{Y}=W_{h} \odot \hat{Y}_{h}+W_{d} \odot \hat{Y}_{d}+W_{w} \odot \hat{Y}_{w} Y^=Wh⊙Y^h+Wd⊙Y^d+Ww⊙Y^w其中 W h W_{h} Wh、 W d W_{d} Wd 和 W w W_{w} Ww 是学习参数,反映了三个时间维度组件对预测目标的影响程度。
总结
看了 A3TGCN
和 ASTGCN
两个架构,还是很有收获的,都有非常可取之处。另外,写完以后我还看到了一篇讲解 ASTGCN
的 blog 我觉得非常好,原理中很多复杂的维度变换都写的很详细,我很佩服,所以推荐给大家:ASTGCN模型数学原理与代码详解(网络模型部分)。
但是我没仔细看,有点没耐心了,想去实战一把,搞不清楚的再仔细看看。
感觉这篇写的不满意,但是我其实主要是为了自己忘记的时候回来查看,顺便给大家分享。也可能后面再补充一些内容,再说吧!