CS224W课程(图神经网络)笔记:03-nodeembed

1,582 阅读9分钟

Graph Representation Learning


在本节我们将了解到以下内容:

  • Deepwalk 主要思想是利用随机游走产生序列,当成句子输入到word2vec学习到特征。
  • Node2vec 改进了Deepwalk中随机游走,使得嵌入得到功能角色信息,具体做法是利用BFS和DFS。
  • Graph Embeddings 基于匿名随机游走学习到子图的一些结构信息,从而得到图嵌入向量。

辅助资料:

Node2Vec【图神经网络论文精读】哔哩哔哩bilibili

图表示学习的作用(Graph Representation Learning)

image-20221015090031420.png


图表示学习的思想(embebding)

图表示学习的思想是将图的信息镶嵌到d维空间上,获取特征,同时保持相似性

image-20221015091305144.png

example:

image-20221015092306471.png


Node Embeddings

1、目标:找个一个相似性函数

image-20221015095414590.png


2、Node Embedding过程

第一步:encoder,找到zvTzuz_v^Tz_u

第二步:定义节点相似性函数(测量原来图上节点位置的相似性)

第三步:decoder,度量zvTzuz_v^Tz_u

image-20221015095442818.png


3、两个关键点

  • Encoder:找到映射空间
  • Decoder:找到Decoder使得计算映射后的特征和原空间的特征相似性保持一致

image-20221015095727110.png


Shallow Encoding(最简单的思想)

1、找到一个矩阵,将节点进行one-hot编码,利用矩阵相乘进行映射

ENC(v)=zv=Z×vENC(v)=z_v=Z×v

image-20221015095958275.png


2、思路如下

若有1w个节点,ZZ矩阵则有1w列

image-20221015100308586.png


3、缺点

每一个节点都看出一个单独的任务,毫无关联,对应word2vec中的one-word model

image-20221015100442205.png


DeepWalk

1、加入相似信息

在Shallow Encoding中,节点的相似信息没有被用上,Deepwalk加入了节点的相似信息,那么节点的相似信息如何定义?

  • are linked?
  • share neighbors?
  • have similar “structural roles”?

在本节,我们将介绍利用random walk进行节点相似性定义

image-20221015100736195.png


2、Note on Node Embedings(注意)

DeepWalk是无监督或者自监督的学习方式,即我们将不使用节点的标签,不使用节点的特征,只使用节点的相似性,这个方式是适用于任何任务上的。

image-20221015101119226.png


Base on random walks

随机游走的主要思想:利用随机游走产生的序列,节点当成单词,形成句子,投入到word2vec,利用word2vec中的skip-gram模型进行embedding

step1:定义步长R,进行随机游走

step2:基于one-hot进行编码

step3:投入到wrod2vec进行embedding

1、定义一些符号

image-20221015101436490.png


2、Random Walk思想

在图上从某个点开始,随机游走K步

image-20221015101500546.png


3、节点相似度定义

在Random Walk中,节点相似度定义为:从某点出发随机游走得到的集合,该集合中的节点具有相似性。

image-20221015101539031.png

利用概率估计,预测从uu出发,R步所能走过的节点的概率

PR(vu)P_R(v|u)

uuvv之间的相似性类似于夹角,定义为上述所说的概率。对应模型为word2vec中的Skip-Gram利用中心词预测上下文。

image-20221015101807026.png


4、为什么进行随机游走?

两个原因:

  • 灵活的随机定义包含两个局部的节点相似性和高阶邻域信息
  • 有效性:无须进行任何训练,只需要考虑在随机游走中共现的节点

因而随机游走是一种自监督学习方法

image-20221015102427924.png


5、定义优化目标

给定一个图G,定义映射函数ff(一个矩阵),目标为在定义域为ff中搜索uVlogP(NR(u)zu)\sum_{u \in V} \log \mathrm{P}\left(N_{\mathrm{R}}(u) \mid \mathbf{z}_{u}\right)的最大值,即概率最大化。此处不明白可以看word2vec模型

image-20221015102702610.png

优化目标等同于优化:

L=uVvNR(u)log(P(vzu))\mathcal{L}=\sum_{u \in V} \sum_{v \in N_{R}(u)}-\log \left(P\left(v \mid \mathbf{z}_{u}\right)\right)

