三篇动态图文章JODIE DYREP TGN的理解

三篇动态图文章DyRep JODIE TGN的理解

一、背景

被抽象出的图往往会随着时间发生变化,新增或删除节点与边、如科研学术网络、商品购买抽象出的异质图等,但是传统的方法往往都是在一种固定的图结构上做,如GCN、TGN等,难以在图结构的层次考虑到这种时序的关系,因此如果能进行一种动态图卷积来考虑不同时刻的不同图结构,可能可以提升学习的准确性,而很多动态图的文章都是基于时间片的,但是时间片难以划分,学习到时间的变化更好。因此我读了三篇比较经典的文章,分别为

DYREP: LEARNING REPRESENTATIONS OVER DYNAMIC GRAPHS, ICLR 2019

Predicting Dynamic Embedding Trajectory in Temporal Interaction Networks, KDD2019

TEMPORAL GRAPH NETWORKS FOR DEEP LEARNING ON DYNAMIC GRAPHS, maybe ICLR2021

二、DyRep

作者将图结构的变化分为两种过程,一种是Topological Evolution,即拓扑结构的变化,另一种是Node Interaction,即点和点的交互,这个想法很有意思,感觉确实能比较概括性的概括动态图的过程,而很直接的,作者提出了求出每个点Embedding的方法
z v ( t p ) = σ ( W s t r u c t h s t r u c t u ( t p ‾ ) + W r e c z v ( t p v ‾ ) + W t ( t p − t p v ‾ ) ) z^v(t_p) = \sigma(W^{struct}h_{struct}^u(\overline{t_p})+W^{rec}z^v(\overline{t^v_p})+W^t(t_p-\overline{t_p^v})) zv(tp)=σ(Wstructhstructu(tp)+Wreczv(tpv)+Wt(tptpv))
其中p是时间点,v是点v, t p ‾ \overline{t_p} tp指的是和点v在 t p t_p tp发生交互的之前的的上一个时间点。

假设对每个点求好了它的表征 z z z,作者定义了一种概率密度函数 λ k u , v ( t ) \lambda^{u,v}_k(t) λku,v(t),表示了u,v在t这个时刻有发生了事件,k=0表示发生了连边,k=1表示发生了交互,式子为
λ k u , v ( t ) = f k ( g k u , v ( t ‾ ) ) , 其 中 g k u , v = ω k T ⋅ [ z u ( t ‾ ) ; z v ( t ‾ ) ] ,   f k ( x ) = ψ k log ⁡ ( 1 + exp ⁡ ( x / ψ k ) ) \lambda^{u,v}_k(t) = f_k(g_k^{u,v}(\overline{t})),其中\\ g_k^{u,v}=\omega_k^T\cdot[z^u(\overline t);z^v(\overline t)],\ f_k(x)=\psi_k\log(1+\exp(x/\psi _k)) λku,v(t)=fk(gku,v(t))gku,v=ωkT[zu(t);zv(t)], fk(x)=ψklog(1+exp(x/ψk))
其中 ψ k \psi_k ψk是为了统一连边操作和交互操作的范围而学习的参数。值得一提的是,上面的这些表征可以理解为和时间t相关的函数。这样才能理解为什么时间t的概率密度可以通过上一个时间来求。

2.1 任务

先假设我们有了上面的一些式子,DyRep提出了两种任务,Dynamic Link Prediction以及Event Time Prediction

对于Dynamic Link Prediction

作者的目标是最优化它定义的在 t t t时刻发生关系的概率密度
f k u , v ( t ) = λ k u , v ( t ) ⋅ exp ⁡ ( ∫ t ‾ t λ ( s ) d s ) f_{k}^{u,v}(t) = \lambda^{u,v}_k(t)\cdot \exp (\int_{\overline t}^t\lambda(s)ds) fku,v(t)=λku,v(t)exp(ttλ(s)ds)
其中 λ ( s ) \lambda(s) λ(s)是s这个时刻发生事件的概率密度,文中讲到一般使用泊松过程来模拟,而 exp ⁡ ( ∫ t ‾ t λ ( s ) d s ) \exp (\int_{\overline t}^t\lambda(s)ds) exp(ttλ(s)ds)指的是在两个时间内没有任何事件发生的概率。

而对于Event Time Prediction

作者使用了Dynamic Link Prediction定义的 f k u , v ( t ) f_k^{u,v}(t) fku,v(t),并通过计算期望时间来计算发生的时间,即
t ^ = ∫ t ∞ t f k u , v ( t ) d t \hat t = \int _t^\infty t f_k^{u,v}(t)dt t^=ttfku,v(t)dt
先将任务主要感觉构造的还是很有趣的,而且如果记不住咋做了,记住任务怎么做,直接用也不错。

