GNN简介
图神经网络是一种在图结构上进行计算的神经网络。GNN 的一个典型应用是节点分类。本质上,图中的每一个节点都与一个向量(也即标签)相关联。如下图所示,a 节点的向量表示为 [0.3, 0.02, 7, 4, …],将该向量继续做分类即可得到 a 节点的类别。
如何获得a的向量表示?可以简单的思考一下,a 节点的向量表示一定应该与其相邻节点和相邻边有关系,假设每个节点
v
v
v的one-hot 向量表示为
X
v
X_v
Xv,则
h
v
=
f
(
X
v
,
X
c
o
[
v
]
,
h
n
e
[
v
]
,
X
n
e
[
v
]
)
h_v=f(X_v,X_{co[v]},h_{ne[v]},X_{ne[v]})
hv=f(Xv,Xco[v],hne[v],Xne[v])其中
X
c
o
[
v
]
,
h
n
e
[
v
]
,
X
n
e
[
v
]
X_{co[v]},h_{ne[v]},X_{ne[v]}
Xco[v],hne[v],Xne[v]分别是与
v
v
v相邻边的的one-hot 向量表示、
v
v
v相邻点的embedding向量表示、
v
v
v相邻点的one-hot 向量表示。
GCN简介
传播公式
考虑一个多层图卷积网络(GCN),其层间传播规则如下: H ( l + 1 ) = σ ( D ~ − 1 2 A ~ D ~ − 1 2 H ( l ) W ( l ) ) H^{(l+1)}=\sigma(\widetilde{D}^{-\frac{1}{2}}\widetilde{A}\widetilde{D}^{-\frac{1}{2}}H^{(l)}W^{(l)}) H(l+1)=σ(D −21A D −21H(l)W(l))
- A ~ = A + I N \widetilde{A}=A+I_N A =A+IN表示图 G G G的邻接矩阵 A A A和单位矩阵 I N I_N IN相加
-
D
~
i
i
=
Σ
j
A
~
i
j
\widetilde{D}_{ii}=\Sigma_j\widetilde{A}_{ij}
D
ii=ΣjA
ij 表示
D
~
\widetilde{D}
D
是将
A
~
\widetilde{A}
A
每行数据之和放在对角线位置上形成的
以下图G为例:
如下图, A ~ H ( l ) \widetilde{A}H^{(l)} A H(l)的含义是聚合周围节点(含自己)的信息,来更新自己
由于简单的聚合似乎不太合理(因为不同的节点重要性不一样),应该引入一种类似于「注意力机制」的东西。具体来说,如果一个节点的「度」非常大,即与他相邻的节点非常多,那么它传递的消息,权重就应该小一点。 D ~ − 1 2 \widetilde{D}^{-\frac{1}{2}} D −21的作用就是如此。 D ~ \widetilde{D} D 的对角线上的值近似于度。开根号避免相乘溢出。
GCN 的流程:
- D ~ − 1 2 A ~ D ~ − 1 2 H ( l ) W ( l ) \widetilde{D}^{-\frac{1}{2}}\widetilde{A}\widetilde{D}^{-\frac{1}{2}}H^{(l)}W^{(l)} D −21A D −21H(l)W(l)节点间进行特征传递
- σ ( D ~ − 1 2 A ~ D ~ − 1 2 H ( l ) W ( l ) ) \sigma(\widetilde{D}^{-\frac{1}{2}}\widetilde{A}\widetilde{D}^{-\frac{1}{2}}H^{(l)}W^{(l))} σ(D −21A D −21H(l)W(l))对每一个节点做一次线性变换并且激活
- 重复 n n n次步骤 1 和步骤 2,实现多层图卷积
- 获取最终的 H ( n ) H^{(n)} H(n)作为最终的节点表示,然后送入到下游任务中,例如节点分类
GraphSage&PinSage简介
GraphSage和PinSage都是在GCN的基础上应用图采样算法减少感受野以加快梯度下降效率和模型泛化能力。只是这二者使用的图采样算法有区别。
为什么使用图采样算法
现实图数据集往往边、节点众多,以整图进行GCN的聚合操作会出现节点爆炸导致GPU显存不足以存放、梯度下降效率低下等问题,如下图。
那么如何减少数据量呢?一个方法是以图采样方式减少单个节点的感受野,从而减少单batch数据量。
在图采样时,需保证采样后的子图是连通的。例如下图中,左边采样的子图就是连通的,右边的子图不是连通的。
GraphSage
GraphSAGE 主要分两步:采样、聚合
举一个例子,如下图,以图
G
G
G为例
-
采样的策略时另据采样,首先选取一个点,然后随机选取这个点的一阶邻居,再以这些邻居为起点随机选择它们的一阶邻居。
- 例如下图中,我们要预测 0 号节点,因此首先随机选择 0 号节点的一阶邻居 2、4、5,然后随机选择 2 号节点的一阶邻居 8、9;4 号节点的一阶邻居 11、12;5 号节点的一阶邻居 13、15
- 例如下图中,我们要预测 0 号节点,因此首先随机选择 0 号节点的一阶邻居 2、4、5,然后随机选择 2 号节点的一阶邻居 8、9;4 号节点的一阶邻居 11、12;5 号节点的一阶邻居 13、15
-
聚合具体来说就是直接将子图从全图中抽离出来,从最边缘的节点开始,一层一层向里更新节点
邻居采样有两个好处:
由于训练时本身就只取用了部分邻居节点,因此在推理时出现新的不同的邻居节点时,模型也能很好的泛化。
PinSage
采样时只能选取真实的邻居节点吗?如果构建的是一个与虚拟邻居相连的子图有什么优点?PinSAGE 算法就是基于这两个思路,进行虚拟邻居采样。
举一个例子,如下图,以图 G G G为例
- PinSAGE 算法通过多次随机游走,按游走经过的频率选取邻居,例如下面以 0 号节点作为起始,随机进行了 4 次游走
- 其中 5、10、11 三个节点出现的频率最高,因此我们将这三个节点与 0 号节点相连,作为 0 号节点的虚拟邻居(具体选择几个节点根据采样参数决定)
虚拟邻居采样好处: - 可以快速获取远距离邻居的信息。
- 实际上如果是按照 GraphSAGE 算法的方式生成子图,在聚合的过程中,非一阶邻居的信息可以通过消息传递逐渐传到中心,但是随着距离的增大,离中心越远的节点,其信息在传递过程中就越困难,甚至可能无法传递到;如果按照 PinSAGE 算法的方式生成子图,有一定的概率可以将非一阶邻居与中心直接相连,这样就可以快速聚合到多阶邻居的信息
参考链接
https://wmathor.com/index.php/archives/1533/
https://wmathor.com/index.php/archives/1532/
https://wmathor.com/index.php/archives/1531/