课程主页:CS224W | Home
课程视频链接:斯坦福CS224W《图机器学习》课程(2021) by Jure Leskovec
1 前言(图表示学习介绍)
2 节点嵌入:编码器和解码器
节点嵌入小结
3 使用随机游走来实现节点嵌入
3.1 定义
3.2 损失函数定义
3.3 提高计算效率——负采样
3.4 优化方法
3.5 随机游走小结
3.6 node2vec概述
3.6.1 有偏随机游走
3.6.2 node2vec算法
3.7 其他随机游走算法
4 总结
5 参考资料
传统的图机器学习一般包含以下四个步骤,大部分的工作都花费在了特征工程(Feature Engineering)中,而图表示学习(Graph Representation Learing)能自动得到结构化的特征,所以图表示学习取代了特征工程的位置。
图表示学习的目标:有效地自动学习到图中用于机器学习的、与下游任务无关的特征。
如上图所示,将一个节点的信息映射到一个多维向量中,这个向量储存了节点的结构信息,通常被称为特征表示(Feature representation)或嵌入(embedding)。
那么为什么要嵌入(Embedding)呢?因为:
举例:使用DeepWalk算法将节点嵌入到二维空间中,可以看到Output将不同类的节点很好地分开了:
定义:图、节点集合、图的邻接矩阵(简化起见:不考虑节点的特征或其他信息)
节点嵌入的目标:将节点编码到embedding space中,并使得embedding的相似度(通常选择向量点积表示)和原始图中节点的相似度(需要被定义)尽可能接近。
在学习节点嵌入的过程中,还需要定义以下几个重要的部分:
学习节点嵌入的过程,就是不断优化Encoder的参数,使得点积最大化,使得下列式子越来越接近的过程:
举例:最简单的编码方式——编码器仅进行嵌入的查找
我们将所有的节点嵌入到矩阵中,每一列代表一个节点的嵌入,我们的目标就是不断学习优化矩阵,而列向量仅仅起到定位节点v的作用(除节点v对应位置为1外,其他位置为0,类似于one-hot编码),两个矩阵相乘即代表查找节点v的embedding的过程。
缺点:当网络中存在大量节点时,矩阵的维数也会变得很大,计算花销非常巨大,不具有可扩展性;
优点:如果得到了,各节点的embedding就能很快被查找到。
类似于这种分别学习每个节点的嵌入的方法还有:DeepWalk、node2vec。
上文一直提到节点相似度函数similarity(u,v)的定义,但是从未下定义。关于节点嵌入的方法有很多,他们的核心区别就在于对节点相似度的定义不同,对相似度的定义通常有以下几个角度:
接下来,我们将要学习用随机游走的方式来定义节点相似度,并学习如何来优化这样定义后的嵌入。
节点u的embedding (我们的目标),从u节点开始随机游走到达v节点的预测概率,用于衡量节点u和节点v之间的相似性。
在之后,会用到Softmax和Sigmoid两个计算预测概率的非线性函数,简单介绍如下:
- Softmax函数将返回一组包含个k数据的向量,且这些数据的和归一化为1,能体现数据的概率分布。其定义为,其中是第个节点的输出,为输出节点的个数。
- Sigmoid函数会将实数归一化到 (0,1) 上。
随机游走的大致过程:从某一节点开始,每一步随机选一个邻居走过去,不断重复。
这样,我们就可以认为: 节点u和v在随机游走过程中共同出现的概率。(即节点v在以节点u为起点的随机游走中出现的概率)
随机游走的步骤:
随机游走的优势:
随机游走是一个无监督特征学习的过程,我们的目的是在d维空间中找到能够保存节点间相似度的节点嵌入,即在网络中邻近的节点在嵌入空间中依然邻近。
所以,我们定义表示以随机游走策略取得的与节点的邻近节点集(取代上文中节点v的位置)。注意,因为同一个节点可能被多次访问到,所以中可能出现多次同一节点。
给定一个图
我们的目标是学习映射(将节点u嵌入到一个d维向量中),即
所以,我们的目标函数可以用log-likelihood定义为:
对这个目标函数的理解是:对节点u,我们通过不断学习优化节点嵌入,使得节点u随机游走得到的邻近节点集的概率最大化。(即u和同时出现的概率最大化)
上边的式子还可以等价为:(最大似然估计加一个负号,就成了需被最小化的损失函数L)
上文中提到, ,再对使用softmax函数,得到:
将该式子替换到损失函数L中,得到我们最终要优化的损失函数:
优化思路:优化随机游走嵌入等同于找到一个嵌入使得最小。
但是计算这个损失函数代价很大,因为需要内外对所有节点进行2次遍历求和,复杂度达到,所以需要进一步改进我们的计算过程。
我们发现问题就在于用于softmax归一化的这个分母:
为了解决这个分母,我们使用负采样(Negative Sampling)的方法:简单来说就是原本我们是用所有节点求和作为归一化的负样本(即当前的分母),现在我们只抽出一部分节点子集作为负样本来近似减少计算。
我们从网络的随机分布中取k个负样本进行归一化,新式子中使用sigmoid函数来辨别目标节点和从随机分布中采样得到的节点
负采样在word2vec算法中的使用具体参考:https://arxiv.org/pdf/1402.3722.pdf
注:k个负样本仅分布随机,抽取并不随机,取每个样本的概率与其度数成正比,度数更多的点更容易选为负样本。
k值的选取有以下注意事项:
也就是说,通过负采样,我们不再需要遍历整个网络中的节点进行计算,而只需要5-20个节点,大大加快了计算的效率。
采用随机梯度下降(SGD)算法来优化上文得到的损失函数。
先介绍一下梯度下降算法的简要步骤:
而在随机梯度下降算法中,我们不需要评估所有的样本,我们只需要评估一小部分样本或单个样本,以下是随机梯度下降算法的简要步骤:
到现在,我们介绍完了如何优化一个通过策略R随机游走得到的嵌入,那么这个随机游走的策略到底是什么呢?换句话说,我们应该通过什么具体的策略来随机游走呢?
最简单的想法是:对每一个节点进行固定长度的,无偏的随机游走,即DeepWalk算法。但这种策略有很多局限性,那么我们怎么进行扩展呢?
一阶随机游走的每一步都仅考虑节点当前位置,二阶随机游走还考虑节点上一步的位置。
具体参考:node2vec算法
思路:使用灵活、有偏、能够平衡网络中局部和全局概念的随机游走方式。
比如两个经典的搜索策略:广度优先搜索(BFS)和深度优先搜索(DFS)
两种遍历方式各有特点:
- BFS:关注节点邻居的微观结构
- DFS:关注节点邻居的宏观结构
在node2vec中,我们将采用有偏定长的随机游走策略R得到节点u的邻域
我们先定义两个重要的参数:
接下来,使用有偏的2阶随机游走研究网络邻居,如下图:
随机游走只是从到达,在这个位置上,它的下一步有三种选择:
关键思想:记住游走过程中的上一个节点。
如果在此过程中引入参数和,将会得到:
注:Prob.目前是非归一化的,将其归一化后将得到W下一步走向四个节点的概率分布。
关于BFS和DFS的选择上,由两个参数和决定:
算法优点:
算法缺点:
核心思想:在进行节点嵌入时,要尽量使嵌入中的向量距离能够反映原始网络中的节点相似度。
衡量节点相似度的指标:
我们需要根据具体情况来选择算法。例如:Node2vec在节点分类任务重表现较好,而其他方法在链路预测任务重表现较好。
下面这篇论文调查了许多图嵌入方法,并将这些方法运用到各种不同的任务中进行了对比,对图嵌入方法进行了全面和结构化的分析:Graph Embedding Techniques, Applications, and Performance: A Survey
基于随机游走的方法通常来说会更有效,但总的来说,必须选择与应用程序相匹配的节点相似度定义。