2.2 模型过程

z v ( t p ) = σ ( W s t r u c t h s t r u c t u ( t p ‾ ) + W r e c z v ( t p v ‾ ) + W t ( t p − t p v ‾ ) ) z^v(t_p) = \sigma(W^{struct}h_{struct}^u(\overline{t_p})+W^{rec}z^v(\overline{t^v_p})+W^t(t_p-\overline{t_p^v})) zv(tp)=σ(Wstructhstructu(tp)+Wreczv(tpv)+Wt(tptpv))

再次回顾这个式子,三个项里第三个指的是一个和时间相关的项,直接求即可,第二个项是一个自相关的项,通过自己和自己之前的表征进行卷积也直接求即可,第一个项指的是结构上聚合,重点显然是如何在结构上进行聚合,通过attention即可。

作者定义了一个矩阵 S ( t ) ∈ n × n S(t) \in n\times n S(t)n×n 表示点与点关系的强度,当聚合到点u时,通过这个矩阵计算注意力机制的系数 q u i ( t ) = exp ⁡ ( S u i ( t ‾ ) ) ∑ i ′ ∈ N u ( t ) exp ⁡ ( S u i ′ ( t ‾ ) ) q_{ui}(t)=\frac {\exp(S_{ui}(\overline t))} {\sum_{i'\in N_u(t)}\exp(S_{ui'}(\overline t)) } qui(t)=iNu(t)exp(Sui(t))exp(Sui(t)),以此来求得 h s t r u c t u ( t p ‾ ) = max ⁡ ( σ ( q u i ( t ) ⋅ h i ( t ) ) ) h_{struct}^u(\overline{t_p})=\max({\sigma(q_{ui}(t)\cdot h^i(t))}) hstructu(tp)=max(σ(qui(t)hi(t))),其中 i i i u u u的邻居, h i ( t ) = W h z i ( t ) + b h h^i(t)=W^hz^i(t)+b^h hi(t)=Whzi(t)+bh

对于矩阵S的更新过程如下图,A是图的邻接矩阵。大致为

如果是不相邻的点的交互,则不管;

如果是之前有边,也不管;

如果是相邻点的交互,则给两个点的 S u , v S_{u,v} Su,v加上前文定义的概率密度 λ k u , v ( t ) \lambda_k^{u,v}(t) λku,v(t),注意顺序有一些区别。

如果是连边操作,先给两个点的 S u , v S_{u,v} Su,v减去前文定义的概率密度 λ k u , v ( t ) \lambda_k^{u,v}(t) λku,v(t),注意顺序;其他与u或v连接的点,减去一个跟邻居集合大小相关的数即可。

在这里插入图片描述

三 JODIE

JODIE考虑了静态的Embedding即one hot编码,记作 u ‾ \overline{u} u,而将我们常常说的学到的表征即动态的表征记作了 u u u,而与此同时呢,它将t的上一个时刻发生的事件记作了 t − t^- t

3.1 对于表征的更新

由于JODIE考虑的二元关系,如用户和商品的关系,当u和i在t产生交互时,会更新他们两个的表征即
u ( t ) = σ ( W 1 u u ( t − ) + W 2 u i ( t − ) + W 3 u f + W 4 u Δ u ) i ( t ) = σ ( W 1 i i ( t − ) + W 2 i u ( t − ) + W 3 i f + W 4 i Δ i ) u(t) = \sigma(W_1^u u(t^-)+W_2^ui(t^-)+W_3^uf+W_4^u\Delta_u)\\ i(t) = \sigma(W_1^i i(t^-)+W_2^iu(t^-)+W_3^if+W_4^i\Delta_i) u(t)=σ(W1uu(t)+W2ui(t)+W3uf+W4uΔu)i(t)=σ(W1ii(t)+W2iu(t)+W3if+W4iΔi)
式子相对来说比较简单,f指的是这条连边的特征, Δ \Delta Δ指的是u发生两次更新的时间差。

3.2 对于预测未来最可能交互的点

JODIE比较巧妙的一点是考虑了点u在预测的时刻特征可能发生的变化。在预测点u在 Δ \Delta Δ时刻之后最有可能交互的点时,先计算了 w = W p Δ w=W_p\Delta w=WpΔ,并通过 u ^ ( t + Δ ) = ( 1 + w ) ∗ u ( t ) \hat u (t+\Delta) = (1+w)*u(t) u^(t+Δ)=(1+w)u(t)得到预测的u在 Δ \Delta Δ时刻之后预测的表征。

