- 论文地址:https://arxiv.org/pdf/1607.00653.pdf
- 发表会议:KDD2016
文章目录
1. 引言
这篇论文可以说是对DeepWalk的扩展。按照LINE中的说法,DeepWalk只捕捉了节点间的二阶相似性,LINE同时捕捉节点间的一阶相似性和二阶相似性。而Node2Vec也是同时捕捉了一阶相似性和二阶相似性,和LINE不同的是,Node2Vec是基于Random Walk实现的。
首先介绍两个重要的概念:
一阶相似性:在Node2Vec中也叫做同质性(homophily)。一阶相似性捕捉的是图中实际存在的结构,比如两个节点由一条边相连,则这两个节点应该具有相似的表示。按照Node2Vec中的说法,高度互连且属于相似网络集群或社区的节点表示应该比较相近。一阶相似性往往可以通过对节点的DFS遍历得到。
二阶相似性:在Node2Vec中也叫做结构对等性(structural equivalence)。在网络中具有相似结构的节点表示应该相近,它并不强调两个节点是否在图中存在连接,即使两个节点离得很远,但由于结构上相似(连接的邻居节点相似),它们的表示也应该相似。所以二阶相似性可以发现不同的社区。二阶相似性可以通过对节点的BFS遍历得到。
一阶相似性和二阶相似性的区别可由下图看出:
(图1):
其中节点
U
U
U和节点
S
6
S_6
S6就是属于二阶相似性,可由BFS遍历捕获到;
U
U
U和
S
1
S_1
S1就属于一阶相似性,可由DFS捕获到。
注:这里的结论可能与我们理解的相反,即,一阶相似性不应该由BFS得到吗?下面介绍Node2Vec时会给出我自己的一些想法。
Node2Vec首先借鉴了自然语言处理中的skip-gram算法,给定一个节点,最大化周围邻居节点出现的条件概率:
(公式1):
注:这里 N s ( u ) N_s(u) Ns(u)是节点 u u u的邻居节点,在Node2vec中,邻居节点有着不一样的定义,它不一定是有直接边相连的节点,而是根据采样策略确定的。后面会有详细介绍。
为了方便优化上式,作者做了两个假设:
- 条件独立性假设:即各个邻居节点是互相独立的,所以有:
- 特征空间的对称性:即一个节点和它的邻居节点之间的影响是相互的,于是也可以对邻居节点进行嵌入表示,然后利用点乘的形式刻画条件概率:
有了以上两点假设,就可以把公式(1)改成以下形式:
公式(2):
其中:
这里我们发现,最终导出的目标函数和LINE中二阶相似性公式很像,实际上两者只相差了一个边的权重 w i j w_{ij} wij。和LINE中一样,计算 Z u Z_u Zu是耗时的,所以作者也采用了负采样的方法。
注:LINE中对二阶相似性建模的公式:
写到这里可以发现,以上思想和DeepWalk是非常相似的,都是给定一个节点,最大化邻居节点(一次采样路径上的节点)出现的条件概率,只不过由于计算方式的不同,Node2vec捕捉了二阶相似性,DeepWalk捕捉了一阶相似性?(这里存疑)。DeepWalk到这里核心算法其实已经结束了,它接下来都在介绍如何利用Hierarchical Softmax来优化条件概率的计算。而Node2vec到这里才刚刚开始,它和DeepWalk的最大不同就是如何采样节点,即采样邻居节点 N s ( u ) N_s(u) Ns(u)。
2. 采样算法
2.1. 传统的采样算法
传统的采样方法主要分为以下两部分:
- 基于BFS,基于广度优先遍历的采样。那么通常 N s ( u ) N_s(u) Ns(u)为节点 u u u的直接邻居,即与 u u u直接相连的节点。比如在图1中,我们设置采样大小 K = 3 K=3 K=3,那么 N s ( u ) N_s(u) Ns(u)为 s 1 s_1 s1、 s 2 s_2 s2和 s 3 s_3 s3。
- 基于DFS,基于深度优先遍历的采样。那么采样的节点会离源节点越来越远。比如在图1中,我们设置采样大小 K = 3 K=3 K=3,那么 N s ( u ) N_s(u) Ns(u)为 s 4 s_4 s4、 s 5 s_5 s5和 s 6 s_6 s6。
实际上,这两种比较极端的采样方法DFS和BFS对应于前面所说的一阶相似性和二阶相似性,也叫同质性和结构对等性。node2vec就是想通过设计一种采样算法,来融合一阶相似性和二阶相似性。
2.2. Node2vec中的采样算法
node2vec中的采样算法是基于random walk的。给定源节点
u
u
u,采样长度
l
l
l,假设当前在第
c
i
−
1
c_{i-1}
ci−1个采样节点,那么下一个采样节点为
x
x
x的概率为:
其中
π
v
x
\pi_{vx}
πvx为从节点
v
v
v到节点
x
x
x的转移概率。
Z
Z
Z为归一化的常数。
传统的random walk采样算法是完全随机的,这样就很难刻意让采样过程自动寻找一阶和二阶相似性。为此,作者提出了二阶随机游走(2nd order random walk)。
以上图为例,当前在节点
v
v
v,并且上一步在节点
t
t
t,那么对于下一步的转移概率
π
v
x
\pi_{vx}
πvx,作者定义
π
v
x
=
α
p
q
(
t
,
x
)
⋅
w
v
x
\pi_{vx}=\alpha_{pq}(t,x)·w_{vx}
πvx=αpq(t,x)⋅wvx,其中:
这里
d
t
x
d_{tx}
dtx表示了下一步的动作类型,
d
t
x
=
0
d_{tx}=0
dtx=0表示返回上一步访问过的节点即
t
t
t;
d
t
x
=
1
d_{tx}=1
dtx=1表示访问上一步节点
t
t
t的下一个邻居节点比如
x
1
x_1
x1,即对节点
t
t
t进行BFS遍历访问;
d
t
x
=
2
d_{tx}=2
dtx=2表示访问更远的节点,即从
v
v
v出发继续DFS遍历访问。
而二阶随机游走只需两个参数
p
p
p和
q
q
q就可以完成。
其中
p
p
p指“返回参数”,它控制着返回已经访问过的节点的概率,如果
p
p
p比较大(
>
m
a
x
(
q
,
1
)
>max(q,1)
>max(q,1)),那么不太可能会再次访问上一个访问过的节点;如果
p
p
p比较小(
<
m
i
n
(
q
,
1
)
<min(q,1)
<min(q,1)),那么很有可能再次访问上一个访问的节点。
q
q
q指“in-out参数”,它控制着下一步采样是在当前节点周围还是去探索更远的节点,换句话说,是按照BFS采样还是DFS。如果
q
>
1
q>1
q>1,则采样倾向于在对
t
t
t进行BFS采样,可以捕捉图的局部信息;如果
q
<
1
q<1
q<1,则采样倾向于对
t
t
t进行DFS采样,可以捕捉图的全局信息。
2.3. 使用基于random walk采样的好处(时间空间复杂度分析)
空间复杂度:因为需要保存每个节点的二阶邻居,所以空间复杂度为
O
(
α
2
∣
V
∣
)
O(\alpha^2|V|)
O(α2∣V∣),其中
α
\alpha
α为每个节点的平均度(degree)。
时间复杂度:假设对于长度为
l
l
l的一次random walk,每个节点需采样的邻居节点数为
k
k
k,则能为
l
−
k
l-k
l−k个节点找到他们的邻居节点,那么这一次random walk使用的节点总数就为
k
(
l
−
k
)
k(l-k)
k(l−k)。以图1为例,
l
=
6
l=6
l=6,
k
=
3
k=3
k=3时,一次random walk采样到的节点序列为
{
u
,
s
4
,
s
5
,
s
6
,
s
8
,
s
9
}
\{u,s_4,s_5,s_6,s_8,s_9\}
{u,s4,s5,s6,s8,s9},那么产生的邻居节点
N
s
(
⋅
)
N_s(·)
Ns(⋅)为,
N
s
(
u
)
=
{
s
4
,
s
5
,
s
6
}
N_s(u)=\{s_4,s_5,s_6\}
Ns(u)={s4,s5,s6},
N
s
(
s
4
)
=
{
s
5
,
s
6
,
s
8
}
N_s(s_4)=\{s_5,s_6,s_8\}
Ns(s4)={s5,s6,s8},
N
s
(
5
)
=
{
s
6
,
s
8
,
s
9
}
N_s(5)=\{s_6,s_8,s_9\}
Ns(5)={s6,s8,s9},即能为6-3=3个节点找到它们的邻居节点,一次random walk使用的节点总数为3*(6-3)=9。同时一次random walk的时间复杂度为
l
l
l,那么实际每采样一个节点的平均时间复杂度为
O
(
l
k
(
l
−
k
)
)
O(\frac{l}{k(l-k)})
O(k(l−k)l)。由于样本重用(sample reuse),即不同节点的邻居节点有重合,大大降低了时间复杂度。如果没有样本重用,长度为
l
l
l的一次采样只会采样并利用
l
l
l个节点。虽然样本重用可能会造成偏差,但是时间复杂度确实提高不少。
3. node2vec算法流程
特征学习算法(输入为图
G
=
(
V
,
E
,
W
)
G=(V,E,W)
G=(V,E,W),节点维度
d
d
d,每个节点的walk数
r
r
r(并行),步长
l
l
l,上下文长度(邻居个数)
k
k
k,返回参数
p
p
p,in-out参数
q
q
q)
- 首先计算各条边的转移概率 π \pi π
- 将转移概率做为权重后的新图 G ′ = ( V , E , π ) G^{'}=(V,E,\pi) G′=(V,E,π)
- 初始化采样路径集合 w a l k s walks walks为空
- 每个节点同时运行 r r r个walk
- 对于图中每个节点 u u u
- 利用算法 n o d e 2 v e c W a l k ( G ′ , u , l ) node2vecWalk(G^{'},u,l) node2vecWalk(G′,u,l)采样产生一条从节点 u u u开始的路径 w a l k walk walk
- 将产生的路径加入路径集合 w a l k s walks walks
- 利用随机梯度下降学习节点的表示 f f f
- 返回 f f f
node2vecWalk算法(输入为图 G ′ = ( V , E , π ) G^{'}=(V,E,\pi) G′=(V,E,π),开始节点 u u u,步长 l l l)
- 初始化采样序列 w a l k walk walk为节点 [ u ] [u] [u]
- 从1到 l l l开始循环(共采样 l l l个节点)
- 取出 w a l k walk walk中的当前节点 c u r r curr curr
- 从图 G ′ G^{'} G′中得到 c u r r curr curr的邻居节点集合 V c u r r V_{curr} Vcurr
- 根据转移概率 π \pi π从 V c u r r V_{curr} Vcurr中采样一个节点 s s s
- 将 s s s加入 w a l k walk walk
- 返回 w a l k walk walk
注:node2vecWalk算法的第5步采用了alias采样算法,可以再O(1)时间内完成。
4.实验
作者首先利用小说《悲惨世界》的人物共现关系验证了node2vec方法的有效性。如下图所示:
其中,位于上面的一副图是设置
p
=
1
,
q
=
0.5
p=1,q=0.5
p=1,q=0.5时节点的表示。相同颜色的节点表示相似。上面的一副图设置侧重于DFS,所以它能捕捉到节点的同质性,即相同社区的节点聚集在一起,颜色相同。我的理解是:偏重DFS时,两个社区可能只有几条边相连,而社区内部相连的边会很多,那么偏重DFS采样时,两个社区的节点同时被采样到的概率会很小,所以两个社区之间节点的相似性就会变小,同时社区之内节点的相似性就会变大。(根据公式(2))。所以偏重DFS会发现不同的社区聚集,即同质性。
下面的一幅图是设置 p = 1 , q = 2 p=1,q=2 p=1,q=2时节点的表示。它侧重于BFS,所以能发现节点的结构等同性,比如位于边缘的节点都是同一颜色,位于中间的节点是同一颜色。我的理解是:偏重BFS时,即使两个社区只有少数边连接,但是采样是根据邻居节点来的,所以不同社区的节点也会进行相似逼近,因为有可能位于两个社区的两个节点是邻居。所以偏重BFS会刻画出图的结构信息,比如位于边缘的节点表示相似,位于中间的节点表示相似,这就是结构等同性。
最后作者在节点多标签分类和链接预测任务上进行了实验,验证了node2vec的优越性。
5. 总结
node2vec可以说是deepwalk的扩展,通过两个参数 p p p和 q q q来控制bfs和dfs两种方式的随机游走,而deepwalk是一种不加制约,漫无目的的游走,不能显式建模节点之间的结构信息。