在前面几周的学习中,我们学习了motifs,graphlets等等来表示一个图,本质上,它们就是图的一种特征表示(representation),接下来我们介绍自动的方法:
第七八两节介绍的都是关于图表示学习的,所谓万物皆可embedding嘛~
第九节介绍了一些代码相关,这部分还是很建议认真看看代码找几个数据集实验一下的~
(其实介绍表示学习算法的博客已经太多太多了,但是强迫症为了笔记完整一些,还是写一写==)【ppt传送】【视频传送】
介绍分成了三个部分:
- 图表示学习思想
- 基于随机游走的表示学习(包括了DeepWalk, Node2vec, LINE)
- 基于深度学习的表示学习(包括了SDNE, GCN, GraphSAGE, GAT)
图表示学习思想
Embedding一直是学术界研究的热点,简单说就是利用一个低维稠密向量来对某一Object进行表示,然而在图领域,网络通常任意大小,有复杂的拓扑结构,且经常动态变化,它不像图像一样有规则的网状结构,也不像文本一样具有序列结构,而且每个节点本身也含有大量特征,所以传统的embedding方法在图数据种并不实用。
lattice:格子

图网络问题的核心思想如下图所示,可以理解为首先把每一个节点映射为低维向量表示,并且需要保证可以重新利用某种解码方式,尽可能的还原高维空间种的图信息,比如说邻居节点之间的依赖关系,保证原有空间中节点的相似度等等。这样就可以利用到学习到的embedding用于下游任务的学习,比如说异常检测、节点分类、关系预测、社区划分、连接预测等等。

图表示学习大致可以分成两类:基于随机游走 & 基于深度学习
基于随机游走的表示学习
算法概览
- DeepWalk:Online Learning of Social Representations
- node2vec:Scalable Feature Learning for Networks
- Line:Large-scale Information Network Embedding
- 代码:https://github.com/shenweichen/GraphEmbedding(大佬写的代码,还是很建议认真研究研究代码的~)
1. DeepWalk
DeepWalk在某种程度上是序列学习embedding在图网络中的一种迁移,它借鉴了nlp中序列的思想,可以把图中的每个节点类比为一个词语,利用随机游走出来的序列类比为一个句子,根据随机游走形成的句子序列来构建词向量模型Word2vec, 并且利用Skip-gram模型来学习每个节点的向量表示。下图为DeepWalk模型结构,分成了三个部分:随机游走采样序列;Skip-gram模型训练;输出层利用Softmax优化,最终得到每个节点的向量表示。

- Step1:随机游走采样序列
首先定义采样次数y,每次采样的长度t,在图
- Step2:Skip-gram
Skip-gram 为三层的神经网络,分为输入层,映射层,输出层。核心思想是在一个序列中,利用中间节点,去预测周围的节点,对应上图的采样序列
在参数求解中,上述模型等价于求解在给定节点
等价于求解:
利用softmax函数有:
其中,
则权重更新为:
通过上述步骤,即可对Skip-gram模型中各个参数更新,进而得到每个节点的向量。
- Step3:层次Softmax
上述对Skip-gram模型的参数求解的过程中,由于softmax算法在每一次参数计算与更新的过程中都引入了全部的节点,复杂度较高,为了提高算法效率,降低复杂度,就有了层次Softmax算法。
层次Softmax(Hierarchical Softmax)利用二叉树的思想,使复杂度从

当给定背景节点来计算目标节点的条件概率
其中
通过上述三个步骤,就可以得到每个节点的向量表示,Deep Walk完整流程如下图所示:

