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