图神经网络

1.图神经网络的定义

是一种直接作用于图结构上的神经网络。我们可以把图中的每一个节点V当作个体对象,而每一条边E当作个体与个体间的某种联系,所有节点组成的关系网就是最后的图U。这里的V , E , U都可以编码成一个特征向量,所以实际上GNN还是做的是提取特征的工作而已。

2.GNN与CNN、RNN的区别

GNN面向的输入对象其实都是结构不规则、不固定的数据结构,而CNN面向的图像数据和RNN面向的文本数据的格式都是固定的。因此,面对本身结构、彼此关系都不固定的节点特征,必须需要借助图结构来表征它们的内在联系。

3.GNN的原理

①聚合

GNN的输入一般是每个节点的起始特征向量和表示节点间关系的邻接矩阵。而所谓的聚合,其实就是将周边与节点Vi有关联的节点{V a, V b, . . . }加权到Vi上,当作一次特征更新。

图神经网络DGL数据封装和消息传递机制_python

②更新

根据聚合得到的数据,更新所有图节点的特征,同理,对图中的每个节点进行聚合操作,更新所有图节点的特征。

图神经网络DGL数据封装和消息传递机制_图神经网络DGL数据封装和消息传递机制_02

③循环

一次图节点聚合操作与 w加权,可以理解为一层,后面再重复进行聚合、加权,就是多层迭代了。一般GNN只要3~5层即可,所以训练GNN对算力要求很低。

图神经网络DGL数据封装和消息传递机制_python_03

4.图神经网络实现的两种方式

基于空间的:定义指定感受野的滤波器(filter)在图上进行滑动
 ●与普通的神经网络有很强的类比性,易于理解
 ●需要定义邻居系统和节点顺序->不直观
基于频域(谱)的:利用傅里叶变换,即时域卷积为频域点乘
 ●不需要定义邻居系统和节点顺序,易于理解
 ●有体系化的公式可用
 ●可以获得严格局部化的滤波器
 ●无法在不同的图结构间迁移

5.GGNN(基于空域的图神经网络)

①GGNN的原理

基于GRU提出了GGNN,实现信息在graph中的传递。

·传递模型(在边(edge)上传递特征,允许多种边类型,使得一条边上的两个节点之间可以互相传递信息)

t时刻节点v的特征表示:hv(t)

图神经网络DGL数据封装和消息传递机制_深度学习_04


式(1)中,hv(1)是节点v的初态,是D维向量,当节点输入特征xv维度小于D时,在后面补0。

式(2)中,Av:是从图1©的矩阵A中选出对应节点v的两列, A是D|V|×2D|V|维,Av:是D|V|×2D|V|维。后面的是将t-1时刻所有节点特征append形成的D|V|维向量。因此av(t)是2D维向量,表示节点和相邻接点间通过edges的相互作用结果。因为计算

时对A取了in和out两列,故这里计算的结果考虑了双向信息传递。

式(3)-(6)类似GRU的计算过程。zv(t)控制遗忘信息,rv(t)控制新产生信息。(式(6)中(1一zv(t))ꙩ选择遗忘哪些过去的信息,zv(t)ꙩ选择记住哪些新产生的信息。式(5)中rv(t)ꙩ决定从哪些过去的信息中产生新信息)。hv(t)是新产生的信息。hv(t)是最终更新的节点状态。

zv(t)和rv(t)分别叫做update gate和reset gate,这就是GRU和GGNN中gate的来历。

·输出模型(对于每个节点v,基于其特征表示h计算最终的输出特征o。这里g可以是一个神经网络)

图神经网络DGL数据封装和消息传递机制_神经网络_05

②GGNN代码分析

图神经网络DGL数据封装和消息传递机制_python_06


以上是GGNN每一个时间步的实现,构造入边和出边邻接矩阵,并分别和图做计算,再通过一个GRU计算输出特征。

图神经网络DGL数据封装和消息传递机制_深度学习_07


在每一个时间步循环内,求入边特征和出边特征,将所有种类的边得到的特征连接起来,再用用门控图模块更新h,计算输出特征。

6.GCN(基于频域的图神经网络)

①GCN的原理

和卷积类似,GCN也可以做多层,每一层输入的还是节点特征,然后将特征和网络结构图继续传入下层就可以不断计算下去。

图神经网络DGL数据封装和消息传递机制_深度学习_08


·求图模型的邻接矩阵和度矩阵

其中度矩阵用来表示一个节点和多少个节点相关联。

·特征计算

求得矩阵A , D , X 后,进行特征的计算,来聚合邻居节点的信息。

邻接矩阵 A没有考虑自身的加权,所以GCN中的邻接矩阵实际上等于 A+单位对角矩阵 I 。对度矩阵的行和列进行了归一化,同时,归一化的系数还开了根号,就是因为考虑到归一化后的行和列系数都加权给了节点特征,均衡一点。

·Attention机制

在部分GCN中,还会引入注意力机制,根据关联节点的重要性来分配权重,最后乘到邻接矩阵上。传统计算权重的方法有两种,第一种方法,两节点特征向量直接相乘,关联节点都算完后,经过softmax算出权重值。还有第二种方法,就是将本节点和关联节点拼接成一个特征向量后,传入FC中,最后经过softmax算出权重值。

图神经网络DGL数据封装和消息传递机制_图神经网络DGL数据封装和消息传递机制_09


图神经网络DGL数据封装和消息传递机制_python_10


·训练参数 w 的加权

进行完聚合操作后,新的节点特征向量再乘上 w。

·层数的迭代

重复step1~3,每重复一次算一层,GCN正常只需要3–5层即可。

②GCN代码分析

使用的数据集合是Cora数据集,cora.content:包含每一篇论文各自独立的信息,共2078行,每一行代由论文编号、论文词向量和论文的类别三个部分组成;cora.cites:包含各论文之间的相互引用记录,共5429行,每一行是两篇论文的编号,表示右边的引用左边的论文。

图神经网络DGL数据封装和消息传递机制_图神经网络DGL数据封装和消息传递机制_11


layers中主要定义了图数据实现卷积操作的层,类似于CNN中的卷积层。其中前向传播,通常采用的是A∗X∗W的计算方法。于A

是一个sparse变量,因此其与X进行卷积的结果也是稀疏矩阵。

图神经网络DGL数据封装和消息传递机制_机器学习_12


class GCN(nn.Module)定义了一个图卷积神经网络,其结构如下:

卷积层1:输入的特征为nfeat,维度是2708,输出的特征为nhid,维度是16;卷积层2:输入的特征为nhid,维度是16,输出的特征为nclass,维度是7(即类别的结果);forward是向前传播函数,最终得到网络向前传播的方式为:relu–>fropout–>gc2–>softmax。

图神经网络DGL数据封装和消息传递机制_神经网络_13