Graph embedding

为什么要有Graph embedding

在图上要表示一个节点,可以使用one-hot来表示,而使用这种方法有两个缺点:

  1. 如果节点数量比较多,那么n维的one-hot会非常稀疏;
  2. 使用one-hot丢失了节点在图上的连接信息。

DeepWalk

Graph embedding_第1张图片
为了使用无监督的方式训练每一个节点的embedding,我们会联想到word-embedding的方式,而word-embedding需要语料来训练每一个词的embedding,但是在图上没有一个有序的语料,所以在图上就产生了随机游走的方式来获得序列,利用Word2vec得到每个节点的embedding。

Graph embedding_第2张图片
上图中,使用skipGram,在给定 v 4 v_4 v4的情况下 v 2 , v 3 , v 5 , v 6 v_2,v_3,v_5,v_6 v2,v3,v5,v6同时出现的概率是多少,window size表示向前或者向后看多少个节点。
Graph embedding_第3张图片
因为Graph embedding是通过无监督的方式训练的,那么如何评价表示出来的节点的好坏?答案就是需要一个分类器,将学习到的embedding投入分类器中进行分类,判断是否在正确的类别。

使用deep walk进行实战:
Graph embedding_第4张图片

效果还是比较可观的。

LINE:Lage-scale Information Network Embedding

如果在大规模的图上做embedding,LINE会达到比较好的效果。

LINE中有两个中心思想:

  1. 一阶相似性:局部的结构信息。
  2. 二阶相似性:节点的邻居。共享邻居的节点可能是相似的。

作者提出LINE如果在节点度比较低的情况下,效果不是很好,因为节点度比较低时,所连接的邻居信息就会比较少,所以二阶相似性不会很好。

同时DeepWalk在无向图上,LINE可以在有向图中使用。

Graph embedding_第5张图片
上图表示一阶相似性步骤:

  1. 随机初始化每一个节点的embedding
  2. 利用embedding求出 v i , v j v_i,v_j vi,vj的联合概率分布 p 1 ( v i , v j ) = 1 1 + e x p ( − u i T ⋅ u j ) p_1(v_i,v_j)=\frac{1}{1+exp(-u_i^T · u_j)} p1(vi,vj)=1+exp(uiTuj)1,v代表节点,u代表节点的embedding,式子的意思是两节点越相似,內积越大,sigmoid映射后的值越大,也就是这两节点相连的权重越大,也就是这两个节点间出现的概率越大
  3. 利用权重,求出 v i , v j v_i,v_j vi,vj的经验概率分布 p ^ 1 = w i j 其 余 边 的 权 重 \hat p_1=\frac{w_{ij}}{其余边的权重} p^1=wij
  4. 计算联合概率分布和经验概率分布的距离,距离越小说明学习出的embedding越好,求两个分布的距离一般使用KL Divergence 来计算,
    D K L ( p ∣ ∣ q ) = ∑ i = 1 n p ( x i ) log ⁡ ( p ( x i ) q ( x i ) ) = ∑ w i j W log ⁡ ( ( w i j W ) / p 1 ( v i , v j ) ) = ∑ w i j W [ log ⁡ ( w i j W ) − log ⁡ ( p 1 ( v i , v j ) ) ] = ∑ w i j W log ⁡ ( w i j W ) − ∑ w i j W log ⁡ ( p 1 ( v i , v j ) ) D_{KL}(p||q)=\sum_{i=1}^n{p(x_i)\log(\frac{p(x_i)}{q(x_i)})}\\ =\sum{\frac{w_{ij}}{W}\log((\frac{w_{ij}}{W})/p_1(v_i,v_j))} \\ =\sum{\frac{w_{ij}}{W}\left[\log(\frac{w_{ij}}{W})-\log(p_1(v_i,v_j))\right]} \\ =\sum{\frac{w_{ij}}{W}}\log(\frac{w_{ij}}{W})-\sum{\frac{w_{ij}}{W}}\log(p_1(v_i,v_j)) DKL(pq)=i=1np(xi)log(q(xi)p(xi))=Wwijlog((Wwij)/p1(vi,vj))=Wwij[log(Wwij)log(p1(vi,vj))]=Wwijlog(Wwij)Wwijlog(p1(vi,vj))
    ∑ w i j W log ⁡ ( w i j W ) \sum{\frac{w_{ij}}{W}}\log(\frac{w_{ij}}{W}) Wwijlog(Wwij)是常数项, W W W表示图的权重之和,也是常数项,所以最终化简:
    D K L ( p ∣ ∣ q ) = − ∑ ( i , j ) ∈ E w i j log ⁡ p 1 ( v i , v j ) D_{KL}(p||q)=-\sum_{(i,j) \in E}w_{ij}\log p_1(v_i,v_j) DKL(pq)=(i,j)Ewijlogp1(vi,vj)
  5. 经过化简得到损失函数 O 1 = − ∑ ( i , j ) ∈ E W i j log ⁡ p i ( v i , v j ) O_1=- \sum_{(i,j) \in E}W_{ij} \log p_i(v_i,v_j) O1=(i,j)EWijlogpi(vi,vj),将损失函数进行梯度下降,就学到了每一个节点的embedding表示。

二阶相似性步骤,通过使用条件概率和经验概率来获得。

  1. 二阶相似性中每个节点有两个向量表示,分别是 u ˉ \bar{u} uˉ u ˉ ′ \bar{u}^\prime uˉ,v代表节点,u代表节点的embedding,其中 u ˉ \bar{u} uˉ表示节点本身的向量, u ˉ ′ \bar{u}^\prime uˉ表示该节点作为其他邻居时的表示向量。
  2. 条件概率
    p 2 ( v j ∣ v i ) = e x p ( u j ′ ˉ T ⋅ u i ˉ ) ∑ k = 1 ∣ V ∣ e x p ( u k ′ ˉ T ⋅ u i ˉ ) p_2(v_j|v_i)=\frac{exp(\bar{u_j^\prime}^T \cdot \bar{u_i})}{\sum_{k=1}^{\left|V \right|}exp(\bar{u_k^\prime}^T \cdot \bar{u_i})} p2(vjvi)=k=1Vexp(ukˉTuiˉ)exp(ujˉTuiˉ)
    节点表示学习前如果两个节点比较相似,那么embedding后的这两个节点表示向量也要很相似。
  3. 经验概率 p ^ 2 = w i j 其 余 边 的 权 重 \hat p_2=\frac{w_{ij}}{其余边的权重} p^2=wij
  4. 计算KL Divergence
    D K L ( p ∣ ∣ q ) = − ∑ ( i , j ) ∈ E w i j log ⁡ p 2 ( v i , v j ) D_{KL}(p||q)=-\sum_{(i,j) \in E}w_{ij}\log p_2(v_i,v_j) DKL(pq)=(i,j)Ewijlogp2(vi,vj)
  5. 这样就得到每个节点的 u ˉ \bar{u} uˉ u ˉ ′ \bar{u}^\prime uˉ,我们应该选择哪一个embedding作为二阶相似性呢?论文中将 u ˉ \bar{u} uˉ作为节点的二阶相似性。
  6. 训练完一阶和二阶相似性之后,将这两个结果concat拼接到一起就是最终的节点embedding。

得到一阶和二阶的embedding训练完成之后,将他们的embedding直接 contat一个最终的embedding。

node2vec

Struc2vec

SDNE

你可能感兴趣的:(GNN,GNN)