在之前的推荐系统(二)Graph Embedding之DeepWalk和推荐系统(三)Graph Embedding之LINE分别提到通过DFS和BFS的方法来遍历user behavior图结构,但这两种方法的缺陷也比较明显:
- DeepWalk:DFS,只去关注图的某一条路径上的节点,却不关注某个节点周围的环境组成,
- LINE:BFS,和DeepWalk相反,过多关注节点周围环境,而没有探索图的特征。
为了解决以上两个问题,本篇博客介绍的Node2Vec算法通过改变图遍历的方式来兼容DFS(关注结构相似节点)和BFS(关注同质节点)。
关键字: DFS,BFS,RandomWalk
如下是本篇博客的主要内容:
- RandomWalk的进阶实现
- Embedding向量学习
1. RandomWalk的进阶实现
首先需要声明的是,Node2Vec的建模思路和DeepWalk相同,但是在获取训练样本的算法上有两点不同,对于建模思路这里依然沿用之前介绍DeepWalk的解释图(下图),如下会介绍两个不通电。
Node2Vec与RandomWalk的不同点之一在于生成训练数据的方式不同。DeepWalk的思路是遍历图中每个节点,以某个节点为起点截取指定长度的路径构成一条训练数据,方式比较简单。Node2Vec的思路是兼顾结构性和同质性。对于结构性和同质性,可以通过参考下图来辅助理解。图中的
节点和
具有同质性,因为他们直连;图中
和
周围的环境比较相同,因而他们的结构性比较相似。
下面会详细介绍Node2Vec兼顾结构性和同质性的遍历图的算法思路。按照RandomWalk的固有思路,选定一个节点作为源节点,假设这个节点为
,目标是获取一条长度为
的路径,且当前遍历至第
个节点,且为
,需要选定
,这时选中下一个节点为
的概率如下所示,
这时问题的核心落在如何定义
上,论文认为
,其中
代表的是遍历过程中的第
个节点,
代表的是
和
之间边的权重,算法的宏观解释为通过路径中的上一条边和当前节点的邻接边的权重来控制下一条边的走向。经过如上映射,问题的核心又转变为如何定义
,论文认为该问题应该抽象为如下公式,
该公式的辅助图示如下,
论文提到可以通过控制
和
的取值就能兼顾DFS和BFS,当时看到这有点发懵,DFS当然没得说,BFS一时没搞懂,想了一段时间,尝试着解释下我自己的思考过程,只是仅供参考,不太确定对不对。
可以看出,当走到节点
的时候,有一定的概率走到
,回退到
之后又会有一定的概率走到
的另外一个节点
,这时就可以变相地实现BFS,如下图所示,遍历的路径为
。
Node2Vec与RandomWalk的不同点之二在于Node2Vec将图看做有权图,那么就不可避免地遇到采样的问题,这里依然采用alias方法对图中的路径进行快速采样,不熟悉alias采样的小伙伴可以参考这里。经过上述操作,就能将训练数据采样好。
至于代码实现,可以参考这里。
2. Embedding向量学习
第1节将训练数据已经准备好,Embedding学习依然采用类似DeepWalk模型学习的方式,通过Word2Vec模型训练得到图中每个节点的Embedding向量。Word2Vec原理可以参考NLP(一)Word2Vec原理,DeepWalk中Word2Vec的应用可以参考推荐系统(二)Graph Embedding之DeepWalk。