作者:張張張張
github地址:https://github.com/zhanghekai
【转载请注明出处,谢谢!】
HAN源代码地址:https://github.com/Jhy1993/HAN
HAN论文地址:http://www.shichuan.org/doc/66.pdf
HAN是在GAT的基础上实现的,它的模型分为两部分:(1)节点级的注意力;(2)语义级的注意力。整个模型大致流程如下:首先确定元路径,使用元路径将异构图转换为同构图,邻接矩阵中两节点间有关系则为1,没有关系则为0;然后,对每一条元路径调用一次GAT模型,生成与元路径个数相同的nodeembedding,此过程成为节点级注意力机制(Node−levelAttention);最后,将生成的多个embedding进行一个单层神经网络训练,得到元路径的权重,此过程称为语义级注意力机制(Semantic−levelAttention)。
注意:邻接矩阵中记录的不再是两节点间的连通数。因为GAT原本是用于同构图的,只在乎两节点间是否有关系,以此来确定邻居节点,与路径数无关。
一、节点级注意力
节点级注意力机制其实就是原封不动的GAT模型,只不过是对每个元路径都调用了一次GAT而已。从HAN的Node−levelAttention部分我们可以看到,里面用的公式与GAT论文中的公式是一模一样的,只不过加上了确定元路径的角标。因为GAT的一个优点就是允许节点i为其不同的邻居节点赋予不同的权重,HAN把这个优点提取出来而已。不熟悉GAT的同学可以阅读我的另一篇博文【图结构】之图注意力网络GAT详解。在这里不多做赘述。
二、语义级注意力
当求出每一个元路径的embedding后,接下来就要对每个embedding计算权重,也就是论文中所说的语义级注意力机制(Semantic−levelAttention)。这部分的主要公式只有一个:
wΦi=∣V∣1i∈V∑qT⋅tanh(W⋅ziΦ+b)★
这个公式由于下标符号的原因,写的有点乱。等号左边的i和等号右边的i含义是不同的。wΦi表示元路径Φi的权重,这里的i表示元路径集合中第i个元路径;而等号右边的i代表每个节点(node),其中V表示节点的集合(论文中这个符号的解释在PRELIMINARY Definition 3.1.中)。我们分三部分解释这个公式:
(1)tanh(W⋅ziΦ+b):这是一个单层神经网络,输入层为ziΦ,表示在元路径Φ下得到的节点i的embedding,ziΦ是一个向量,大小为F′×1,F′为输出embeddng的维度。W是一个待训练的权重矩阵,即全链接神经网络中边的权重,大小为P×F′,其中P表示为元路径的数量。b是偏差向量。得到的结果是一个向量,假定它为Q,则Q的大小为P×1。
(2)qT⋅Q:qT是一个向量,大小为1×P,可以理解为又进行了一个单层的神经网络。
以上公式中的W和qT是被共享与所有的元路径和特定于语义的嵌入,目的是为了进行有意义的比较。也就是说,所有的nodeembedding都使用同一个神经网络以及里面的参数。
很多人到此仍然不明白这个公式为什么要这样写,不明白为公式(1)部分和公式(2)部分的作用。我对他的理解是:强行往语义路径上凑!。我们可以看到其实W和qT的维度大小其实对最后结果的维度大小是一样的,因为最后公式(2)完成后会得到一个数。最后的这个“数”的大小是固定的,W和qT起到的是中间过渡转换的作用,事实上,只要W的行数与qT的列数相同就可以了。
综上所述,正是由于共用同一套权重矩阵,才能够将不同的元路径联系起来。
(3)∣V∣1∑i∈VqT⋅Q:每个元路径的每个节点的embedding都会计算出一个数值,将这些数值求和并求平均,即可得到该元路径的权重。

在获得每个元路径的重要性之后,我们通过softmax函数对其进行归一化。通过使用softmax函数归一化所有元路径的重要性,可以得到元路径的权重。
βΦi=∑i=1Pexp(wΦi)exp(wΦi)
使用学习的权重作为系数,我们可以将这些特定于语义的嵌入融合在一起,以获得最终的嵌入Z。
Z=i=1∑PβΦi⋅ZΦi
通过半监督学习,对模型中的所有权重进行训练,最终得到一个提取好的nodeembedding。