6

GNN 图神经网络简介

 2 years ago
source link: https://blog.xpgreat.com/p/gnn/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

计算机

GNN 图神经网络简介

Aug 27, 2021

1 minute read

图神经网络是是一种基于图结构的广义神经网络。其实传统的神经网络也是可以处理图数据,只需要进行前期合理的embedding即可,那么为什么还需要GNN呢?GNN其实属于一种embedding算法,它通过在整张图上传递、转换、聚合节点的特征信息,从而生成单节点的embedding。本文简要介绍GNN,力求通俗易懂,需要更详细的研究GNN的话,推荐一篇2019年的综述A Comprehensive Survey on Graph Neural Networks

图是由节点(node,或顶点vertex)和边(edge)构成的一种数据结构,节点可以看作是对象,边可以看作是对象之间的关系。进一步的,每个节点可以有自己的信息,边也可以加上权重和方向以表示关系的不同。所以,最基本的图可以表示为V,EV,EV,E,其中VVV是vertex的集合,EEE是edge的集合。简单起见,先不考虑V自身的信息和E的权重和方向。

图的表示一般有两种方式:一种是表示为节点对:(a,b)(a, b)(a,b),表示a,ba, ba,b之间有一条边(暂时不考虑方向)。容易发现,这种表示在边很多的时候会重复存储很多节点信息,可能带来空间的浪费。另一种方式是表示为邻接矩阵(adjacency matrix),即矩阵的横轴和纵轴分别代表边的两端,如果位置\((a, b)\的值\(\Lambda_{a, b} = 1\,即\(a, b\)之间有一条边。使用邻接矩阵的好处是在边很多的时候可以节省空间,可以方便的加上边的权重信息(对应位置的值为2,3等等),也可以利用矩阵的结构,方便的进行并行运算(对机器学习来说非常重要)。但也会存在一个问题,即图很稀疏的时候(边很少),会存在大量的0值,浪费空间,所幸常用的库都做了sparse matrix的各种实现,既节省空间,又保持了矩阵的形式。

一个节点的邻居可以表示为N(a)N(a)N(a),是与该节点之间存在边的所有节点的集合。一个节点的度(degree)是这个节点邻居的个数,即card(N(a))card(N(a))card(N(a)).

神经网络可以看成是多层的加权求和运算,在各个层之间加入激活函数(一般是非线性函数,以提高模型的表示能力),可以写成:

$$ X_1 = activiation(W_0X_0) \\
X_2 = activiation(W_1X_1) \\
…\\
X_n = activiation(W_{n-1}X_{n-1}) \\
Y = output_transformation(W_nX_n) $$

可以使用训练数据集来训练神经网络,也就是获得一组能反应训练集的特征的权重\(W_{0~n)\),这样可以用于预测。为优化权重使用梯度下降算法。此外还有很多tricks,比如dropout。

GNN可以看作是对每一个节点分别使用同一个神经网络来获得这个节点的输出值。在神经网络的每一层里,用该节点自身的邻居的状态来更新该节点的状态,最终状态则是每个节点的输出值。如果用于图的分类问题,可以对全部节点的输出值进行聚合,得到最终的结果。

对每一层的运算过程我们可以抽象成两步:聚集(aggregate)和合并(combine)。对于一个有nnn个节点的图,我们将图的邻接矩阵记为Λ∈Nn×n\Lambda\in \mathbb N^{n \times n}Λ∈Nn×n,ttt层的各个节点的状态记为H∈Nn×dtH \in \mathbb N^{n \times d_t}H∈Nn×dt​,每个节点的状态可能有多个维度,则这两步可以写成:

aggregation:Zt=ΛHt−1combine:Ht=Ct(Zt) aggregation: Z_t = \Lambda H_{t-1} combine: H_t = \mathcal C_t(Z_t) aggregation:Zt​=ΛHt−1​combine:Ht​=Ct​(Zt​)

其中Ct\mathcal C_tCt​是一个合并方程,对ZtZ_tZt​的每一行用一个权重矩阵Wt∈Ndt−1×dtW_t \in \mathbb N^{d_{t-1} \times d_t}Wt​∈Ndt−1​×dt​相乘,将状态矩阵转化到新的维度Ht∈Nn×dtH_t \in \mathbb N^{n \times d_t}Ht​∈Nn×dt​。将所有的步骤合并起来,并在最后加入一个readout function,整个网络可以写成:

f(Λ,H0)=g(HT(Λ,HT−1(Λ,HT−2(Λ,…H1(Λ,H0))))) f(\Lambda, H_0) = g(H_T(\Lambda, H_{T-1}(\Lambda, H_{T-2}(\Lambda, … H_1(\Lambda, H_0))))) f(Λ,H0​)=g(HT​(Λ,HT−1​(Λ,HT−2​(Λ,…H1​(Λ,H0​)))))

输入一个邻接矩阵和初始状态,输出一个预测值,当然也可以去掉readout一步,获得每个节点的状态HTH_THT​作为输出。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK