前言
最近在调研知识图谱分割算法,看到了这篇论文GAP: Generalizable Approximate Graph Partitioning Framework,直接翻译就是可推广的近似图划分框架,按照我的理解,意思大概就是说,模型是以图节点的近似程度为基础来划分子图,并且模型具有一定的泛化能力。
GAP模型
GAP模型主要包含图嵌入模块(Graph Embedding Module)和图分割模块(Graph Partitioning Module):
- 图嵌入模块:使用GCN(Graph embedder)提取特征和GraphSAGE(Node embeddings)生成高维图节点表示;
- 图分割模块:使用全连接层和Softmax;
图嵌入模块
图卷积神经网络GCN
论文:SEMI-SUPERVISED CLASSIFICATION WITH GRAPH CONVOLUTIONAL NETWORKS
GAP模型使用GCN来提取特征,假设图
G
G
G有
N
N
N个顶点,每个顶点都有自己的特征,假设顶点的特征组成
N
×
D
N×D
N×D维的矩阵
X
X
X,顶点之间的关系组成
N
×
N
N×N
N×N维的邻接矩阵
A
A
A,则GCN神经网络层与层之间正向传播可以表示为:
H
l
+
1
=
σ
(
A
^
H
l
W
l
)
H^{l+1}=\sigma(\hat{A}H^lW^l)
Hl+1=σ(A^HlWl)
其中,
A
^
=
D
~
−
1
2
A
~
D
~
−
1
2
\hat{A}=\tilde{D}^{-\frac{1}{2}}\tilde{A}\tilde{D}^{-\frac{1}{2}}
A^=D~−21A~D~−21,
A
~
=
A
+
I
n
\tilde{A}=A+I_n
A~=A+In,
I
n
I_n
In是单位矩阵,
D
~
\tilde{D}
D~是
A
~
\tilde{A}
A~的度矩阵,
D
~
i
i
=
∑
j
A
~
i
j
\tilde{D}_{ii}=\sum_j\tilde{A}_{ij}
D~ii=∑jA~ij,
A
^
\hat{A}
A^可以直接由邻接矩阵
A
A
A计算得到;
W
l
W^l
Wl是第
l
l
l层的权重矩阵,
σ
\sigma
σ是非线性激活函数,
H
l
H^l
Hl是第
l
l
l层的特征,输入层特征
H
0
H^0
H0为
X
X
X。
GAP使用三层GCN来提取特征:
Z
=
t
a
n
h
(
A
^
t
a
n
h
(
A
^
t
a
n
h
(
A
^
X
W
0
)
W
1
)
W
2
)
Z=tanh(\hat{A}tanh(\hat{A}tanh(\hat{A}XW^{0})W^1)W^2)
Z=tanh(A^tanh(A^tanh(A^XW0)W1)W2)
GraphSAGE(Graph sample and aggregate approach)
论文:Inductive Representation Learning on Large Graphs
GAP模型使用GraphSAGE作为图嵌入模块,embedding既是高维特征的低维表示;GraphSAGE的核心是采样和聚合,先通过采样获取目标节点邻居的特征,再聚合邻居的特征生成目标节点的embedding。
GraphSAGE算法基本步骤如上图所示:
- 先对目标节点的邻居随机采样,降低计算复杂度(图中1跳邻居采样数=3,2跳邻居采样数=5)
- 生成目标节点embedding:先聚合2跳邻居特征,生成1跳邻居embedding,再聚合1跳邻居embedding,生成目标节点embedding
- 将目标节点的embedding输入全连接网络得到目标节点的预测值。
算法1的输入包含了
k
k
k个聚合函数,就是
k
k
k次embedding操作;伪代码第4行使用聚合函数聚合节点
v
v
v的邻居得到
h
N
(
v
)
k
h_{N(v)}^k
hN(v)k,第5行
h
N
(
v
)
k
h_{N(v)}^k
hN(v)k和
h
v
k
−
1
h_v^{k-1}
hvk−1拼接后进行非线性转换得到
h
v
k
h_v^k
hvk,最后经过L2正则化得到该层的输出。
此外,GraphSAGE算法支持miniatches处理节点和边:
算法2的伪代码2-7行阐述了GraphSAGE采样的过程; B \mathcal{B} B是要计算embedding的节点集合,即一个batch nodes; B k − 1 B^{k-1} Bk−1表示节点 v ϵ B k v ϵ B^k vϵBk计算embedding需要的节点集合,所有 B k − 1 B^{k-1} Bk−1是 B \mathcal{B} B节点集合的1跳邻居的节点集合; N k ( u ) N_k (u) Nk(u)表示节点 u u u的邻居随机采样方法。算法2可以看出,GraphSAGE采样是从1跳邻居到 k k k跳邻居,聚合是从 k k k跳邻居到1跳邻居。
聚合函数
略,需要图
图分割模块
GAP模型的图分割模块比较简单,就是一个传统的全连接层 + softmax输出表示节点属于每个分区的概率。
损失函数
GAP模型的损失函数主要考虑两个方面:
- 割边数
- 负载均衡
定义
给定图 G = ( V , E ) , V = { V i } , E = { e ( v i , v j ) ∣ v i ∈ V , v j ∈ V } G=(V,E),V=\{V_i\},E=\{e(v_i,v_j)|v_i\in{V},v_j\in{V}\} G=(V,E),V={Vi},E={e(vi,vj)∣vi∈V,vj∈V}表示图 G G G中的节点和边的集合, n n n为节点数。图 G G G可以被分割为 g g g个不相交的集合 S 1 , S 2 , . . . , S g S_1,S_2,...,S_g S1,S2,...,Sg; V V V是 g g g个集合中节点的并集: ⋃ k = 1 g S k = V , ⋂ k = 1 g S k = ∅ \bigcup_{k=1}^{g}S_k=V,\bigcap_{k=1}^{g}S_k=\emptyset ⋃k=1gSk=V,⋂k=1gSk=∅
最小割
形成不相交集合需要移除的边数成为割
c
u
t
cut
cut,给定集合
S
k
,
S
ˉ
k
S_k,\bar{S}_k
Sk,Sˉk:
c
u
t
(
S
k
,
S
ˉ
k
)
=
∑
v
i
∈
S
k
,
v
j
∈
S
ˉ
k
e
(
v
i
,
v
j
)
cut(S_k,\bar{S}_k)=\sum_{v_i\in{S_k},v_j\in{\bar{S}_k}}e(v_i,v_j)
cut(Sk,Sˉk)=vi∈Sk,vj∈Sˉk∑e(vi,vj)
推广到多个不相交集合:
c
u
t
(
S
1
,
S
2
,
.
.
.
,
S
g
)
=
1
2
∑
v
i
∈
S
k
,
v
j
∈
S
ˉ
k
g
c
u
t
(
S
k
,
S
ˉ
k
)
cut(S_1,S_2,...,S_g)=\frac{1}{2}\sum_{v_i\in{S_k},v_j\in{\bar{S}_k}}^{g}cut(S_k,\bar{S}_k)
cut(S1,S2,...,Sg)=21vi∈Sk,vj∈Sˉk∑gcut(Sk,Sˉk)
最小割的标准有利于分割度较小的节点,导致分割得到的子图负载不均衡。(比如一个节点只有一度,切割该节点的一条边就可以得到一个子图)
归一化割
归一化割可以避免子图负载不均衡的问题:
N
c
u
t
(
S
1
,
S
2
,
.
.
.
,
S
g
)
=
∑
v
i
∈
S
k
,
v
j
∈
S
ˉ
k
g
c
u
t
(
S
k
,
S
ˉ
k
)
v
o
l
(
S
k
,
V
)
Ncut(S_1,S_2,...,S_g)=\sum_{v_i\in{S_k},v_j\in{\bar{S}_k}}^{g}\frac{cut(S_k,\bar{S}_k)}{vol(S_k,V)}
Ncut(S1,S2,...,Sg)=vi∈Sk,vj∈Sˉk∑gvol(Sk,V)cut(Sk,Sˉk)