本文是2021年发表于 IEEE TKDE 的一篇关于异构图嵌入学习的论文,该论文的亮点在于提出了一种动态自学习随机游走策略来学习异构图中的节点嵌入,这种做法摆脱了对先验知识和预定义元路径的依赖,学习异构图中每个节点对不同语义的敏感性,并通过实验证明,所提出的框架 SILK 在包括节点分类和聚类在内的几个任务上显著优于最先进的模型。
在对本篇论文的背景、目的进行详细阐述时,首先对涉及到的一些概念进行解释,这些概念包括:1)异构图;2)图嵌入;3)元路径;4)引导矩阵(本文定义的概念)。
异构图 Heterogeneous Graph
将由节点集 V V V 和边集 E E E 组成的异构图定义为 G = ( V , E ) G = (V, E) G=(V,E) ,其中,节点集与类型之间的关系满足映射函数 Φ : V → A \Phi: V \rightarrow \mathrm{A} Φ:V→A ,边集与类型之间的关系满足映射函数 φ : E → R \varphi: E \rightarrow \mathrm{R} φ:E→R , A A A和 R R R 分别表示预定义节点类型和边类型的集合,且需要满足: ∣ A ∣ + ∣ R ∣ > 2 |A| + |R| > 2 ∣A∣+∣R∣>2。
图嵌入 Graph Embedding
给定图 G = ( V , E ) G=(V,E) G=(V,E),图嵌入任务是学习每个节点 v ∈ V v \in V v∈V 的 d d d 维潜在表示,使得所学习的嵌入可以应用于下游任务,具体目标是找到函数 f : V → R d f:V \rightarrow R^{d} f:V→Rd,其中, d < < ∣ V ∣ d << |V| d<<∣V∣。该函数可以捕捉节点之间的结构和语义关系。
元路径 Meta-paths
元路径用于表示异构图中节点类型之间的组合关系,给定图 G = ( V , E ) G=(V,E) G=(V,E),图中节点类型和边类型为 T G = ( A , R ) T_{G} = (A, R) TG=(A,R),那么元路径的具体形式可以表示成: A 1 ⟶ R 1 A 2 ⟶ R 2 ⋯ ⟶ R l A l + 1 {A}_{1} \stackrel{{R}_{1}}{\longrightarrow} {A}_{2} \stackrel{{R}_{2}}{\longrightarrow} \cdots \stackrel{{R}_{l}}{\longrightarrow} {A}_{l+1} A1⟶R1A2⟶R2⋯⟶RlAl+1。
引导矩阵 Guidance Matrix
对于异构图中具有多个类型邻居的节点 v i v_{i} vi,引导矩阵量化了每个节点类型对 v i v_{i} vi 的重要性。通过执行 softmax 函数,引导矩阵 M M M 被定义为 M ∈ R ∣ V ∣ × ∣ A ∣ , M i j ∈ [ 0 , 1 ] M \in R^{|V| \times|\mathrm{A}|}, M_{i j} \in[0,1] M∈R∣V∣×∣A∣,Mij∈[0,1],其可以指从节点 v i v_{i} vi 到类型 a j a_{j} aj 的转换概率,在引导矩阵中,每一行相加等于1, M i j ∈ [ 0 , 1 ] M_{ij} \in [0, 1] Mij∈[0,1] 表示节点类型 a j a_{j} aj 对于节点 v i v_{i} vi 的重要性。
在图嵌入研究工作方面,早期的工作主要关注于同构图(homogeneous graphs),这类图中,每个节点被视为同一类型,连边关系单一,需要考虑的条件较少,但在现实中很多应用场景属于异构图(heterogeneous graphs)的范畴,因此,同构图的方法很难有效迁移到异构图的应用场景。虽然近年来有许多方法开始学习异构图上的图嵌入任务,但是许多方法都主要依赖于元路径(meta-paths),在这些方法中,定义元路径需要先验的领域知识(即需要事先知道图中涉及到哪些节点类型,以及各类节点中可能存在的连边关系),这使得这种方法难以在一些没有仍然先验知识的情况下被很好地应用。此外,元路径的静态特性排除了对节点之间的多样和复杂的内在关联进行建模的能力,即使是同一类别的节点,以下图为例子。
在图中 Author a 1 a_{1} a1 与 a 2 a_{2} a2 的关联是因为他们有相同的 Conference,对应的元路径是 APCPA,而 Author a 3 a_{3} a3 与 a 4 a_{4} a4 的关联是因为他们有相同的 Term,对应的元路径是 APTPA,这意味着固定和预定义的元路径在现实场景中可能会失败,因为在许多情况下节点之间的互连是非唯一的。
当然,最近一些研究工作也开始尝试去除对元路径的依赖,如 JUST [1]的方法依赖于具有跳跃和停留策略的随机游走,通过跳到另一个域的节点或停留在同一域内来选择下一个节点,以平衡节点分布。然而,它并没有关注各种语义,且忽略了一个事实:即使相同类型的节点也可能对不同的域敏感,这使得该方法的嵌入表现较差。
基于此,本文提出了一种新的异构图嵌入自学习方案(self-learning scheme),称为self-guided walk(SILK),该方案不需要先验知识或监督,绕过元路径并学习节点步行的自适应注意,通过自我引导的注意力机制来探索语义,分别学习每个节点对不同语义的敏感性,考虑了节点条件注意(node-conditioned attentions),而不是类型条件注意(type-conditioned ones)。
本文贡献
提出针对异构图嵌入的第一种专用自学习方法
该方法不需要事先的领域知识或监督,并以无监督的方式学习。
进行了大量的实验来评估所提出的模型的性能
实验结果表明,SILK框架在包括节点分类和聚类在内的几个任务上显著优于最先进模型。
目前,图嵌入研究方面主要可分为两大类:同构(homogeneous)和异构(heterogeneous)。
在同构图嵌入方面,早期的代表性框架如:DeepWalk[2]、LINE[3]、Grarep[4]等,尝试通过随机游走(random walk)和 skip-gram(该模型最大化了出现在某个上下文窗口内的节点对的共现概率)来捕捉图的接近度,或者通过奇异向量分解对图邻接矩阵进行因子分解。而最近随着图神经网络的兴起,出现了一种用来训练特定任务的端到端模型,如 GCN[5],使用卷积运算来合并邻居的嵌入。这些算法由于将图中的节点看作同一类型,因此,忽视了图中节点和连边的多样性,为了解决这种不足,图嵌入研究出现了针对异构图的工作。
在异构图嵌入方面,现有的方法主要集中于保持基于元路径的近似,如 Metapath2vec[6] 首先设计元路径来引导随机行走。HIN2Vec[7] 通过在固定长度内组合元路径来执行不同的任务。HERec[8]提出了基于约束元路径的随机游动来过滤有意义的语义。RHINE[9] 定义了从属关系和交互关系,并分别对它们进行了训练。具有深度结构的半监督方法也广泛用于异构图嵌入,HAN[10]首先在节点级和语义级采用了注意机制,GTNs[11]通过卷积产生了强大的节点表示。尽管上述方法中的一些可以自主选择元路径,但它们仍然需要作为参数的先验知识,如元路径长度或节点标签,这会严重影响结果。另外,在元路径不清晰的情况下,很难获得节点标签,因此这种方法的有效性也会大大降低。
SILK的整个框架包括引导矩阵的构建、引导矩阵的使用(引导随机游走策略和skip-gram对嵌入表示的更新)、引导矩阵的优化与更新。SILK的思想步骤可以分为:
(1)建立引导矩阵(The Guuidance Matrix)
这个引导矩阵的作用是记录以无监督方式学习的基于节点的转移概率,在训练期间,SILK 首先设置相同的转移概率来初始化引导矩阵。
(2)使用引导矩阵
基于初始化好的引导矩阵,通过采样(具体采样方式在【方法实现】模型会介绍)来执行随机行走,之后SILK从生成的包含多个类型节点的随机游走序列中提取每个节点类型的单个类型序列及其类型路径(single-type walk 和 type-path)。利用 single-type walk 来训练 skip-gram 模型对节点嵌入的学习,利用 type-path 来辅助更新引导矩阵。
(3)引导矩阵的优化与更新
在更新与优化节点,通过基于类路径(type-path)的邻居嵌入来计算每个节点类型的重要性(可以更好地捕捉同一域的节点对之间的接近度),再利用 softmax 函数更新引导矩阵,该函数将节点类型的重要性转换为转移概率。这个过程反复进行,直到指导矩阵稳定为止。
本文提出的 SILK 框架主要由三个具体的实现模块组成:
1)Self-guided Walk;2)Skip-gram;3)Model Optimization
在进入第一模块前,需要先对引导矩阵进行初始化,即对于每个节点有: M i j = 1 ∣ A ∣ M_{i j}=\frac{1}{|\mathrm{A}|} Mij=∣A∣1 。
Self-guided Walk 模块主要用于生成异构图随机游走序列。在生成序列的过程中,本文的方法主要分为了两个步骤,第一是基于当前节点,选择下一跳的节点类型;第二是基于下一跳的节点类型,选择下一跳的具体节点。
(1)选择 next type
在这一步中,本文考虑了平衡遍历序列中的节点类型分布,并允许该序列包含尽可能多的有效语义,基于此,本文使用两个步骤选择下一个节点类型:
生成候选节点类型集合
基于随机游走的当前节点 v i v_{i} vi,限制 v i v_{i} vi 的候选节点类型,将候选集表示为 A s e l e c t ( v i ) \mathcal{A}_{select}(v_{i}) Aselect(vi)。在生成候选集 A s e l e c t ( v i ) \mathcal{A}_{select}(v_{i}) Aselect(vi) 之前,本文定义了一个指数衰减函数 g ( n ) = α n g(n) = \alpha^{n} g(n)=αn,其中 α ∈ [ 0 , 1 ] \alpha \in [0, 1] α∈[0,1] 表示控制 g ( n ) g(n) g(n) 随 n n n 减少的速度的初始修正概率(超参数),参数 n n n 表示 A s a m e \mathcal{A}_{same} Asame 中的节点数。同时,本文还定义了一个随机数 r ∈ ( 0 , 1 ) r \in (0, 1) r∈(0,1)。
在开始生成候选集 A s e l e c t ( v i ) \mathcal{A}_{select}(v_{i}) Aselect(vi)时,考虑指数衰减函数与随机数之间的关系:当 g ( n ) > r g(n) > r g(n)>r 时,本文认为此时节点类型是比较平衡的,因此,候选集 A s e l e c t ( v i ) \mathcal{A}_{select}(v_{i}) Aselect(vi)可以包含所有类型的节点。而随着游走的进行,游走序列中会有来自相同类型的节点,然后函数 g ( n ) g(n) g(n) 随 n n n 快速衰减。当 g ( n ) < r g(n) < r g(n)<r 时,游走序列的节点分布已经处于不平衡状态,这时需要添加约束条件来筛选节点类型(利用 Algorithm 1生成候选集 A s e l e c t ( v i ) \mathcal{A}_{select}(v_{i}) Aselect(vi))。
进一步理解上述的具体过程:在生成候选节点类型集时,【首先】在历史遍历序列中获取最近 m m m 个以前访问过的节点,并利用这 m m m 个节点定义一个包含历史序列中最频繁的节点类型的列表 A s a m e \mathcal{A}_{same} Asame,其中, a s a m e = A s a m e ( − 1 ) a_{same} = \mathcal{A}_{same}(-1) asame=Asame(−1) 指 A s a m e \mathcal{A}_{same} Asame 中最近的节点类型。【接着】判断 g ( n ) g(n) g(n) 与 r r r之间的关系。如果 g ( n ) ≥ r g(n) \geq r g(n)≥r,则候选节点类型集合可以包含 A A A 中的所有节点类型,即候选集是全体节点类型(比如在初始状态下,没有被访问的节点,那么列表 A s a m e \mathcal{A}_{same} Asame 是空的并且 n = 0 n=0 n=0,于是有 g ( n ) = 1 > r g(n)=1 > r g(n)=1>r );如果 g ( n ) < r g(n) < r g(n)<r,则候选节点类型集 A s e l e c t ( v i ) \mathcal{A}_{select}(v_{i}) Aselect(vi) 中的节点类型需要满足以下三个条件:
(1)类型 a j ∈ A a_{j} \in A aj∈A
(2)节点 v i v_{i} vi 有类型 a j a_{j} aj 的邻居
(3)类型 a j ∉ A s a m e a_{j} \notin \mathcal{A}_{same} aj∈/Asame
这意味着 a j a_{j} aj 不是最常访问的节点类型之一。如果没有候选节点类型,可以将第三个条件放宽为 a j ≠ a s a m e a_{j} \neq a_{same} aj=asame,否则,必须选择 a s a m e a_{same} asame,因为节点 v i v_{i} vi 只有 a s a m e a_{same} asame 类型节点的边,下面以论文中的例子进行进一步地说明。
如上图所示,当 m = 2 m=2 m=2 时,历史列表为 { a 1 , p 4 , a 2 } \{ a_{1}, p_{4}, a_{2} \} {a1,p4,a2},此时 A s a m e = { a } \mathcal{A}_{same} = \{a\} Asame={a},且 n = 2 n = 2 n=2,如果此时满足 g ( 2 ) < r g(2) < r g(2)<r,那么需要生成候选集,根据候选条件可知,当前候选集是 A s e l e c t = { c , t } \mathcal{A}_{select} = \{ c,t \} Aselect={c,t}。
确定下一跳节点类型
在获得候选节点类型集 A s e l e c t ( v i ) \mathcal{A}_{select}(v_{i}) Aselect(vi) 之后,节点类型 a j a_{j} aj 被选择为下一个节点类型的概率是:
Pr j ( v i ) = { 0 , if N i j is empty 1 , if { N i q is empty for all a q ∈ A except a j } M i j , otherwise \operatorname{Pr}_{j}\left(v_{i}\right)=\left\{\begin{array}{l}0, \text { if } \mathcal{N}_{i}^{j} \text { is empty } \\1, \text { if }\left\{\mathcal{N}_{i}^{q} \text { is empty for all } a_{q} \in \text { A except } a_{j}\right\} \\M_{i j}, \text { otherwise }\end{array}\right. Prj(vi)=⎩⎨⎧0, if Nij is empty 1, if {Niq is empty for all aq∈ A except aj}Mij, otherwise
其中 N i j \mathcal{N}^{j}_{i} Nij是 v i v_{i} vi 的 a j a_{j} aj 类型邻居。上面的公式表明:首先,在 v i v_{i} vi 与 a j a_{j} aj 类型的节点没有连接的情况下,选择 a j a_{j} aj 的概率为0;其次,在 v i v_{i} vi 仅与 a j a_{j} aj 型节点连接的情况中,选择下一个类型是 a j a_{j} aj 的可能性为1。最后,在大多数情况下, v i v_{i} vi 有各种类型的邻居,包括节点类型 a j a_{j} aj,则根据引导矩阵 M M M 中的值从候选节点类型 A s e l e c t ( v i ) \mathcal{A}_{select}(v_{i}) Aselect(vi) 中选择下一个节点类型。以这种方式,walker 可以为当前节点 v i v_{i} vi 选择更有价值的邻居类型。
(2)选择 next node
当选择完下一个节点类型后, A s a m e , n \mathcal{A}_{same},n Asame,n 将会随之更新,这时需要从候选节点集合(满足【属于选出的节点类型】且【属于当前节点的邻居】的节点)中选择下一个游走的节点。
考虑到节点中心性(node centrality,本文使用节点的度来衡量)是衡量大多数真实世界长尾分布数据中节点重要性的有效方法,以DBLP图为例,对于DBLP中的作者节点(author nodes),作者与论文之间的联系程度遵循长尾分布。大多数作者发表少量论文,只有少数作者与大量论文有关。通过这些节点,walker 可以在图中获取更多信息,这意味着作者的价值可以通过发表论文的数量来衡量,这也可以通过其节点度来表示。然而,对于会议节点(conference nodes),它们的节点度不符合长尾分布,这意味着不能使用节点中心度来衡量节点重要性。对于前一种情况,本文统一采样其度在前 β % \beta \% β% 的节点。对于后一种情况,通过随机采样一个节点作为下一个节点来继续遍历。在实践中,本文将为不同的数据集选择不同的节点中心性度量。
在基于引导矩阵 M M M 生成步行序列之后,步行序列包含多个类型的节点,考虑到来自同一节点类型的训练对可能需要跨异构边的若干跳进行关联,这不利于捕获嵌入中的邻近度以执行节点分类和聚类。因此,本文通过为每个节点类型生成单个类型序列(图中Sequence)及其类型路径(图中Type-Path),从原始序列中提取信息。通过将其他节点转换为节点类型信息并将其记录为类型路径,可以获得仅包括当前类型 a c a_{c} ac 及其类型路径的节点的最终训练序列,通过该序列可以定义对之间的关系类型,现在以DBLP图为例进行解释:
如图所示,在原始游走序列的基础上,可以为 skip-gram 模型生成 Paper 类型节点序列(图中Sequence),基于获取的单类型节点序列(图中 Sequence),使用 skip-gram 学习节点嵌入。给定长度为 l l l、窗口大小为 w w w的随机游动序列,假设游动序列 W = ( v 1 , . . . , v l ) W = (v_{1}, ..., v_{l}) W=(v1,...,vl),将节点 v i v_{i} vi 的上下文节点表示为 C = { v j ∣ v j ∈ W , ∣ i − j ∣ ≤ w , i ≠ j } C=\{ v_{j} | v_{j} \in W, |i-j| \leq w, i \neq j \} C={vj∣vj∈W,∣i−j∣≤w,i=j} ,则上下文节点 v j v_{j} vj 的共现概率(co-occurrence probability)被定义为:
Pr ( v i , v j ) = σ ( e i → ⋅ e j → ) \operatorname{Pr}\left(v_{i}, v_{j}\right)=\sigma\left(\overrightarrow{e_{i}} \cdot \overrightarrow{e_{j}}\right) Pr(vi,vj)=σ(ei⋅ej)
其中, σ ( x ) = 1 / ( 1 + exp ( − x ) ) \sigma(x)=1 /(1+\exp (-x)) σ(x)=1/(1+exp(−x)) 是 sigmoid 函数, e i → , e j → \overrightarrow{e_{i}}, \overrightarrow{e_{j}} ei,ej 分别是节点 v i v_{i} vi 和 v j v_{j} vj 的嵌入,模型优化的目标是最大化对数似然函数:
log ( Pr ( v i , v j ) , v j ∈ C ) = ∑ v j ∈ C log Pr ( v i , v j ) \log \left(\operatorname{Pr}\left(v_{i}, v_{j}\right), v_{j} \in C\right)=\sum_{v_{j} \in C} \log \operatorname{Pr}\left(v_{i}, v_{j}\right) log(Pr(vi,vj),vj∈C)=vj∈C∑logPr(vi,vj)
之后,在skip-gram中采用负采样,以最大化节点 v i v_{i} vi 和随机采样的负节点 v j v_{j} vj 不出现在随机游动序列 W W W 集合中的概率,其中负样本 v N v_{N} vN 通常根据 W W W 中的经验节点分布均匀获得,这里将目标函数 l o g P r ( v i , v j ) logPr(v_{i},v_{j}) logPr(vi,vj) 近似为:
L = log Pr ( v i , v j ) + ∑ s = 1 S E v N [ log Pr ( v i , − v N ) ] \mathcal{L}=\log \operatorname{Pr}\left(v_{i}, v_{j}\right)+\sum_{s=1}^{S} \mathbb{E}_{v_{N}}\left[\log \operatorname{Pr}\left(v_{i},-v_{N}\right)\right] L=logPr(vi,vj)+s=1∑SEvN[logPr(vi,−vN)]
其中, S ∈ Z + S \in \mathbb{Z}^{+} S∈Z+ 指的是负样本的数量, v N v_{N} vN 是从不在 C C C 中的节点随机抽取的。skip-gram通过异步随机梯度下降(ASGD)并行优化。
在完成了利用 skip-gram 模型对节点嵌入表的更新后,就需要尝试通过学习到的嵌入表示来更新引导矩阵 M M M,这个过程的主要问题是如何表达节点类型 a j a_{j} aj 对节点 v i v_{i} vi 的重要性。在本文中,使用 v i v_{i} vi 与其 a j a_{j} aj 类型邻居之间的距离来衡量节点类型 a j a_{j} aj 对节点 v i v_{i} vi 的重要性。这里论文举例一个例子来说明这种做法的可行性:
IMDB数据集实例
例如,在IMDB数据集中,演员可以通过导演或电影相互联系。当演员 v a v_{a} va 更倾向于出演同一类型的电影时,他/她将与与电影相关的其他演员更相似,例如 v b v_{b} vb。因此,可以通过测量 v a v_{a} va 和 v b v_{b} vb 之间的相似性来定义电影类型 a m a_{m} am 对 v a v_{a} va 的重要性。
基于上述的想法,本文开始使用到上一步中另外一组序列,即类型路径序列(图中Type-Path)。
这里需要注意:对于同质游走序列的特殊情况: v c − v c − v c − . . . v^{c} - v^{c} - v^{c} - ... vc−vc−vc−... (节点类型为 a c a_{c} ac),将生成类型路径: a c − a c − . . . a_{c} - a_{c} - ... ac−ac−...,而如果存在多个最频繁的节点类型,例如,当 ( p 1 , p 5 ) (p_{1}, p_{5}) (p1,p5) 之间的类型路径为 T = T − T − A − A T = T - T- A -A T=T−T−A−A 时, p 5 p_{5} p5将被分组至 p 1 p_{1} p1 的具备A型和T型的相邻集。
在生成单类型序列并将其转换为具有固定窗口大小的单类型对之后,我们还保存了每对之间的类型路径。比如 p 1 p_{1} p1 和 p 5 p_{5} p5 之间的路径是 C − T − A − A C−T−A−A C−T−A−A, 对于每个节点对,其关系可以定义为路径中出现频率最高的节点类型。例如, p 1 p_{1} p1 和 p 5 p_{5} p5 之间的关系是 A A A, p 5 p_{5} p5 是 p 1 p_{1} p1 的 A A A 型邻居。现在假设 a j a_{j} aj 对 v i v_{i} vi 的重要性是 u i j u^{j}_{i} uij,则定义如下:
u i j = mean ( { e q → , v q ∈ N i j } ) ⋅ e i → u_{i}^{j}=\operatorname{mean}\left(\left\{\overrightarrow{e_{q}}, v_{q} \in \mathcal{N}_{i}^{j}\right\}\right) \cdot \overrightarrow{e_{i}} uij=mean({eq,vq∈Nij})⋅ei
其中, e i → \overrightarrow{e_{i}} ei 和 e q → \overrightarrow{e_{q}} eq 分别是节点 v i v_{i} vi 和 v q v_{q} vq 的嵌入。 N i j \mathcal{N}^{j}_{i} Nij 是节点 v i v_{i} vi 的 a j a_{j} aj 类型邻居,平均聚合器用于聚合来自所有 a j a_{j} aj 类型的邻居的信息。由于最终用来引导随机游动的从 v i v_{i} vi 到 a j a_{j} aj 的转换概率需要在 [0,1] 之间,因此对每个 a j a_{j} aj 采用 softmax normalization 来指定概率值。因此,可以得到如下式子来更新指导矩阵 M M M:
M i j = s o f t m a x ( u i j ) = e x p ( u i j ) ∑ a t ∈ A e x p ( u i t ) M_{ij} = softmax(u^{j}_{i}) = \frac{exp(u^{j}_{i})}{\sum_{a_{t} \in A}exp(u^{t}_{i})} Mij=softmax(uij)=∑at∈Aexp(uit)exp(uij)
为了确保训练中模型的收敛性,在每次迭代后记录指导矩阵 M M M,并通过估计两个矩阵之间的每行距离来计算矩阵更新后的差值,并记录节点类型概率变化大于阈值 0.3 的节点数量。当数量停止减少时,该模型将被重新训练以确保引导矩阵正确收敛;如果该数字小于10%,则迭代将停止。由于随机游动过程,所以无法直接证明算法的收敛性。然而,本文使用的真实世界数据集上的大量实验结果表明,通过迭代训练两步优化过程和两步选择自引导行走,可以获得稳定的引导矩阵 M M M 和保持结构和语义的节点嵌入,Algorithm 2 给出了 SILK 的整个过程。
[1] JUST:Are meta-paths necessary?: Revisiting heterogeneous graph embeddings
[2] DeepWalk:Deepwalk: Online learning of social representations
[3] LINE:Line: Large-scale information network embedding
[4] Grarep:Grarep: Learning graph representations with global structural information
[5] GCN:Semi-supervised classification with graph convolutional networks
[6] Metapath2vec:metapath2vec: Scalable representation learning for heterogeneous networks
[7] HIN2Vec:Hin2vec: Explore meta-paths in heterogeneous information networks for representation learning
[8] HERec:Heterogeneous information network embedding for recommendation
[9] RHINE:Relation structure-aware heterogeneous information network embedding
[10] HAN:Heterogeneous graph attention network
[11] GTNs:Graph transformer networks