对于新浪微博,微信,qq这样大规模的社交关系,离线计算好用户的相似度并存储下来,供线上推荐系统使用,显然不太合理。那么能否用一个坐标表示来描述用户在社交网络中的位置?这样只需提前计算好用户坐标。线上计算用户之间的相似度时,只要计算坐标的距离或者用余弦相似度即可我们可以通过network embedding的方法来计算用户的坐标。network embedding 就是一种图特征的表示学习方法,他从输入的网络图中,学习到节点的表达。
node2vec的整体思路分为两个步骤:
第一个步骤为:random walk(随机游走),即通过一定规则随机抽取一些点的序列。
第二个步骤为:将点的序列输入至我Word2Vec模型,从而得到每个点的embedding向量。
下面我将介绍一下这两个步骤的计算方法:
1. random walk
walk random的基本流程,给定一张图G和一个起始节点S,标记起始节点为当前位置,随机选择当前位置节点的一个邻居并将当前位置移动至被选择的邻居位置,重复以上步骤n次,最终会得到从初始节点到结束节点的一条长度为n的“点序列”。此条“点序列”即称图G上的依次random walk
random walk 算法主要分为两步:
(1)选择起始节点
其中起始节点的选择存在两种常见做法:
其一,按照一定规则随机从图中抽取一定数量的节点
其二,以图中所有节点作为起始节点。
一般来说我们选择第二种方法,以使所有节点都会被选取到。
(2)选择下一跳节点。
下一跳最简单的方法是按照变得权重随机选择。但是在实际应用中,我们希望能控制广度优先还是深度优先,从而影响random walk能够游走的范围。一般来说,深度优先的方法,发现能力更强。光度优先的方法,社区内的节点更容易出现在一个路径里。
如上图,我们假设第一步是从t随机游走到v,这时候我们要确定下一步的邻接节点。在本例的随机游走中,作者定义了p和q两个参数变量来调节游走。首先计算其邻居节点与上一节点t的距离d,根据一下公式得到alpha
1/p,d=0
alpha= 1,d=1
1/p,d=2
当下一节点选择为t,即往回走的时候,d=0;当下一节点为x1时,v,t和x1构成三角形,d=1;当下一节点为x2或者x3时,d=2。这时,根据alpha的值确定下一节点的选择概率。如果p大于max(q,1),则产生的序列与深度优先搜索类似,刚刚被访问过的节点不太可能被重复访问;反之,如果p小于min(q,1)则产生的序列与宽度优先搜索类似,倾向于周边节点。
至此,我们就可以通过random walk生成点的序列样本。一般来说,我们会从每个点开始游走5~10次,步长则根据点的数量N游走根号N步。