Graph as Matrix
- 一、Graph as Matrix
- 二、PageRank
- 三、PageRank:How to solve?
- 四、Random Walk with Restarts and Personalized PageRank
- 五、Matrix Factorization and Node Embedding
一、Graph as Matrix
本小节将从矩阵的角度研究图形分析和学习。
把一个图当作一个矩阵来处理,我们可以:
- 通过random walk确定节点的重要性(PageRank)
- 通过矩阵分解(matrix factorization ,MF)获得节点嵌入
- 将node embeddings (例如Node2Vec)视为MF
- random walk、MF和node embeddings是密切相关的!
二、PageRank
我们可以将网页看一个图:
- 节点:网页
- 边:超链接
我们将图看作是一个有有向图,超链接的指向构成边的方向:
其他类似的:
论文之间的应用、百科全书之间的引用关系也可以类似的组织成一张有向图:
在Web graph中,并非所有网页(节点)都是同样“重要”,所有想要对Web graph中的网页按照重要性进行排序;有以下三种方法可以实现:
- PageRank
- Personalized PageRank (PPR)
- Random Walk with Restarts
P a g e R a n k PageRank PageRank:
两个重要的思想:
-
如果页面有更多的链接,它就更重要
- 选择出链还是入链作为衡量呢?
因为出链可以自己去构建,所以很容易去造假;而入链不容易造假,所以选择入链会比较靠谱;
可以把入链想象成投票(vote),别人给你投的票越多你就会越重要。
- 选择出链还是入链作为衡量呢?
-
来自重要页面的链接更重要
- 大人物给你投的票会更重要些
- 因此:
- 每个链接的投票与其源页面的重要性成正比
- 如果重要性 r i r_i ri的页面 i i i有 d i d_i di个出链接,每个链接得到 r i / d i r_i / d_i ri/di票
- 页面
j
j
j本身的重要性
r
j
r_j
rj是对其链接的投票总和
可以观察到,上面的问题是一个递归的问题。
对节点
j
j
j定义
r
a
n
k
rank
rank:
r
j
=
∑
i
→
j
r
i
d
i
(1)
r_j=\sum_{i→j}\frac{r_i}{d_i}\tag1
rj=i→j∑diri(1)
- d i d_i di:节点 i i i的出链数
- 节点 i i i至少有一条出链指向节点 j j j
例子:
你可能会想:让我们用高斯消去法来解这个线性方程组。坏主意!因为这样的做法并具备可扩展性。
下面介绍该线性方程组的另一种解法。
首先我们引入随机邻接矩阵(Stochastic adjacency matrix) M M M:
- d i d_i di表示节点 i i i的出度
- 如果
i
i
i到
j
j
j有一条边,那么
M
j
i
=
1
d
i
M_{ji}=\frac{1}{d_i}
Mji=di1;否则为0。
- M M M中每列的和都是1
这个 M M M其实就是一个概率转移矩阵, M j i M_{ji} Mji表示从 i i i节点出发有 M j i M_{ji} Mji的几率去到 j j j节点。
引入Rank vector r r r:
- 一个列向量,第i个元素表示第i个网页的rank值,即第i个网页的重要性。
- ∑ i r i = 1 \sum_ir_i=1 ∑iri=1
对rank的定义公式
(
1
)
(1)
(1),其向量化可写成:
r
j
=
∑
i
→
j
r
i
d
i
⇒
r
=
M
⋅
r
r_j=\sum_{i→j}\frac{r_i}{d_i} \Rightarrow r=M\cdot r
rj=i→j∑diri⇒r=M⋅r
例子:
让我们将Page Rank与Random Walk联系起来:
想象一个随机的网上冲浪者:
- 在某个时间 t t t,冲浪者在网页 i i i上
- 在时间 t + 1 t+1 t+1,冲浪者会均匀随机地点击 i i i的出链接,去到下一个网页。即从网页 i i i中的某个链接去到某个页面 j j j
- 过程无限重复,即这个冲浪者一直在浏览网页。
引入 p ( t ) p(t) p(t):
- 一个列向量,表示在 t t t时间,第 i i i个元素表示冲浪者处于第 i i i个网页的概率。
- 所以, p ( t ) p(t) p(t)是网页的概率分布
如何计算 t + 1 t+1 t+1时刻的网页概率分布呢?
以上图为例子,下一时刻处于网页j的概率=处于网页
i
1
i_1
i1的概率
×
\times
×从网页
i
1
i_1
i1跳到网页j的概率+处于网页
i
2
i_2
i2的概率
×
\times
×从网页
i
2
i_2
i2跳到网页j的概率+处于网页
i
3
i_3
i3的概率
×
\times
×从网页
i
3
i_3
i3跳到网页j的概率。
可以得到下一时刻网页概率分布的向量化公式:
p
(
t
+
1
)
=
M
⋅
p
(
t
)
p(t+1)=M\cdot p(t)
p(t+1)=M⋅p(t)
若经过一段时间后,有:
p
(
t
+
1
)
=
M
⋅
p
(
t
)
=
p
(
t
)
p(t+1)=M\cdot p(t)=p(t)
p(t+1)=M⋅p(t)=p(t)
则 p ( t ) p(t) p(t)是random walk的平稳分布(stationary distribution)。
该公式与之间的 r = M ⋅ r r=M\cdot r r=M⋅r类似,所以可以称 r r r是random walk的平稳分布(stationary distribution)。
让我们将Page Rank与特征向量联系起来:
让我们回忆之前学过的Engienvector centrality
而式
(
1
)
(1)
(1)可以写成:
1
⋅
r
=
M
⋅
r
1\cdot r=M\cdot r
1⋅r=M⋅r
- 所以rank向量 r r r是随机邻接矩阵 M M M特征值为 1 1 1的特征向量
- 从任意节点
u
u
u开始,
M
(
M
(
⋯
M
(
M
u
)
)
)
M(M(\cdots M(M\ u)))
M(M(⋯M(M u)))是网页的长期概率分布,即无论从哪个点开始开始冲浪,
r
r
r都会收敛到同一个相同的结果。
- PageRank =极限分布= M的特征向量
因此我们能找到求解 r r r的方法: P o w e r i t e r a t i o n Power\ iteration Power iteration
之前写的关于Page Rank的一个博客
三、PageRank:How to solve?
P o w e r i t e r a t i o n Power\ iteration Power iteration流程:
- 初始化:
r
(
0
)
=
[
1
/
N
,
⋯
,
1
/
N
]
T
r^{(0)}=[1/N,\cdots,1/N]^T
r(0)=[1/N,⋯,1/N]T
一开始,各网页的重要性都是一样的。 - 迭代: r ( t + 1 ) = M ⋅ r ( t ) r^{(t+1)}=M\cdot r^{(t)} r(t+1)=M⋅r(t)
- 当
∣
r
(
t
+
1
)
−
r
(
t
)
∣
1
<
ε
|r^{(t+1)}-r^{(t)}|_1<\varepsilon
∣r(t+1)−r(t)∣1<ε时停止迭代
这里 ∣ x ∣ 1 = ∑ 1 N ∣ x i ∣ |x|_1=\sum^N_1|x_i| ∣x∣1=∑1N∣xi∣表示第一范式,也可以使用其他的范式
大概迭代50次就可以得到一个收敛的 r r r。
PageRnak存在的三个问题:
- 能否收敛?
- 它会收敛到我们想要的吗?
- 结果合理吗?
下面介绍 d e a d e n d s dead\ ends dead ends和 S p i d e r t r a p s Spider\ traps Spider traps来探讨上面的三个问句。
d
e
a
d
e
n
d
s
dead\ ends
dead ends:
即页面中存在没有出链的节点,这样的页面会导致重要性“leak out”(泄漏)。
S
p
i
d
e
r
t
r
a
p
s
Spider\ traps
Spider traps:
即所有出链都在一个组内,最后这个组会“吸收”所有的重要性。
例子1:能否收敛?
The “Spider trap” problem:
入下图,b节点的出链指向了自己;根据迭代公式,a节点会向b节点投票,而b节点也会向自己投票,而a没有节点向它投票。在多次迭代后,票都会向b节点汇聚,最后 r = [ 0 , 1 ] T r=[0,1]^T r=[0,1]T,从而a节点重要性为0,b节点重要性为1.
会发现无论迭代多少次,重要性都会在这个圈子里打转,导致random surfer会在圈子里打转,出不去。
例子2:它会收敛到我们想要的吗?
The “Dead end” problem:
b节点不存在出链。相当于a把票投给了b,而b不把票投给任何人,票就像投入了一个黑洞,最后导致所有节点的重要性都归为了0。
然而这个收敛的结果并不是我们想要的。
解决Spider trap方案:
思想:
random surfer会在圈打转,那么打破这个圈就行了
所以在每个时间步,random surfer有两个选项:
- 以概率 β \beta β,沿着出链浏览网站
- 以概率 1 − β 1-\beta 1−β,跳到一个随机的网站
一般 β \beta β会被设置为0.8-0.9的一个数。
所以,冲浪者将在几个时间步骤内传送出Spider trap。
解决Dead end的方案:Teleports
思想:
Dead end即死胡同,那我们把死胡同做活就行了。
所以Dead end节点以总概率1.0随机传送到其他节点。
例子:
如下图,m节点是一个死胡同,那么将其做活:
m会等1/N的概率跳转到其他的节点,即走出了死胡同。
为什么Dead end和Spider trap是一个问题,为什么Teleports可以解决这个问题?
-
Spider trap不是问题,但对于PageRank分数不是我们想要的
- 解决方案:
千万不要被困在Spider trap里,在有限的步骤内瞬间移动出来
- 解决方案:
-
Dead-ends是个问题,因为矩阵不是列随机的(列和不为1),所以我们最初的假设不满足。
- 解决方案:
当无处可去时,总是传送,使矩阵列随机
- 解决方案:
综上,PageRank等式更新为:
公式解释:
r j r_j rj表示浏览网页 j j j的概率。
其概率等于:
- 从 r i r_i ri以概率 1 / d i 1/d_i 1/di跳转过来,但有 β \beta β的概率会按出链走
- 还有可能是某个节点以 1 − β 1-\beta 1−β的概率随机跳转到其他节点,并以 1 / N 1/N 1/N的概率跳转到网页 j j j
向量化表示:
G = β M + ( 1 − β [ 1 N ] N × N ) G=β\ M+(1-β\left[\frac{1}{N}\right]_{N\times N}) G=β M+(1−β[N1]N×N)
变成递归的问题: r = G ⋅ r r=G\cdot r r=G⋅r,然后使用Power iteration的方法去求解 r r r。
PageRank案例:
看上图,不存在重要性为0的节点,不重要的节点会赋值为较小的值,入1.6.
B B B和 E E E的入链数相同,但是 E E E的入链来自于一些不重要的节点,所以rank值低一些,而 B B B的入链来自于一些较重要的节点,所以rank值较大。
四、Random Walk with Restarts and Personalized PageRank
以一个推荐问题为例:
下图表示用户和物品交互(如购买)的bipartite graph:
- 我们应该向与物品Q交互的用户推荐什么物品?
- 直觉:如果物品Q和P有相似的用户交互,当用户与Q交互时,推荐P。
因此,我们的目标是在图中找到与 Q Q Q有相似交互的节点 P P P。
如何评估相似性呢?
如下图,A '和A、B,B '哪个更相近呢?
可以使用最短路径来评估节点的相似性,如下图;可以判断A和A’是更相似的。
但对于下图,A,A’与C,C’都有着相同的最短路径,因此很难评估哪个更相似了。
但直觉上,C和C’是更相似,因为C和C’有更多的共同邻居。
所以能否使用共同邻接的数量作为相似性的评估呢?
看下图;D,D’之间有着和C,C’一样数量的共同邻居,但D,D’之间的共同用户之间的相似性却很低。
那该如何衡量两个节点之间的相似性呢?
可以使用Random Walks with Restarts
先介绍三个概念:
- PageRank:
- 根据“重要性”对节点进行排名
- 以均匀概率传送到网络中的任何节点
- Personalized PageRank:
- 根据顶点与转移顶点(teleport nodes)集S中节点的相似性进行排序
- Random Walks with Restarts:
- 根据顶点与给定节点Q的相似性进行排序
- 可以看作是Personalized PageRank的特例,转移顶点集S中只包含一个顶点。
什么是转移顶点集?
-
在标准的RandWalk中,每个节点会以(1-β)的概率转移到图中的任何一个节点,这里的转移顶点集是图中的所有顶点。
-
在Personalized PageRank中,每个节点会以(1-β)的概率转移到给定的转移顶点集S,这里的转移顶点集是图的一个子集。
-
在Random Walks with Restarts,转移顶点集缩小为一个给定的节点Q,每个节点会以(1-β)的概率转移到节点Q。只有一个顶点,所有每次随机游走都会有一定的概率回到原点,这也是名字中restars的含义。
-
在Personalized PageRank和Random Walks with Restarts中,转移节点是一个查询顶点集,即希望找出与转移节点集相似的顶点。
具体步骤:
- 给定一组QUERY_NODES,我们模拟随机游走;
- 随机向一个邻居迈出一步并记录访问次数(visit count)
- 在概率为ALPHA的情况下,会转移到QUERY_NODES中的其中一个节点,重新启动游走
- 访问计数最高的节点与QUERY_NODES的接近度最高
大概意思就是,先从QUERY_NODES中的一个节点开始随机游走,每游走到一个节点,就给这个节点的计数器+1。游走的过程中会有一定概率回到QUERY_NODES,重新开始游走。
最后,与QUERY_NODES相似的节点游走过程中经过的次数是最多的,即计数器的值较大。
算法流程图:
假设访问结果如下;可以评估绿色节点与Q节点相似度较大,而红色节点与Q相似性较小。
为什么这是个好的解决方案呢?
因为“相似性”考虑到了:
- Multiple connections
- Multiple paths
- Direct and indirect connections
- Degree of the node
五、Matrix Factorization and Node Embedding
在Node Embedding中,我们将节点的embedding组织成一个
d
×
N
d\times N
d×N的矩阵
Z
Z
Z,如下图:
优化
Z
Z
Z的方式:
对于相似的节点对(u,v)最大化
z
v
T
z
u
z^T_vz_u
zvTzu。
接下来将上述内容与矩阵分解联系起来。
我们先定义一个最简单的相似度指标:
- 如果节点u和v由一条边连接,则它们是相似的。
- 即 z v T z u = A u , v z^T_vz_u=A_{u,v} zvTzu=Au,v; A u , v A_{u,v} Au,v是图邻接矩阵 A A A的第u行,第v列元素
- 向量化表示: Z T Z = A Z^TZ=A ZTZ=A
因此
Z
Z
Z可以看作是
A
A
A矩阵分解的结果。
- 嵌入维d (Z中的行数)比节点数n小得多。
- 所以,精确的因式分解 A = Z T Z A=Z^TZ A=ZTZ通常是不可能的。【肯定要丢失一些信息】
- 但是,我们可以近似地学习Z
- 目标:
min
Z
∣
∣
A
−
Z
T
Z
∣
∣
2
\min\limits_Z||A-Z^TZ||_2
Zmin∣∣A−ZTZ∣∣2
- 优化Z的过程即优化上面的第二范式
- 在之前的的课程,使用的是softmax函数来代替L2范式,都是学习Z去近似A
- 结论:
由边连通性定义节点相似度的内积译码器,等价于A的矩阵分解
将上述结论进行扩展,DeepWalk和node2vec是基于random walk衡量节点相似度的更复杂的方式,因此Z可以表示为更复杂的矩阵的分解。
-
DeepWalk相当于将以下复矩阵表达式进行矩阵分解:
-
Node2vec也可以表述为矩阵分解(尽管是一个更复杂的矩阵)
- 感兴趣的看论文:
Network Embedding as Matrix Factorization: Unifying DeepWalk, LINE, PTE, and node2vec, WSDM 18
- 感兴趣的看论文:
基于矩阵分解和随机游走的节点嵌入的局限性:
-
限制一:不适用于动态的使用场景,若添加了训练集以外的节点,就要从头开始。
-
限制二:无法捕捉结构相似性:
如下图,{1、2、3}和{11、12、13}在结构上很相似,但deepWalk和Node2vec会赋予1和11很不一样的embedding,因为它们的邻居很不同。
当然,可以通过匿名路径来忽略节点的身份,从而学习到结构相似性。
所以DeepWalk和node2vec不能捕获结构相似性。匿名路径可以学习到结构相似性 -
限制三:不能利用节点、边和图特征。
解决这些限制的方法:深度表示学习和图神经网络。
将在下一章进行讲解