STRUC2VEC(图结构→向量)论文方法解读
STRUC2VEC
原文:struc2vec: Learning Node Representations from Structural Identity
捕捉节点在网络中的结构信息,将它表达成一个高维向量,需要考虑以下两个相关的性质:
- 不同节点的表达之间的距离(也就是高维向量之间的距离)应该跟他们的结构之间的相似度高度相关。
- 节点的这种结构表达,不应该依赖于节点或者边的属性以及它们的标签。节点的结构信息应该跟他们在网络中的位置不相关。
STRUC2VEC的基本步骤:
在不同的邻域大小下,比较图中的每个节点之间的结构相似度。
产生一个结构相似度度量的多层模型(hierarchy)。
构造一个带权的多层图,网络中所有的节点都会出现在每一层,每一层都会和度量结构相似度的多层模型(hierarchy)的每一级相对应。然后带权多层图的边的权重和该边相关的节点对之间的距离成反比。
使用上述的多层图生成每个节点的上下文。用带偏的 random walk 来生成多层图的节点序列。
使用某种技术,通过节点序列给出的上下文来学习潜在表达
第一步:度量结构相似度
表示了节点的级邻域。
则表示节点的集合的度数序列。
度量了两个度数序列之间的距离
表示了两节点之间,级邻域(距离小于等于的节点和所有它们之间的边)的结构距离。
上述定义表达的是一个递归的过程,把问题转换成了如何定义两个节点集合之间的距离,也就是该如何计算。
文章使用了 Dynamic Time Warping(DTW)来度量两个度数序列之间的距离。
序列 A 和 B,其中,,,那么之间的距离定义为:,当时,他们的距离也就是 0。然后两个序列之间的距离,也就是所有组合之间的距离和。
其他方案也可以用在该框架下,感觉这里的时间复杂度相对较高,可以有替换的方案。VIGOR 论文中提到的方法?
第二步:构造上下文图(context graph)
构造一个带权的多层图。层数由,其中表示的是图的直径,也就是原始图中节点之间的最远距离。
第层图表达的是节点之间级邻域的相似度度量。
故而的每一层都是一个完全图,都会有个节点,边的数量是,边的权重的定义:
当然,只有定义了,边才能被定义。
因为最小是 0,那么边的权重的取值范围是,当等于 1 时,代表两个节点结构相同。
不同层级之间,通过有向边连接,在层的每个节点都会跟层和层的相同节点用有向边连接,边的权重定义:
- 其中代表了指向节点的权重大于层图平均权重的边的数量:,也就是度量了该节点和第层其他节点之间的相似度。
- 而
第三步:生成节点的上下文
利用生成节点的上下文的过程:带偏的随机游走(biased random walk)。
首先需要决定,随机游走的这一步,是留在当前层还是换层
有一定概率,留在当前层,假设留在当前层,那么从节点走到的概率(权重越大,概率越高,也就是更容易走到相似节点上):
p_k(u,v) = \frac{e^{-f_k(u,v)}}{Z_k(u)}$$,$$Z_k(u)=\sum_{v \in V, v ≠ u} e^{-f_k*(u,v)}
假设在另一半概率上,换层,换到的概率定义:
而换到层的概率:
当节点走到层时,产生的 context 可能只是前层产生的 context 的一个子集,所以这种情况下,并不没有贡献
每次随机游走从第 0 层开始,游走步数都是一个固定的,较小的值,然后随机游走会在同一个节点上重复多次,产生多个独立的游走
第四步:学习语言模型
通过 word embedding 的方法,对第三步生成的随机游走结果,生成高维向量。
文章使用了Skip-Gram[^1]。
[^1]: Mikolov, Tomas, et al. "Efficient estimation of word representations in vector space." arXiv preprint arXiv:1301.3781 (2013).