概率定义为softmax即相当于V|V|类分类任务,V|V|为节点数:

P(vzu)=exp(zuTzv)nVexp(zuTzn)P\left(v \mid \mathbf{z}_{u}\right)=\frac{\exp \left(\mathbf{z}_{u}^{\mathrm{T}} \mathbf{z}_{v}\right)}{\sum_{n \in V} \exp \left(\mathbf{z}_{u}^{\mathrm{T}} \mathbf{z}_{n}\right)}

image-20221015103149903.png


6、缺点
  • 运算量过大

image-20221015103451380.png

主要原因是下面的正则项:

image-20221015103612140.png


7、一些加速的方法

也是word2vec中的加速方法。

  • 负采样:相比于利用全图节点进行正则项计算,负采样只采用某些节点进行计算,丢失一些准确率,但保证了速度,具体参考1402.3722.pdf (arxiv.org)

image-20221015104743269.png


8、反向传播(梯度下降法)

定义了优化函数,我们将利用随机梯度下降法进行优化。

image-20221015105314438.png


9、总结

根据word2vec的原理,DeepWalk只用到了节点在图上位置的信息,利用one-hot编码进行降维得到节点嵌入。

这样做的缺点是,没有利用其他信息,如节点间的链接权重,节点本身的特征等

此外DeepWalk用的是随机游走,无法看到整张图的信息,随机游走的随机性可能无法很好的表示局部信息。

只能反映相邻节点的社群相似信息,无法反映节点的功能角色相似信息。


Node2vec

为了解决随机游走无法看到整张图的信息,作出改进,把随机游走改为有偏游走。

1、利用偏向游走

BFS(宽度优先):局部游走

DFS(深度优先):深度游走

image-20221015105938020.png

image-20221015110015804.png


2、策略比较

当从t走到V后,再选取下一个节点的时候,有两种倾向。

  • 返回上一个节点或者走到上一个节点的邻居
  • 远离上一个节点

如下图

  • 当我们定义p很小时,我们更倾向回到上一个节点,这就是BFS,会在局部中游走。
  • 当我们定义q很小时,我们更倾向远离上一个节点,这就是DFS,会在全局中游走。

image-20221018090813059.png

基于任务各有好处:

  • BFS:局部视野
  • DFS:全局视野

image-20221015110343871.png


3、二阶随机游走

在Deepwalk中,是一阶随机游走,即选取节点的策略仅取决于当前的节点。

在Node2vec中,采用的是二阶随机游走,即选取的节点策略取决于当前节点同时也取决于上一个节点

image-20221018091237929.png


4、技术细节

  • Step1(关键一步)、计算随机游走的概率,形成概率表,降低游走采样的时间复杂度,降为线性时间。

  • Step2、模拟随机游走。

  • Step3、基于随机梯度下降法进行优化。

image-20221018092101917.png


5、总结与讨论

优点:

  • 通过调节ppqq值,实现有篇随机游走,探索节点社群、功能等不同属性

  • 首次把节点分类用于Link Prediction

    • 论文中,将两个节点进行乘积得到连接特征,再进行预测。
  • 可解释性、可扩展性好、性能卓越

缺点:

  • 需要大量随机游走序列训练。
  • 距离较远的两个节点无法直接相互影响,看不到全图信息。(图神经网络)
  • 无监督、仅编码图的连接信息,没有利用节点的属性特征。(图卷积)
  • 没有真正用到神经网络和深度学习。

DeepWalk vs Node2vec

  • Node2vec向量嵌入包含了节点的语义信息(相邻社群和功能角色)
  • 语义相似的节点,向量嵌入的距离也近。
  • 在DeeoWalk完全随机游走的基础上,Node2vec增加了p、q参数,实现有偏随机游走。
  • 不同的p、q参数组合,对应了不同的探索范围和节点语义。
  • DFS深度优先搜索,相邻的节点,向量嵌入距离相近
  • BFS广度优先搜索,相同功能角色的节点,向量嵌入距离相近
  • DeepWalk是Node2Vec在p=1,q=1的特例。

其他游走策略

可以使用节点的属性,节点的权重等。

image-20221018092339549.png


一些应用

image-20221018092533901.png

image-20221018092614946.png


Graph Embeddings

