图神经网络(二)常见的Graph Embedding方法

Embedding在数学上是一个函数,将一个空间的点映射到另一个空间,通常是从高维抽象的空间映射到低维的具象空间。
Embedding的作用

  • 将高维数据转换到低维利于算法的处理;
  • 同时解决one-hot向量长度随样本的变化而变化,以及无法表示两个实体之间的相关性这一问题。

Graph Embedding的分类:

1.DeepWalk

​ 借鉴了word2vec的思想,词嵌入是对一个句子的单词序列进行分析,而Deepwalk的序列是通过随机游走(random walk)得到的。
算法的核心步骤分为两步:

  • 使用RandomWalk对图中节点采样,得到节点序列的表示
  • 使用SkipGram学习出节点的Embedding表示


RandomWalk:
是一种可重复访问已访问节点的深度优先遍历算法。给定当前访问起始节点,从其邻居中随机采样节点作为下一个访问节点,重复此过程,直到访问序列长度满足预设条件。
SkipGram:
是一个语言模型,用于最大化句子中出现在窗口w内的单词之间的共现概率。它使用独立性假设,最后条件概率近似为:

\[\text{Pr} \left(\left\{v_{i-w}, \dotsc, v_{i+w}\right\} \setminus v_i \mid \Phi \left(v_i\right)\right) = \prod_{j=i-w, j \neq i}^{i+w} \text{Pr} \left(v_j \mid \Phi \left(v_i\right)\right) \]

\(\Phi \left(v_i\right)\) 是节点 \(v_i\) 的向量表示,对序列中的每个顶点,计算条件概率,即该结点出现的情况下序列中其他结点出现的概率的log值,并借助随机梯度下降算法更新该结点的向量表示。

Hierarchical Softmax:
是word2vec中的技术,为了解决标签过多在使用softmax时带来的计算量大的问题。因此生成一个二叉树,叶子节点就是每个类别。假设一共有V个类别,原始softmax的计算量就是 \(O(V)\),使用二叉树后,从根节点到叶子节点的距离就变成了 \(O(log V)\)

(无语😅研一刚入学老师让看的论文,现在重新整理一遍又看了半天)

2.LINE

​ 使用广度优先遍历的方法,同时学习first-order和second-order两个相似度,用这两个相似度来做embedding。最后将两个concat起来作为最后表示。适用于任何类型(有向、无向亦或是有权重)的信息网络。

优点:

  • 同时保留节点之间的一阶相似性(first-order proximity)和二阶相似性(second-order proximity)。
  • 可以处理大规模网络,例如:百万级别的顶点和十亿级别的边。
  • 可以处理有向,无向和带权的多种类型的图结构。

一阶:局部的结构信息,节点对之间的相似性
二阶:节点的邻居。共享邻居的节点可能是相似的,两个节点的局部网络结构的相似性

对于节点5和6,虽然没有直接的边相连,但是她们的邻居都包含节点1、2、3、4,因此也可能具有相似的表示。

其中,\(u_6\) 是随机初始化的embedding,\(w_{6,7}\)是节点6和7之间边的权重,
通过最小化联合概率分布和经验分布KL 散度来优化模型,则目标函数定义如下:

\[O_{1}=-\sum_{(i, j) \in E} w_{i j} \log p_{1}\left(v_{i}, v_{j}\right) \]

注意:一阶相似度仅可用于无向图,通过最小化上述目标函数,我们可以将任意顶点映射到一个d维空间向量。

​ 二阶相似度既可以用于无向图,也可以用于有向图。二阶相似度假设共享大量同其他节点连接的节点之间是相似的,每个节点被视为一个特定的上下文,则在上下文上具有类似分布的节点是相似的。在此,引入两个向量 \(\vec{u}_{i}\)\({\vec{u}_{i}}'\),其中是 \(\vec{u}_{i}\) 做为节点的表示, \({\vec{u}_{i}}'\) 是做为上下文的表示(其本质是同一个向量,只是论文中用两个不同的符号作为区分)。对于一个有向边 \(\left(i, j\right)\) ,由 \(v_i\) 生成上下文 \(v_j\)条件概率为:

