2、Background
2.1 Deep learning on static graphs
一个静态图
G
=
(
V
,
E
)
\mathcal{G}=(\mathcal{V},\mathcal{E})
G=(V,E) 包含结点
V
=
1
,
.
.
.
,
.
n
\mathcal{V}={1,...,.n}
V=1,...,.n 和边
E
⊆
V
×
V
\mathcal{E}\subseteq\mathcal{V}\times\mathcal{V}
E⊆V×V,军备赋予了 features,对于所有的
i
,
j
=
1
,
.
.
.
,
n
i,j=1,...,n
i,j=1,...,n 用
v
i
v_i
vi 和
e
i
j
e_{ij}
eij 来表示。典型的图神经网络(GNN)通过学习局部聚合规则来创建节点的嵌入
z
i
z_i
zi :
z
i
=
∑
j
∈
n
i
h
(
m
i
j
,
v
i
)
z_i=\sum_{j\in n_i} h(m_{ij},v_i)
zi=j∈ni∑h(mij,vi)
m
i
j
=
m
s
g
(
v
i
,
v
j
,
e
i
j
)
m_{ij} =msg(v_i,v_j,e_{ij})
mij=msg(vi,vj,eij)
可以被理解为
i
i
i 的邻居
j
j
j 对它的信息传递。这里,
n
i
=
{
j
:
(
i
,
j
)
∈
E
}
n_i={{j:(i,j)\in \mathcal{E}}}
ni={j:(i,j)∈E} 表示节点
i
i
i 的邻域,
m
s
g
msg
msg 和
h
h
h 为可学习函数。
2.2 Dynamic Graphs
动态图有两类。离散时间动态图 Discrete-time dynamic graphs (DTDG) 是 每隔一段时间采集的 静态图 的序列。连续时间动态图 Continuos-time dynamic graphs (CTDG) 更为常用,可以被表示为按照时间排列的事件(timed lists of events),可以包括边的添加或删除、节点的添加或删除、节点或边的feature的变化。在本文中我们不考虑删除事件。
我们的动态图(temporal (multi-)graph)被建模为 带时间戳的事件(time-stamped events)的序列 G = x ( t 1 ) , x ( t 2 ) , . . . \mathcal{G}={x(t_1),x(t_2),...} G=x(t1),x(t2),... ,表示 节点 或 节点间交互作用 的添加或是更改 在时间 0 < = t 1 < = t 2 < = . . . 0<=t_1<=t_2<=... 0<=t1<=t2<=...。一个事件 x ( t ) x(t) x(t) 可以被表示为两种类型:
- A node-wise event 用 v i ( t ) v_i(t) vi(t) 表示,其中 i i i 表示 节点的下标, v v v 表示v是与事件相关联的向量特性(vector attribute)。节点第一次出现之后,就假设节点一直存在,而且下标保持不变,在后续中一直使用。
- An interaction event :节点
i
i
i 和 节点
j
j
j 之间的交互作用用 temporal edge 表示,
e
i
j
e_{ij}
eij (在一对节点之间可能有不止一条边,所以从技术上讲,这是一个多重图multigraph,含有平行边的图)。
我们用 V ( T ) = { i : ∃ v i ( t ) ∈ ( G ) , t ∈ T } \mathcal{V}(T)=\lbrace i: \exists v_i(t) \in \mathcal(G), t \in T \rbrace V(T)={i:∃vi(t)∈(G),t∈T} 、 E ( T ) = { ( i , j ) : ∃ e i j ( t ) ∈ ( G ) , t ∈ T } \mathcal{E}(T)=\lbrace (i,j): \exists e_{ij}(t) \in \mathcal(G), t \in T \rbrace E(T)={(i,j):∃eij(t)∈(G),t∈T} 表示 节点集 和 边集, n i ( T ) = { j : ( i , j ) ∈ ( E ) ( T ) } n_i(T)=\lbrace j:(i,j) \in \mathcal(E)(T)\rbrace ni(T)={j:(i,j)∈(E)(T)} 表示节点 i i i 的邻居,在时间间隔T内。 n i k ( T ) n_i^k(T) nik(T) 表示k跳邻居。时序图(temporal graph) G \mathcal{G} G 在时间 t 的 snapshot 是有 n ( t ) n(t) n(t) 个节点的 (multi-)graph G ( t ) = ( V [ 0 , t ] , E [ 0 , t ] ) \mathcal{G}(t)=(\mathcal{V}[0,t], \mathcal{E}[0,t]) G(t)=(V[0,t],E[0,t]) 。
3、Temporal Graph Networks
动态图的神经网络模型可以被视为一个 encoder-decoder 架构,encoder是将动态图映射为节点embedding的function,decoder 接受一个或多个节点embedding作为输入,并基于这些进行预测,例如节点分类、边分类。
本文的主要贡献在于 a novel Temporal Graph Network (TGN),encoder采用了表示为带有time-stamped events and producing 的连续时间动态图,对每一个时间 t t t,图中节点的embedding为 Z ( t ) = ( z 1 ( t ) , . . . , z n ( t ) ( t ) ) Z(t)=(z_1(t),...,z_{n(t)}(t)) Z(t)=(z1(t),...,zn(t)(t)) 。
3.1 Core modules(核心模块)
该模型可应用于以事件流表示的动态图的各种学习问题。简而言之,TGN Decoder 根据结点之间的连接创建节点的Embedding 表示,并在每个事件上更新它们。为了实现这一点,TGN有以下主要组件:
Memory
Memory 存储所有节点的状态,作为节点过去时刻相互连接的压缩表示。它类似于RNN的隐状态;然而,在这里每一个节点
i
i
i 有一个单独的状态向量(a separate state vector)
s
i
(
t
)
s_i(t)
si(t) 。当一个新的节点出现,我们增加一倍被初始化为零向量的对应的状态。
然而,这里有一个单独的状态向量年代ᵢ为每个节点(t)。当一个新节点出现时,我们添加一个相应的状态初始化向量的零。此外,由于每个节点的 memory 只是一个状态向量(而不是一个参数),所以在训练阶段,当模型出现新的节点交互,可以更新对应节点的状态。
Message Function
Message Function 是更新 memory 的主要机制。给一个节点
i
i
i 和 节点
j
j
j 在时刻
t
t
t 的一个相互作用,Message Function 计算两个 message (一个是针对
i
i
i,一个是针对
j
j
j ),用于更新 memory。这类似于在消息传递图神经网络(message-passing graph neural networks)中计算的 messages 。messages 是计算 节点
i
i
i、节点
j
j
j 的 memory 的函数,输入为 时间
t
t
t 之前的相互作用、相互作用时间
t
t
t、边的特征:
m
s
g
msg
msg 是可学习的message function 例如 MLP。在本文中,我们选用的 message function
m
s
g
msg
msg 是 identity (id),只是简单地把输入串联起来。
Message Aggregator
为了提高效率,采用批处理的手段,但是会导致在同一个batch中,多个事件包含相同的节点
i
i
i。由于每一个事件都会产生一个 message,所以我们需要聚合 时间
t
1
,
.
.
.
,
t
b
≤
t
t_1,...,t_b \leq t
t1,...,tb≤t 的 message
m
i
(
t
1
)
,
.
.
.
,
m
i
(
t
b
)
m_i(t_1),...,m_i(t_b)
mi(t1),...,mi(tb)。
其中,
a
g
g
agg
agg 是一个聚合函数,可以用多种方式实现,例如 RNN、注意力机制等。本文中为了简单起见,我们采用了两种实现方式:1) most recent message ,只保留给定节点的最新的消息;2) mean message ,一个给定节点的所有 message 的平均值。
Memory Updater
Memory Updater 用于根据新的 message 更新 memory 。该模块通常用 RNN、LSTM、GRU 实现。
考虑到节点的 memory 是一个随时间更新的向量,最直接的方法是直接使用它作为 节点Embedding。然而,在实践中,这不是一个好的方法 由于 the staleness problem :如果只有在节点相互作用的时候才更新 memory,那么节点长时间不活动会导致 memory 会 staleness 。
举个例子,假设一个用户离开Twitter好几个月。当用户返回时,他们的兴趣可能已经转移,所以他们过去的活动记忆不再相关。因此,我们需要一种更好的方法来计算嵌入。
Embedding
一种解决方案是参考 节点的邻居。为了解决 staleness problem,Embedding 模块通过对节点的 spatiotemporal neighbours 进行 graph aggregation 来计算该节点的 temporal embedding。即使一个节点已经不活动一段时间,它的一些邻居可能已经活动,并且通过聚集他们的 memory,TGN可以计算一个节点的up-to-date embedding 。在我们的例子中,即使用户离开Twitter,他们的朋友仍然活跃,所以当用户返回时,朋友最近的活动可能 比 用户自己的历史活动更相关。
图形嵌入模块通过在目标节点的 temporal neighbourhood 上执行聚合来计算目标节点的嵌入。在上面的图中,当计算节点 1 在时间
t
t
t(
t
t
t比
t
2
,
t
3
,
t
4
t_2,t_3,t_4
t2,t3,t4大,比
t
5
t_5
t5小)的Embedding的时候,temporal neighbourhood 只包含时间
t
t
t 之前出现的边。因此,节点5的边不参与计算,因为它是在将来发生的。相反,嵌入模块从相邻节点2、3和4的 features(v) 和 memory(s) 以及边的特征进行聚合,以计算节点1的表示。实验中表现最好的图形嵌入模块是 graph attention,它可以根据邻居的 memory 、feature 和 time of interaction 来判断哪些邻居是最重要的。
简言之: 如果直接用memory来表示节点的信息,如果这个节点长时间不活动,会出现 memory 过时的问题,所以聚合一下邻居的信息,来生成这个节点的 embedding。
Embedding 模块用来生成 节点
i
i
i 在时间
t
t
t 的 Temporal Embedding
z
i
(
t
)
z_i(t)
zi(t) 。
其中,
h
h
h 是一个可学习函数,可以用多种方式实现:
-
Identity (id):直接用memory作为节点embedding。
-
Time projection (time):
其中 w w w 是可学习参数, Δ t \Delta t Δt 是与上一次 interaction 的间隔时间, ∘ \circ ∘ 表示向量对应位置元素相乘。 -
Temporal Graph Attention (attn):A series of L L L graph attention layers 通过聚合 L L L跳 temporal neighborhood 计算 i i i 的 embedding。 第 l l l 层输入是 i i i 在当前时间 t t t 的表示 h i ( l − 1 ) ( t ) h_i^{(l-1)}(t) hi(l−1)(t), i i i 的邻居的表示 h 1 ( l − 1 ) ( t ) , . . . , h N ( l − 1 ) ( t ) h_1^{(l-1)}(t),...,h_N^{(l-1)}(t) h1(l−1)(t),...,hN(l−1)(t) 、时间戳 t 1 , . . . , t N t_1,...,t_N t1,...,tN 、特征 e i 1 ( t 1 ) , . . . , e i N ( t N ) e_{i1}(t_1),...,e_{iN}(t_N) ei1(t1),...,eiN(tN):
在这里, ϕ ( ⋅ ) \phi (\cdot) ϕ(⋅) 表示 a generic time encoding, || 是连接运算符, z i ( t ) = e m b ( i , t ) = h i ( L ) ( t ) z_i(t)=emb(i,t)=h_i^{(L)}(t) zi(t)=emb(i,t)=hi(L)(t) 。每一层相当于进行了 multi-head-attention 其中 query q ( l ) ( t ) q^{(l)}(t) q(l)(t) 是一个 reference node(即目标节点或它的L个1跳邻居中的一个),keys K ( l ) ( t ) K^{(l)}(t) K(l)(t) ,values V ( l ) ( t ) V^{(l)}(t) V(l)(t) 是他的邻居。最后,利用 MLP 将 the reference node
representation 与 the aggregated information 组合在一起。与这一层的原始公式(在TGAT 中首次提出)不同,这一层中没有使用节点的时间特征,在我们的例子中,每个节点的输入表示为 h j ( 0 ) ( t ) = s j ( t ) + v j ( t ) h^{(0)}_j(t)=s_j(t)+v_j(t) hj(0)(t)=sj(t)+vj(t),因此,它允许模型同时利用当前 memory s j ( t ) s_j(t) sj(t) 和 the temporal node features v j ( t ) v_j(t) vj(t)。 -
Temporal Graph Sum (sum): 在图上进行更简单和更快的聚合:
在这里, ϕ ( ⋅ ) \phi (\cdot) ϕ(⋅) 是 a time encoding,并且:
TGN对于一个batch的训练数据的整体计算过程如下图所示:
TGN对一批训练数据执行的计算。一方面,Embedding 由 embedding module 使用时序图和节点的 memory (1)生成。然后使用 Embedding 来预测批处理交互并计算损失(2)(3)。另一方面,这些 same interactions 被用于更新memory(4)(5)。
memory-related modules (Message function, Message aggregator, and Memory updater) 的训练方式
考虑到它们似乎不直接影响loss,因此不计算梯度。为了让这些模块能够影响loss,我们需要在预测 batch interactions 之前更新memory。然而这将导致 leakage,因为memory中已经包含了我们想要预测的信息。针对这个问题的解决方案是 使用前面的batches的信息来更新memory,然后预测interactions 。下图显示了TGN的操作流程,这是训练 the memory-related modules 所必需的:
Flow of operations of TGN necessary to train the memory-related modules. 引入了一个新的模块,the raw message store,用来存储计算 message的必须信息,我们称之为 原始信息(raw messages) ,用于过去已被模型处理过的 interactions 。这允许模型将 interaction 导致的 memory 更新延迟到以后的 batch。
- 首先,使用 在先前的batches中存储的raw message 计算 message 更新 memory。
- 然后,使用刚刚更新的 memory 计算 embedding (灰色链接)(3)。通过这样做,与 memory 相关的模块的计算直接影响 loss (4,5),并且得到一个梯度。
- 最后,当前batch 的 interactions 存储在raw message中,以供后序的batch使用(6)。
在各种 dynamic graphs 的大量实验验证中,TGN在未来边缘预测(future edge prediction)和动态节点分类(dynamic node classification)的任务上,无论在精度还是速度上都明显优于竞争的方法(competing methods)。其中一个动态图是Wikipedia,其中用户和页面是节点,interaction 表示用户编辑页面。编辑文本的编码被用作交互特性。本例中的任务是预测用户在给定时间将编辑哪个页面。我们比较了不同的 TGN变形 与基线方法:
这些消融研究表明了TGN不同模块的重要性。
- memory 很重要:它的缺失会导致性能的大幅下降
- embedding module 很重要(不是直接输出memory状态)。Graph attention-based embedding 表现更好
- 使用memory后,仅需要一个graph attention layer即可(使用一个大大减少了计算时间),由于1跳邻居的 memory 给了模型间接访问2跳邻居的信息。