接着由于在JODIE的问题背景下,点的规模非常大,每次枚举每个点算连边概率复杂度较大,因此作者直接提出了一种计算预测交互的点的Embedding的方法,找最近的即可,即
j ~ ( t + Δ ) = W 1 u ^ ( t + Δ ) + W 2 u ‾ + W 3 i ( t + Δ − ) + W 4 i ‾ + B \tilde{j}(t+\Delta) = W_1 \hat u (t+\Delta)+ W_2\overline u + W_3 i (t+\Delta^-)+W_4\overline i + B j~(t+Δ)=W1u^(t+Δ)+W2u+W3i(t+Δ)+W4i+B
即考虑u这个点上一时刻的表征, u u u o n e h o t onehot onehot编码, i i i的最新的表征, i i i o n e h o t onehot onehot表征即可。

指的一提的是作者害提出了一种称作为T-batch的方法,选取互不相交的几个集合同时进行训练

四 TGN

TGN的作者则提出了一种比较统一的动态图的结构,并声称大多数算法都可以用这种结构来表示。

3.1 Memory部分

这一部分用来储存关于点 i i i历史的信息。

假设 i i i j j j t t t时刻发生了联系,则对点 i i i和点 j j j分别求一个关于这个信息的表征 m i , m j m_i,m_j mi,mj,即
m i ( t ) = m s g s ( s i ( t − ) , s j ( t − ) , Δ t , e i j ( t ) ) m j ( t ) = m s g d ( s j ( t − ) , s i ( t − ) , Δ t , e i j ( t ) ) m_i(t)=msg_s(s_i(t^-),s_j(t^-),\Delta t,e_{ij}(t))\\ m_j(t)=msg_d(s_j(t^-),s_i(t^-),\Delta t,e_{ij}(t)) mi(t)=msgs(si(t),sj(t),Δt,eij(t))mj(t)=msgd(sj(t),si(t),Δt,eij(t))
其中 s i s_i si s j s_j sj就是用来存储过去信息的表征, m s g msg msg可以是任意一种学习模型,如MLP等。

而又由于一个Batch一个点可能多次参与交互,因此还需一个聚合函数,来聚合一个batch内的信息,即
m ‾ i ( t ) = a g g ( m i ( t 1 ) , … , m i ( t b ) ) \overline m_i (t) = agg(m_i(t_1),\dots,m_i(t_b)) mi(t)=agg(mi(t1),,mi(tb))
聚合函数可以为最近的那一个或者平均值等

而最后更新一个点的memory部分,可以通过一个LSTM等的函数进行与之前这个点的memory聚合,即
s i ( t ) = m e m ( m ‾ i ( t ) , s i ( t − ) ) s_i(t) = mem(\overline m_i(t),s_i(t^-)) si(t)=mem(mi(t),si(t))

3.2 Embedding部分

当有了过去的信息之后通过某种embed函数即可聚合出一个点的表征,即
z i ( t ) = e m b ( i , t ) = ∑ j ∈ N i k [ 0 , t ] h ( s i ( t ) , s j ( t ) , e i j , v i ( t ) , v j ( t ) ) z_i(t) = emb(i,t) = \sum_{j\in N^k_i[0,t]}h(s_i(t),s_j(t),e_{ij},v_i(t),v_j(t)) zi(t)=emb(i,t)=jNik[0,t]h(si(t),sj(t),eij,vi(t),vj(t))
e m b emb emb的函数则有很多选择,如

  1. 直接使用3.1中的 s i ( t ) s_i(t) si(t)

  2. 使用 T i m e   E n c o d i n g Time\ Encoding Time Encoding的方式, e m b ( i , t ) = ( 1 + Δ w ) ∘ s i ( t ) emb(i,t)=(1+\Delta w)\circ s_i(t) emb(i,t)=(1+Δw)si(t)

  3. 使用 T e m p o r a l   G r a p h   S u m Temporal\ Graph \ Sum Temporal Graph Sum的方式,即
    h i l ( t ) = W 2 l ( h i l − 1 ∣ ∣ h ~ i l ( t ) ) , 其 中 h ~ i l ( t ) = R e L u ( ∑ j ∈ N i [ 0 , t ] W 1 l ( h j l − 1 ( t ) ∣ ∣ e i j ∣ ∣ ϕ ( t − t j ) ) ) h_i^{l}(t) = W_2^l(h_i^{l-1}||\tilde h _i^l(t)),其中\\ \tilde h _i^l(t) = ReLu(\sum_{j\in N_i[0,t]}W_1^l(h_j^{l-1}(t)||e_{ij}||\phi(t-t_j))) hil(t)=W2l(hil1h~il(t))h~il(t)=ReLu(jNi[0,t]W1l(hjl1(t)eijϕ(ttj)))

  4. 使用 T e m p o r a l   G r a p h   A t t e n t i o n Temporal\ Graph\ Attention Temporal Graph Attention的方法,

