深蓝学院-GNN课程笔记03-图嵌入
这个系列是深蓝学院图深度学习理论与实践的同步课程笔记。课程内容涉及图深度学习的基础理论与应用,本节主要介绍图嵌入的相关内容。
图嵌入的通用框架
图嵌入(graph embedding)的目的是将图上的每个节点映射为一个向量,这个向量也称为节点嵌入(node embedding)。最简单的嵌入方法是使用邻接矩阵的对应列作为嵌入,但由于邻接矩阵往往是非常稀疏的这样的嵌入方式在计算和存储上效率都很低。因此我们希望能够在图上找到一个低维的节点嵌入,使得嵌入后的节点向量能够保留原始图上的一些信息。

第一代图嵌入方法是基于图拉普拉斯矩阵的谱分解来实现嵌入。它的核心思想是对拉普拉斯矩阵进行矩阵分解,从而实现对数据进行降维。这种嵌入方法的主要缺陷在于它具有非常高的计算复杂度,因此难以应用到大规模的图上。

第二代图嵌入方法则是来源于自然语言处理中的词向量(word2vec)技术。词向量是利用语料中词的共现信息来对词进行嵌入,它的基本思想是同时出现的词会具有相似的语义。把词向量的思想应用到节点嵌入中就得到了第二代图嵌入技术,和第一代嵌入技术相比第二代图嵌入技术通常比较高效而且具有更好的拓展性。

从宏观上来看,图嵌入需要解决两个基本问题:需要保留图上的哪些信息以及如何取保留这些信息。常用的信息包括共现信息、结构角色、社区信息以及节点状态等,而在对信息进行重构时则需要保证嵌入后的结果与嵌入前尽可能一致。因此图嵌入的通用框架需要4个关键组件:
- 映射函数
将图域节点映射到嵌入域 ; - 提取图上关键信息
的信息提取器; - 利用嵌入域
重新构造所提取到的信息,构造的信息记为 ; - 对提取到的信息
和重构信息 进行优化,学习映射函数 的参数。

简单图嵌入
保留邻域信息
DeepWalk是基于节点共现信息来实现图嵌入的方法。对于没有方向且只包含节点连接信息的简单图,我们可以利用图上的随机游走(random walk)来模拟共现语料的效果。定义当前节点
也就是说在
其中
将序列中的共现概率累乘起来可以得到似然函数:
我们可以通过最大化似然函数来重构嵌入后的共现信息。在实际应用中更常见的形式是最小化对数损失来实现训练过程:
DeepWalk训练时的主要难点在于分母项
分层softmax的思想是将图上的每个顶点表示为一颗二叉树的叶节点,这样顶点的转移概率可以转换为二叉树上一系列路径的乘积:
当路径选择向左前进时,对应的概率为:
类似地,选择向右的概率为:
此时我们不再学习顶点的两个映射函数

另一种加速方法是负样本采样,它的核心思想是将多分类转换为二分类问题来求解。随机游走的目的是提高共现顶点出现的概率,因此我们可以把共现的顶点视为正样本并且把没有直接相连的样本视为负样本,这样得到二分问题的目标函数:
其中
除了DeepWalk算法之外还有一些其它的基于顶点共现信息的图嵌入方法。如LINE算法使用边的集合来提取共现信息,而node2vec算法则采用二阶随机游走来提取共现信息,在进行游走时允许回溯到之前的顶点:
上式意为从当前顶点回溯到之前顶点的倾向性为
保留结构角色
在很多应用中我们希望具有相似结构特征的顶点在嵌入后仍然是相似的,而struc2vec就是这样的一种基于结构特征的图嵌入算法。首先我们需要去衡量不同顶点在图上的结构相似度,直观上看相似的顶点需要具有相近的度,而且它们邻居的度也应该相似。

在这种观察的基础上,struc2vec提出了一种层次化的结构相似度度量方法:
上式中
在此基础上我们可以定义一个包含
同时每个顶点还与它上下两层的同一顶点相连,对应边的权重为:
其中
构造出新的图后我们就可以在新图上进行随机游走,然后类似于DeepWalk的步骤提取共现信息并进行训练即可获得保留图结构信息的嵌入。
保留节点状态
在很多应用中我们希望能够在嵌入后保留节点的全局状态,比如说中心性等。此时我们可以按照顶点状态进行排序,得到顶点序列:
此时顶点
为了保留顶点的排序信息,我们需要最大化全局排名概率:
当然实际中更常见的形式是将
保留社区结构
社区结构是图最重要的特征之一,它的特点是同一个社区内的顶点联系紧密但社区之间只有稀疏的连接。

显然我们希望能够将顶点的社区信息保留到嵌入中。对于拥有两个社区的图,假设我们知道它的社区分配则可以定义模块度如下:
式中,
其中
我们可以通过最大化模块度来进行进行社区发现,此时相当于求解约束优化问题:
除了社区结构之外我们还希望保持顶点度的连接信息。对于任意两个顶点
其中
式中,
最后把顶点相关信息和社区结构信息组合到一起,得到最终的优化目标函数:
其中矩阵
复杂图嵌入
前面我们介绍了不类型的简单图嵌入方法,在简单图的基础上我们可以结合不同复杂图自身的特点将图嵌入推广到复杂图上。
异质图嵌入
对于包含不同边信息的异质图,我们需要结合专业知识来定义meta-path并按照meta-path定义的模式来进行随机游走。

二分图嵌入
对于二分图,我们可以把它划分为两个子图;同时两个子图内部的顶点没有直接连接,只能通过另一个子图上的顶点相连。在这种情况下我们可以在两个子图上分别进行随机游走来实现图嵌入,对于同一个子图上的两个顶点,如果它们具有共享的邻居则认为它们在新的子图上存在共现关系。

同时我们还希望原始二分图上相连的顶点在分别嵌入后具有相似性,因此额外引入边的优化函数:
最后将二分图边的优化函数与两个子图上的随机游走结合起来,得到最终的目标函数:
其中超参数
多维图嵌入
对于多维度,我们则需要在每个维度上独立进行随机游走。同时每个顶点的嵌入包含通用信息和维度特有信息两部分:
其中

符号图嵌入
对于包含同时正负信息的符号图,在随机游走时需要对顶点
其中参数

超图嵌入
对于包含超边的超图需要考虑超边所描述的顶点相似性以及超边内部顶点之间的相似性。对于超边所定义的相似性,假设超边都包含
因此,我们可以在顶点集合上进行采样得到超边集合
而对于每个超边内部的相似性,我们首先定义超图内的共现信息矩阵为:
其中
然后利用最小二乘法来定义重构共现信息的目标函数:
最后将两部分目标函数相加就得到了超图上进行图嵌入的目标函数:
动态图嵌入
对于包含时间信息的动态图在随机游走时必须按照边的时间顺序进行采样,同时下一条边的发生时间要在上一条边的发生时间之后。