\[p_{2}\left(v_{j} | v_{i}\right)=\frac{\exp \left(\vec{u}_{j}^{\prime T} \cdot \vec{u}_{i}\right)}{\sum_{k=1}^{|V|} \exp \left(\vec{u}_{k}^{\prime T} \cdot \vec{u}_{i}\right)} \]

​ 其中,\(|V|\) 为节点或上下文的数量。在此我们引入一个参数 \(\lambda_i\) 用于表示节点 \(v_i\) 的重要性程度,重要性程度可以利用度或者 PageRank 算法进行估计。经验分布 \(\hat{p}_{2}\left(\cdot \mid v_{i}\right)\) 定义为 \(\hat{p}_{2}\left(v_{j} \mid v_{i}\right)=\dfrac{w_{i j}}{d_{i}}\) ,其中 \(w_{ij}\) 为边 \(\left(i, j\right)\) 的权重, \(d_{i}\) 为节点 \(v_i\) 的出度。LINE 中采用 \(d_{i}\) 作为节点的重要性 \(\lambda_i\) ,利用 KL 散度同时忽略一些常量,目标函数定义如下:

\[O_{2}=-\sum_{(i, j) \in E} w_{i j} \log p_{2}\left(v_{j} \mid v_{i}\right) \]

​ LINE 采用负采样的方式对模型进行优化,同时利用 Alias 方法加速采样过程。
LINE的适用范围:据作者所说是all in。但存在两个局限,第一不能很好处理新加入节点(尤其是这个新加入结点与其他结点没有关系的时候);第二,不能很好处理多阶相似度(没有考虑neighbor的neighbors)。在度较小的情况效果可能不好。

3.Node2vec

​ 创新点:使用带偏置的随机游走。

​ DeepWalk 选取随机游走序列中下一个节点的方式是均匀随机分布的,而 node2vec 通过引入两个参数Return parameter p 和In-out parameter q,将广度优先搜索深度优先搜索引入了随机游走序列的生成过程。 广度优先搜索注重邻近的节点并刻画了相对局部的一种网络表示,广度优先中的节点一般会出现很多次,从而降低刻画中心节点的邻居节点的方差;而深度优先搜索反映了更高层面上的节点之间的同质性

homophily(同质性):相连比较紧密的节点应该有相似的嵌入

structural equivalence (结构等价性):结构相似的节点应该有相似的嵌入

我怎么感觉这两个性质跟LINE的一阶二阶相似性是一个意思啊🧐还是不一样的,看下面的struct2vec👇)

DFS,即q值小,探索强。会捕获同质性节点
BFS,即p值小,保守周围。会捕获结构等价性

​ DeepWalk中根据边的权重进行随机游走,而node2vec加了一个权重调整参数\(α\)。 通过不同的p和q参数设置,来达到保留不同信息的目的。当p和q都是1.0的时候,等价于DeepWalk。