h i l ( t ) = W 2 l ( h i l − 1 ∣ ∣ h ~ i l ( t ) ) , 其 中 h ~ i l ( t ) = M u l t i H e a d A t t e n t i o n l ( q l ( t ) , K l ( t ) , V l ( t ) ) q l ( t ) = h i l − 1 ( t ) ∣ ∣ ϕ ( 0 ) K l ( t ) = V l ( t ) = C l ( t ) C l ( t ) = [ h 1 l − 1 ∣ ∣ e i 1 ( t 1 ) ∣ ∣ ϕ ( t − t 1 ) , … , h N l − 1 ∣ ∣ e i N ( t N ) ] h_i^{l}(t) = W_2^l(h_i^{l-1}||\tilde h _i^l(t)),其中 \\\tilde h _i^l(t) = MultiHeadAttention^l(q^l(t),K^l(t),V^l(t))\\ q^l(t) = h_i^{l-1}(t)||\phi(0)\\ K^l(t) = V^l(t)=C^l(t)\\ C^l(t) = [h_1^{l-1}||e_{i1}(t_1)||\phi(t-t1),\dots,h_N^{l-1}||e_{iN}(t_N)] hil(t)=W2l(hil1h~il(t))h~il(t)=MultiHeadAttentionl(ql(t),Kl(t),Vl(t))ql(t)=hil1(t)ϕ(0)Kl(t)=Vl(t)=Cl(t)Cl(t)=[h1l1ei1(t1)ϕ(tt1),,hNl1eiN(tN)]

其中 ϕ ( t − t ′ ) \phi(t-t') ϕ(tt)是一种 t i m e e n c o d i n g timeencoding timeencoding的方式。

五 一点想法

  1. 正如JODIE所说,一个点可能长时间的不被更新到,导致它的表征缺少了对当前状态的感知,因此如果所有点的表征都能在同一时刻得到更新,那么学习能力应该会强一些。
  2. 很多动态图的结构应该可以更宏观的看,某个时刻是A地区和B地区进行交互,我觉得这是一种dynamic graph pooling不过研究的人似乎很少,不过类似的graph coarsening 研究者倒是有一些。
  3. 很多动态图结构会随着时间变化存在周期性,这是动态子图的表示学习的范畴,我觉得可能会很有用。

六 参考文献

[1]DYREP: LEARNING REPRESENTATIONS OVER DYNAMIC GRAPHS, ICLR 2019

[2] Predicting Dynamic Embedding Trajectory in Temporal Interaction Networks, KDD2019

[3]TEMPORAL GRAPH NETWORKS FOR DEEP LEARNING ON DYNAMIC GRAPHS, maybe ICLR2021

ing Dynamic Embedding Trajectory in Temporal Interaction Networks, KDD2019`

[3]TEMPORAL GRAPH NETWORKS FOR DEEP LEARNING ON DYNAMIC GRAPHS, maybe ICLR2021

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
态代理可以在运行时动态地创建代理类和代理对象,可以避免在编译时就确定代理类的问题。使用动态代理调用方法可以实现以下几个方面的功能: 1. 在不改变原有代码的情况下,对原有代码进行增强,比如添加日志、权限控制等。 2. 避免代码重复,将一些通用的代码抽象出来,放到代理类中,减少代码冗余。 3. 隐藏真实对象的实现细节,保护真实对象的安全性。 举个例子,假设我们有一个UserService接口,其中有一个addUser方法用于添加用户。我们可以通过动态代理来实现对该方法的增强,比如在添加用户前后打印日志。具体实现代码如下: ```java public interface UserService { void addUser(String name); } public class UserServiceImpl implements UserService { @Override public void addUser(String name) { System.out.println("添加用户:" + name); } } public class UserServiceProxy implements InvocationHandler { private Object target; public UserServiceProxy(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("添加用户前打印日志"); Object result = method.invoke(target, args); System.out.println("添加用户后打印日志"); return result; } } public class Main { public static void main(String[] args) { UserService userService = new UserServiceImpl(); UserService proxy = (UserService) Proxy.newProxyInstance(userService.getClass().getClassLoader(), userService.getClass().getInterfaces(), new UserServiceProxy(userService)); proxy.addUser("Tom"); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值