Graph Embedding
1.Deepwalk
采用随机游走的方式,将网络结构节点之间的关系转化成句子,那么不同节点就代表不同的词,然后用自然语言处理中Word2Vec
的方法得到节点的低维度向量表示。那么这种方法其实就是分两步:随机游走,和词向量表示学习。
随机游走就是在网络结构中,以某个节点做起点,然后以一定的概率随机移动到其邻居位置,再从邻居位置随机移动,直到走t步(t是预先设定好的参数),于是得到一个由t个“词”(节点)组成的“句子”(序列)。图中每个节点都要作为起点做随机游走,设有N
个节点;且每个节点都要做r
次随机游走,那么最后就可以得到N*r
个“句子”,每个“句子”都是由t个“词”组成。
原工作中使用Skip-gram
的方法学习词向量表示,具体思想类似于极大似然概率:比如现在有一个随机游走得到的句子(序列) A B C D E,每个字母代表一个词(节点),这个句子共5个词。这个句子之所以出现,是因为这种词的顺序是常见的形式(比如我们只能从一群学生中抽1个学生,问他考试前是否复习,如果这个同学说复习,那么我们就会更倾向于相信在这个群体中,考试动作之前会发生复习动作的概率更大),所以我们可以认为C词很大概率就是与B词和D词相邻的,我们以C词的词向量作为输入,那么其邻居词中,B词和D词出现的概率就应该更高,也就是P(邻居是B词和D词 | 输入为C词的词向量)的值应该更高,那么我们就应该更新C词的词向量,使得上述的条件概率最大。其更新公式如下所示:
2.LINE
首先我们需要使用卷积神经网络模型对节点提特征,得到节点的低维向量表示,那么究竟怎样的低维向量表示是更好的呢?作者提出了两种相似度的衡量方式:一阶相似度和二阶相似度
一阶:当两个结点边的权重很大时,说明可能是相似的
二阶:如果两个结点的邻居结点相同,说明可能是相似的
DeepWalk在无向图上,LINK在有向图和无向图皆可
一阶相似性
求节点i和节点j的联合概率分布:节点i和节点j的embedding经过一个sigmoid
函数得到。
求节点i和节点j的经验概率分布:节点i和节点j相连的边的权重除以所有边的权重的和
然后求两个分布的距离,距离越小说明学出来的embedding效果越好,用KL-divergence
来求距离
将得到的距离作为loss
函数,训练出最小的距离,得到每个向量的embedding表示
二阶相似性
定义每个节点有两个表示
有向图的经验概率的分母不再是所有边的权重,当求给定顶点vi条件下,产生邻居顶点vj的概率,分母为顶点vi的出边的权重和。
同样,得到两个概率分布,使用KL-divergence
求出最小距离,当做loss
函数,利用反向传播,得到了每一个节点本身的embedding和该节点作为其他节点邻居时的表示向量的embedding,最后选择顶点本身的embedding作为该节点的二阶相似性
一阶和二阶训练完之后,将两个向量组合成一个embedding,使用拼接的方法
3.Node2vec
同质性表示节点跟周围节点的embedding应该是很相似的,如图中右侧第一个图,每种颜色代表节点的相似性
结构等价性表示节点在图中的位置很相似,如图中右侧第二个图,所有蓝色节点都是连接两个簇的,所以它们的embedding是很相似的
该算法也是采用随机游走的方式,但与DeepWalk不同的是,该游走是一种有策略的游走方式
假设已经从t节点游走到了v节点,可以从v节点游走到x1、x2、x3或者t节点,计算v节点游走到其他节点的概率,表示为πvx
,πvx=αpq(t,x)\*wvx
,其中wvx表示节点v到节点x的权重,αpq(t,x)的公式如下图所示,其中,dtx=0
表示从v节点游走到距离t节点距离为0的节点的概率(也就是从t走到v再走到t的概率),dtx=1
表示从v节点游走到距离t节点距离为1的节点的概率。dtx=2
表示从v节点游走到距离t节点距离为2的节点的概率
举例:
t->v->z:0
因为v到z无边,权值为0
t->v->t:wvt*1/p
因为v到t的权值为wvt,又dtx=dtt=0,故αpq=1/p
t->v->x1:wvx1*1
因为v到x1的权值为wvx1,有dtx=dtx1=1,故αpq=1
算法如下:
不同的参数值对最后的结果是不同的,当q较小时,1/q较大,说明节点的游走会沿着距离当前节点较远的方向游走。同理相反
这种方法的好处是结合了BFS(p控制)与DFS(q控制)来做随机游走(DeepWalk方法是基于DFS的)以两个参数p,q来控制,得到的序列可以更全面地表示网络结构中节点的邻居关系。
4.Struc2vec
node embedding的方式,都基于近邻关系,有些节点没有近邻,但也有相似的结构性
下图定义了距离信息fk(u,v)
和它的计算:
如何求g(D1,D2)
?
求出来的两个节点的距离就可以表示两个节点在图中的结构相似性,而不考虑他们的邻接点
算法流程:
Struct2vec适用于节点分类中,其结构标识比邻居标识更重要的是,采用Struct2vec效果好。
5.SDNE
之前的DeepWalk,LINK。node2vec,struct2vec都采用了浅层的结构,浅层模型往往不能捕获高度非线性的网络结构。即产生了SDNE方法,使用多个非线性层来捕获node的embedding
引入深度学习方法
使用Encoder-decoder
来表示向量,通过输入和输出向量的均方误差计算L2nd
,其中引入一个bi
,这个bi表示,如果si跟sj是不连接的,bij=1,否则为一个大于1的数,也就是说,如果两个点是连接的,更关注decoder之后能否表现出两个点连接的性质,即考虑点的二阶相似度。
还引入了一阶相似度,一阶相似度考虑的是连接的节点,xi和xj都经过一个Encoder得到一个embedding,计算两个embedding的误差,在误差最小的情况下,就表示两个节点的一阶相似度
最后,将得到的一阶误差,二阶误差和一个正则项加在一起得到了整体误差,通过反向传播,就学习到了模型上的一些参数,然后可以计算出节点的embedding
总结
在日常使用中,要根据图结构和下游任务,深入了解每一种算法的本质去选择对应的算法,这样才能得到更好的效果。