\[\alpha_{p q}(t, x)=\left\{\begin{array}{cl} \dfrac{1}{p}, & \text { if } d_{t x}=0 \\ 1, & \text { if } d_{t x}=1 \\ \dfrac{1}{q}, & \text { if } d_{t x}=2 \end{array}\right.\]

​ 对于下图,t是上一个节点,v是当前节点,x是候选下一个节点。下一个采样有四个选择\((t、x_1、x_2、x_3)\),给出以下概率:

(1)如果t与x距离为零(即 \(d_{tx}=0\)),则以非归一化概率\(\frac{1}{p}\) 回到t,即决定下一个采样是否往走过的地方附近绕

(2)如果t与x距离为一(即\(d_{tx}=1\)),则以非归一化概率1游走到\(x_1\),即随便你走(即Deep Walk),

(3)如果t与x距离为二(即\(d_{tx}=2\)),则以非归一化概率\(\frac{1}{q}\) 游走到\(x_2\)\(x_3\),即可以往深或远的地方采样。

​ 为了获得最优的超参数p和q的取值,node2vec 通过半监督形式,利用网格搜索最合适的参数学习节点表示,也利用了 Alias 方法加速采样过程。

4.Struc2vec

(看了这个我又感觉struct2vec的基本思想和node2vec的结构相似性是一回事,但是跟LINE的二阶相似性还是有区别的🧐)

​ LINE的二阶相似性是指如果两个节点的共同邻居越多,那么表示这两个节点越相似。但是这种方法无法鉴别结构相似但是距离非常远的节点对,换句话说某些节点有着类似的拓扑结构,但是它们离得太远,不可能有共同邻居(就比如下图的u和v)。

  • 本文的算法并没有按照节点和边的属性或者在网络中的位置关系来评估节点之间的结构相似性。而是考虑如果两个节点在局部有着类似的拓扑结构,那么这两个节点就是类似的。本文的算法即使在图是非连通的情况下,仍然能在两个子图中找出结构相似的节点。(这个可能是跟Node2vec的区别🧐)

  • 建立了一个分层的结构来衡量节点的结构相似性。在底层,两个节点相似性的判定只依赖十分简单的信息,比如;而在顶层,两个节点的相似性的判定则要依赖于整个网络的信息

  • 使用随机游走的采样方式获取上下文。如果两个节点经常出现在相同的上下文中,表明它们有着相似的结构特性。

符号定义:



4.1度量结构相似性:

核心观点是:如果两个节点的度相同,那么这两个节点结构相似;如果这两个节点的邻居度也相同,那么这两个节点的结构相似性比前者更高。

初始化 \(f_{-1}(u,v)=0\) ,根据上图可得:

​使用DWT动态时间规整来计算两个序列的相似性 \(g(D_1,D_2)\) ,两个序列是两个节点k跳邻居的度分别产生的序列。(这是语音识别中的一种方法,后面有链接,这里就不详细展开了)

4.2构建多层带权重图:

​ 上一步得到了每个节点对在不同的k上的结构距离,这一步我们根据这些信息构建一个多层带权重的网络M。

​ 即第一层节点之间的权重是1-hop neibours序列之间的相似度,第二层节点之间的权重是2-hop neighbours序列之间的相似度,每一层都是完全图,但是权重不同。

4.3顶点采样序列:

上一步多层网络M的构建就是为了寻找合适的上下文,而寻找上下文的方法与DeepWalk一样是随机游走采样的方式。

5.SDNE

​ 之前的Deepwalk、LINE、node2vec、struc2vec都使用了浅层的结构,浅层模型往往不能捕获高度非线性的网络结构。而SDNE方法使用多个非线性层来捕获node的embedding。(原理类似于Transformer,先encode,再decode)

​ 提出了一种利用自编码器同时优化一阶和二阶相似度的图嵌入算法,学习得到的向量能够保留局部和全局的结构信息。SDNE中的一阶、二阶相似度定义和LINE是一样的。

​ SDNE 使用的网络结构如下图所示:


\(x_i\) ​到 \(y_i^{(K)}\) 是编码器,从 \(y_i^{(K)}\)\(\hat x_i\)​是解码器, \(y_i^{(K)}\) ​是节点 \(i\) 的Embedding向量。编码器的公式为:

\[y_i^{(1)}=σ(W^{(1)}x_i​+b^{(1)}), \]

\[y_i^{(k)}=σ(W^{(k)}y_i^{(k-1)}+b^{(k)}),k=2,...,K \]

模型主要包括两个部分:无监督和有监督部分。

无监督部分:

用一个深度自编码器用来学习二阶相似度。(框架图的纵向)输入 \(x_i\) 是节点 \(i\) 的邻接矩阵,包含了其邻居结构信息。因此结构相似的顶点可以学习到相似的 embedding 向量,不断优化代价函数来捕捉全局结构特征,即二阶相似度。输出是 \(\hat x_i\),是重构后的邻接矩阵。
目标是最小化输入和输出的重构误差,因此损失函数为:

\[\begin{aligned} \mathcal{L}_{2nd} &=\sum_{i=1}^{n}\left\|\left(\hat{\mathbf{x}}_{i}-\mathbf{x}_{i}\right) \odot \mathbf{b}_{i}\right\|_{2}^{2} \\ &=\|(\hat{X}-X) \odot B\|_{F}^{2} \end{aligned}\]

该损失可以将具有相似邻域结构的节点 Embedding 向量映射到相邻位置,即捕捉了网络的全局结构
由于网络的稀疏性,邻接矩阵中的非零元素远远少于零元素,因此模型采用了一个带权的损失函数。 邻接矩阵中的0对应 b=1, 非0元素的 b>1,这样的目的是对于有边连接的节点增加惩罚(这里有点没懂,为什么不是减小惩罚)。可以理解为对有边连接的节点赋予更高权重。其中 \(⊙\)是哈马达乘积,表示对应元素相乘

监督部分:

用一个拉普拉斯特征映射捕获一阶相似度。(框架图的横向)若顶点 \(v_i\)\(v_j\) 之间存在边,那他们的Embedding的结果 \(y^{(K)}\) 应该也很接近,因此损失函数为:

\[\begin{aligned} \mathcal{L}_{1st} &=\sum_{i, j=1}^{n} s_{i, j}\left\|\mathbf{y}_{i}^{(K)}-\mathbf{y}_{j}^{(K)}\right\|_{2}^{2} \\ &=\sum_{i, j=1}^{n} s_{i, j}\left\|\mathbf{y}_{i}-\mathbf{y}_{j}\right\|_{2}^{2} \end{aligned}\]

该损失函数可以让图中相邻的节点对应的Embedding 向量在隐藏空间接近,即捕捉了网络的局部结构

​ 这个地方就有点接近GCN了,都用到了拉普拉斯矩阵来表示结构信息。(但是为什么要用拉普拉斯矩阵呢,不是已经得到embedding了吗?这个地方先存疑)


SDNE的一个重要应用是阿里凑单算法(2018年的时候),例如满400减50,当购物车商品金额不足400时,就需要进行凑单。

总结:
最后,其实究竟选择什么模型应考虑适用的场景:
1. 如果关注内容相似性(局部邻域相似性),则可以选择node2vec,LINE,GraRep等;
2. 如果更加关注结构相似性,则可以选择struc2vec,蚂蚁金服风控模型使用struc2vec相比node2vec有质的提升,是因为在风控领域,你可信并不能代表你的邻居可信(有些“大 V”节点的邻居众多),但是一个直观的感觉是,如果两个人在图中处于相似的地位(比如两个“大 V”),那么这两个人应该都可信或都不可信,并且一般来说这样两个人(节点)相距较远;
3. 如果模型需要考虑节点和边的额外信息,则可选择CANE,CENE,Trans-net等;
4. 如果想处理大规模易变图,可以采用GraphSAGE,或者先使用其他GE方法,再使用GraphSAGE归纳学习;
5. 如果想微调模型,可选择GraphGAN;

甚至可以选择很多GE方法,并将得到的embedding向量进行聚合,比如concat等方式。

Graph Embedding作为知识图谱的经典方法之一,其应用非常广泛。当今国内外互联网搜索引擎公司已经意识到知识图谱的战略意义,纷纷构建知识图谱,如Google知识图谱(Google Knowledge Graph),百度“知心”和搜狗的“知立方”,以此来改进搜索质量,知识图谱对搜索引擎形态日益产生重要的影响。

参考资料:
b站视频【图神经网络】GNN从入门到精通
几种常见的Graph Embedding方法
图嵌入 (Graph Embedding) 和图神经网络 (Graph Neural Network)
【论文笔记】DeepWalk

【Graph Embedding】DeepWalk:算法原理,实现和应用

node2vec: Scalable Feature Learning for Networks

论文阅读:node2vec: Scalable Feature Learning for Networks

动态时间规整(DTW)算法简介

【论文笔记】struc2vec

详解Graph-Embedding之DeepWalk、Line、Struct2vec

SDNE(Structural Deep Network Embedding )的原理,实现与应用
【Graph Embedding】SDNE:算法原理,实现和应用
论文:
DeepWalk

Line

Node2vec

struc2vec

SDNE

代码:
GraphEmbedding

posted @ 2022-05-01 22:02  YTT77  阅读(1726)  评论(0编辑  收藏  举报