嵌入(embedding)方法是目前文本分析,知识图谱相关中非常常见的一种算法。其为表示学习的一类方法,可以自动地从数据中学习“有用”的特征,并可以直接用于后续的具体任务。后面学习的相关嵌入学习均为表示学习中的内容。
节点嵌入
关于图的一些信息如何能够转化为计算机可以识别的语言呢?通常的方法也是进行嵌入(embedding)。在此之前,我们已经学习了双曲嵌入:
其将图结构嵌入到双曲空间中而后根据双曲距离进行embedding的训练。这种做法其实是一种比较新的方法,而在此之前的那些传统的节点嵌入方法都没有进行学习。因此,基于双曲空间的节点嵌入方法,本系列博客不再进行具体介绍。
总体而言,节点的嵌入通常采取编码-解码结构进行训练。编码示意图如下:
总体的编解码核心思路如下:
- 编码器ENC定义了一个从图中的节点 u , v u, v u,v到一个空间中的嵌入 z u , z v \mathbf{z}_{u}, \mathbf{z}_{v} zu,zv的映射;
ENC ( v ) = z v \text{ENC}(v) = \mathbf{z}_{v} ENC(v)=zv
- 定义一个节点相似度函数(即原始网络中的相似度度量, similarity);
- 解码器DEC定义一个从嵌入到相似度评分的映射;
- 通过编码器优化参数,使得下式左右两边尽可能接近:
similarity ( u , v ) ≈ z v T z u \operatorname{similarity}(u, v) \approx \mathbf{z}_{v}^{\mathrm{T}} \mathbf{z}_{u} similarity(u,v)≈zvTzu
左式表示原始网络中节点 u , v u, v u,v的相似度;右式表示解码后的相似度评分。
基于随机游走的方法
1. DeepWalk
DeepWalk方法受到 word2vec 的启发,首先选择某一特定点为起始点,做随机游走得到点的序列,然后将这个得到的序列视为句子,用 word2vec 来学习,得到该点的表示向量。DeepWalk通过随机游走去可以获图中点的局部上下文信息,因此学到的表示向量反映的是该点在图中的局部结构,两个点在图中共有的邻近点(或者高阶邻近点)越多,则对应的两个向量之间的距离就越短。
图上的随机游走:给定一个图和一个起点,我们随机选择它的一个邻居,并移动到这个邻居;接着我们随机选择这一点的一个邻居,然后继续移动到它,重复这个操作。以这种方式访问的(随机)节点序列是图上的一个随机游走。
我们的目标是学习到一个映射 f : u → R d : f: u \rightarrow \mathbb{R}^{d}: f:u→Rd: f ( u ) = z u f(u)=\mathbf{z}_{u} f(u)=zu
Log-likelihood 定义如下:
max f ∑ u ∈ V log P ( N R ( u ) ∣ z u ) \max _{f} \sum_{u \in V} \log \mathrm{P}\left(N_{\mathrm{R}}(u) \mid \mathbf{z}_{u}\right) fmaxu∈V∑logP(NR(u)∣zu)
- N R ( u ) N_{R}(u) NR(u) 是从节点 u u u 出发,通过游走策略 R R R 所能到达的节点。给定节点 u u u,我们想要学习的特征表示是节点对随机游走邻居 N R ( u ) N_{R}(u) NR(u)的预测。直觉上,我们的优化目的是要使得从