2. Node2vec
Node2vec算法结合了深度优先搜索与广度优先搜索,利用有偏的随机游走,更好的挖掘邻居节点的特异性。DeepWalk是使邻居节点尽可能相似,但是如果两个点没有邻居,而且没有共同邻居时,也可能存在相似性,比如两个完全生活在不同时区的人,虽然互相不认识,但是也可能有相似的兴趣爱好,相似的人生轨迹,因此不仅要学习网络中位于同一社区的邻居信息,也要学习每个节点的特异性社会角色。
Node2vec与DeepWalk极为相似,关键在于随机游走的策略不同,Node2vec中结合了深度优先搜索与广度优先搜索。通过广度优先搜索,可以保持节点的结构相似性,即学习每个节点结构上扮演的角色,比如说,对于一架桥,可以直接通过它直接相连的节点识别出来;而通过深度优先搜索,可以捕捉节点的同质性,即节点之间的依赖关系,反应微观邻居的信息,随着搜索的加深,也可以捕捉更复杂的节点依赖关系。因此可以结合深度优先搜索与广度优先搜索,利用有偏的随机游走策略进行采样。
给定初始节点
其中
为了捕捉游走的回溯性与搜索方向,定义带有参数p和参数q的随机游走,如下图所示:

假设一个随机游走刚好经过边
通过上述有偏的随机游走即可得到采样序列,接下来可通过与DeepWalk类似的方法利用Skip-gram进行训练,从而得到每个节点的向量表示。Node2vec的完整流程如下:

3. LINE
LINE其实不能算作随机游走方法,但是也经常拿来和DeepWalk,Node2vec比较。LINE的核心思想是基于近邻相似,利用一阶和二阶的相似信息和编码后向量的相似性进行比较建立损失函数,从而得到每个节点的向量表示。模型中首先定义了一阶与二阶相似性。一阶相似性是两个邻居节点的局部相似性,在一定程度上可以衡量图的局部关系。一阶相似在真实网络中很常见,比如好朋友之间有相近的兴趣爱好,引用同一篇论文的两篇文章话题相似等。然而在实际生活中,仍然有大部分不存在一阶相似性的用户,但其行为是相似的,比如两个完全不认识的人,可能因为有共同好友,而有相似的兴趣爱好,所以一阶相似度不足以表示网络结构,故引入二阶相似性,用来衡量两个节点邻居的相似性,并且认为有较多共同邻居的节点是相似的。在下图中,节点6,7有边直接相连,有较高的一阶相似度,而节点5,6虽然不直接相连,但两个节点有共同的邻居,故两节点有较高的二阶相似度。LINE分别对一阶、二阶相似度进行学习,最终把二者向量进行拼接,得到最终的节点表示。

(1)一阶相似性
一阶相似度用来表示图中局部有连边的节点相似度,对于一个无向边(i,j), 定义节点
当转化为低维向量时,定义其对应的联合概率分布为:
其中,
其中,
通过最小化损失函数,不断迭代优化更新参数,即可得到节点的低维向量表示,但是一阶相似度只适用于无向图。
(2)二阶相似性
二阶相似度在有向图与无向图中都适用。二阶相似性认为如果两个节点有许多共同的邻居,则他们相似。在这样的假设下,每一个节点都可以看作是其他节点的“上下文”,那么有相同上下文的节点是相似的。与一阶相似度类似,对于有向图,首先定义节点
而当转化为低维向量时,由于每个节点都有两个角色,节点本身,以及其他节点的“上下文”,因此每个节点对应两个向量,自身的向量
其中|V|是每个节点的上下文个数,因此,为了保证在转化后仍然保持高维空间中的相似关系,即需要使如下损失函数最小化:
其中,
通过最小化损失函数,不断迭代优化更新参数,即可得到节点的低维向量表示。
(3)模型优化
一方面,可以用负采样算法,计算开销由原来的
通过上述三个步骤,则可以得到每个节点的向量表示,LINE完整流程如图所示:

基于深度学习的表示学习
算法概览
- SDNE:Structural Deep Network Embedding【代码】
- GCN:Semi-Supervised classification with graph convolutional networks【代码】
- GraphSAGE:Inductive Representation Learning on Large Graphs【代码】
- GAT:Graph Attention Networks【代码】
基于深度学习的图表示核心思想是对邻居节点进行聚合,如下图所示,左边是原始图网络,右图是模型的基本思想,对每个节点的邻居进行聚合,其中黑箱子可以利用不同的神经网络,此处为3层,Layer0可以输入节点特征,Layer K聚合上一层的邻居信息。基础的模型为:
此处利用了上一层邻居的平均来进行聚合,