对图或者子图进行Embeddings,用于一些图分类任务上。

1、方法1

将图上的节点嵌入向量平均化,得到图的向量。

image-20221018094311881.png


2、方法2

引入一个虚拟节点表示子图,然后对虚拟节点进行node2vec

image-20221018094921395.png


3、方法3(匿名随机游走)

匿名随机游走,顾名思义将节点匿名,从index=1开始走,遇到新的节点则加1并标记上index,遇到之前遇到过的节点则设置为第一次出现时的index。如下图的例子。

  • A\rightarrowB\rightarrowC\rightarrowB\rightarrowC:则为1\rightarrow2\rightarrow3\rightarrow2\rightarrow3
  • C\rightarrowD\rightarrowB\rightarrowD\rightarrowB:则和上式一样1\rightarrow2\rightarrow3\rightarrow2\rightarrow3。
  • 这说明这两条随机游走有相似的结构,相似的子图
  • A\rightarrowB\rightarrowA\rightarrowB\rightarrowD:则为1\rightarrow2\rightarrow1\rightarrow2\rightarrow3

image-20221018100016498.png


匿名随机游走产生的pattern,即不同的链和路径长成指数增长关系,如路径长为3的匿名游走,根据组合数可以得到pattern有5个。

image-20221018100644537.png


简单使用匿名随机游走,进行Graph Embeddings

  • 记录所有长度为ll的匿名随机游走
  • 将图表示为这些匿名游走的分布

想法和Traditional Embeddings中的Graphlet Degree Vector差不多,统计所有长度为ll的匿名随机游走的pattern,然后将图表示为这些pattern的频数或概率。

example:

  • 设定l=3l=3,匿名随机游走则有5种pattern,w1=111w_1=111w2=112w_2=112w3=121w_3=121w4=122w_4=122w5=123w_5=123
  • 假设w_i分别在图中出现的频数为30,10,5,10,20。归一化后得到w_i在图中出现的概率。
  • 将第i个pattern记作wiw_i,将图表示为5维向量zGz_G,其中ZG[i]Z_G[i]wiw_i在图中出现的概率。

image-20221018100904610.png


这样的做法会使得时间复杂度上升,因为长度l和pattern个数成指数关系。

解决的方法:用采样

  • 独立地采样m条随机游走路径来近似匿名游走pattern
  • 用这些采样得到的随机游走路径的概率分布来表示图

image-20221018101703669.png

4、其他idea:Learn Walk Embeddings

不简单地用每次游走出现的次数的分数来表示匿名游走,而是学习匿名游走wiw_i的embeddings,ziz_i

具体来说:

  • 就是将所有的匿名游走的embeddings ziz_i加上图的embeddings zGz_G一起输入学习。

如何进行embed walks?利用CBOW。输入了整张图的embeddings 说明和doc2vec类似(后续再具体学习)

image-20221018103358042.png


具体过程如下:

  • 输入整张图的ZGZ_G(一开始不知道ZGZ_G,因此是随机输入),该ZGZ_G也是一个学习的目标。

  • 从节点1开始,采样获取匿名随机游走,w1w_1w2w_2等。

  • 学习预测walks共现在tΔt-\varDeltat+Δt+\varDelta窗口内的概率。

    • example:Δ=1\varDelta =1时用w1w_1w3w_3去预测w2w_2

image-20221018103845298.png

image-20221018104951180.png


具体例子如下图所示,学到的ZGZ_G可以用于各种任务。

image-20221018105000360.png


5、总结

3种方法进行Graph Embeddings:

  • 方法一:直接使用embeddings node求平均

  • 方法二:使用虚拟节点表示子图,然后embed这个子图

  • 方法三:使用匿名随机游走

    • 想法1:使用匿名随机游走的频数或者概率来表示
    • 想法2:通过整张图和匿名随机游走的embed来表示

image-20221018105241318.png


Node Embeddings的一些应用

  • 聚类/社区发现:聚类ziz_i点。
  • 节点分类:基于ziz_i预测节点i的标签。
  • 边预测:通过定义两个节点之间的向量映射,得到边向量,再进行预测。
  • 图预测:通过聚合节点embeddings或匿名随机游走获取的图zGz_G来预测图的标签。

image-20221018105634715.png