TGN:Temporal Graph Networks for Deep Learning on Dynamic Graphs

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} EV×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=jnih(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) 可以被表示为两种类型:

  1. A node-wise event v i ( t ) v_i(t) vi(t) 表示,其中 i i i 表示 节点的下标, v v v 表示v是与事件相关联的向量特性(vector attribute)。节点第一次出现之后,就假设节点一直存在,而且下标保持不变,在后续中一直使用。
  2. 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),tT} 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),tT} 表示 节点集 和 边集, 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,...,tbt 的 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 是一个可学习函数,可以用多种方式实现:

  1. Identity (id):直接用memory作为节点embedding。
    在这里插入图片描述

  2. Time projection (time):
    在这里插入图片描述
    其中 w w w 是可学习参数, Δ t \Delta t Δt 是与上一次 interaction 的间隔时间, ∘ \circ 表示向量对应位置元素相乘。

  3. 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(l1)(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(l1)(t),...,hN(l1)(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)

  4. 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跳邻居的信息。
  • 7
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值