- SDNE
SDNE(Structural Deep Network Embedding)将深度学习用于网络表示,利用非线性映射保留网络结构,也可以看作是一种自编码器,其中与LINE类似,利用一阶相似度保存临近节点之间的局部相似关系,利用二阶相似度保存每对节点的邻居节点间的相似度从而保存全局网络结构,通过这样的编码-解码利用非线性函数把输入转化到表示空间。
下图为SDNE的模型结构,核心框架是自编码器Encoder-Decoder, 首先对输入的节点进行编码,保存到y,然后再对y进行解码,尽可能的还原原始输入,其中根据一阶相似度与二阶相似度建立损失函数,通过最小化损失函数来进行参数更新,从而得到节点的低维向量表示。

(1)自编码器Encoder-Decoder
如下图所示,在编码器Encoder中,对输入节点x进行编码,经历K层,存储在背景向量

(2)一阶相似度
为了捕捉图相邻节点的局部的相似结构,认为有直接相连的节点之间是相似的,利用编码后的临近节点有监督学习其一阶相似度:
其中S为邻接矩阵,代表邻居的结构。
(3)二阶相似度
一阶相似度可以使有邻居节点有相似的向量表示,但是不连接并不能代表没有相似性,因此希望通过自编码器,可以尽可能的还原初始的网络结构,即保持网络全局的结构,建立损失函数:
然而,邻接矩阵中0是大部分,把所有函数学成0不是理想的结果,因此可以对非零元素进行惩罚建立带权的损失函数:
其中
综上所述,可以优化目标函数:
对其中的参数利用梯度下降法进行求解,从而得到每个节点的向量表示。通过结合一阶相似度与二阶相似度,既保留了相似邻居的局部信息,也保留了网络结构的全局信息。SDNE的完整流程如下:

2. GCN
GCN的细节原理关于卷积核,傅里叶变化,拉普拉斯分解细究起来确实复杂,感兴趣的可以参考这里,此处只不求甚解说结论好了,GCN可以理解为一种神经网络,用一种特殊的编码方式捕捉图信息,如下图所示为两层的图卷积网络,利用所有数据学习节点表示,并利用有标签的数据建立损失函数,半监督对节点进行分类。

其层与层之间的传播规则为:
(对比最开始提到的,对邻居节点进行均值聚合
通过上式后就可以利用损失函数(监督/无监督)来对参数进行更新学习,得到每个节点的向量表示。
3. GraphSAGE
GraphSAGE全称为Graph sample and aggregate,对比深度学习表示学习最开始提到的核心思想对邻居简单聚合,GraphSAGE的聚合更加泛化。
- 简单邻居聚合: [公式]
- GraphSAGE聚合: [公式]
其中对于函数AGG有多种选择,比如说:
- 均值聚合: [公式]
- 池化聚合: ,其中[公式]为max pool/mean pool[公式]
- LSTMuh聚合: [公式]
GraphSAGE的完整流程如图所示:

4. Graph Attention Networks(GAT)
在GraphSAGE中认为,邻居节点对当前节点的影响是相同的,而GAT引入注意力机制,对不同的邻居节点赋予不同的权重
- Step1:对于图中每个节点,通过线性映射定义节点u对节点v的重要性:[公式]
- Step2:计算注意力得分:[公式]
- Step3:得到最终的隐藏层:[公式]
关于图表示学习还有很多可以研究的方向,比如说:
- 怎样在大规模的网络中更高效的学习图表示,课程中也提到了PinSage,是一个比较典型的将GCN大规模应用于工业的算法,这个以后再补~
- 整个图的表示:最简单的方法是对图所有节点取平均,课程中还提到了anonymous walk embeddings方法等
- 关于motif:考虑利用motif来重新定义网络,来发现更多的网络信息,从而学习网络表示
- 异构图:对于有多种类型节点和边的网络如何表示,在推荐等领域被广泛应用
- 动态图:图网络往往是动态变化的,和时序相关的,比如说在异常检测问题中,检测边的变化或许可以捕捉异常,如果学习这种图的动态表示也是可以探讨的课题