目录
图(Graph)是一种数据结构,能够很自然地建模现实场景中一组实体之间的复杂关系。在真实世界中,很多数据往往以图的形式出现, 例如社交网络、电商购物、蛋白质相互作用关系等。因此,近些年来使用智能化方式来建模分析图结构的研究越来越受到关注, 其中基于深度学习的图建模方法的图神经网络(Graph Neural Network, GNN), 因其出色的性能已广泛应用于社会科学、自然科学等多个领域。
图神经网络(GNN)
图的基本组成
图神经网络要做什么
无论事整的多么复杂,我们利用图神经网络的目的就是整合特征
我们通过节点与节点之间地邻接关系找到最好的节点特征表示和边的特征表示进而找到最好地图的特征表示,自然而然地我们可以重构出节点、边和图地特征表示。
图的邻接矩阵
初识
以图像为例子,每个像素点周围都有邻居,A就表示邻居之间的关系
-
我们可以看到本例共有25个像素点,与像素点(0,0)位置的有关的(或相邻的)像素点分别为(1,0),(0,1)和(1,1);
-
体现在右侧邻接矩阵当中为像素点(0,0)与25个像素点的其中之三(即(1,0),(0,1)和(1,1))有关系,被用蓝色填充;
-
仔细观察右侧邻接矩阵可以发现该邻接矩阵是对称的
另外,文本数据也可以表示图的形式,邻接矩阵表示的连接关系
数学表达式
消息传递神经网络
-
将x1的邻居信息进行聚合,可以当作是一个全连接神经网络
-
通过聚合得到的每个邻居节点的信息来更新x1的特征表示,当然这里的更新方法有很多种,可以自己设置,下面是一些常见的更新方法:
-
结合邻居和自身信息:
-
汇总:
多层GNN
-
GNN的本质就是跟新给个部分特征
-
其中输入是特征,输出也是特征,邻接矩阵也不会变
根据该图我们可以发现,
-
变化的是:没经过一层GNN我们的节点特征表示都会结合自身和邻居信息来更新特征表示;
-
不变的是:邻接矩阵;
-
随着GNN的层数变多,感受野也变大了。在第一层GNN时,x1聚合邻居x2自身的信息,而在第二层GNN,由于x2在第一层GNN也聚合了其邻居信息(假设x3和x4),那么x1在第二次聚合邻居x2的信息时,也聚合了x3和x4的信息。
输出的特征可以用来做什么
- 各个点特征组合,可以图分类
- 各个节点也可以分类:
- 边也是如此
- 其实只是利用图结构得到特征,最终要做什么还是我们自己定
图卷积神经网络(GCN)
基本模型概述
首先,图卷积与卷积有啥不同?看起来好像都是在利用周围的特征,但是CNN是有感受野,有卷积核的,但是,在图中每个点的邻居是不确定的。如没有过城市的交通流量是不同的,不同的蛋白质或者化合物的化学结构也是不同的,进而它们的图结构也是不一样的!我们的GCN能够解决这种结构不同的数据,进行特征提取。
-
如何获取特征呢?通常交给GCN两个东西就行
- 各个节点输入特征(特征矩阵X)
- 网络结构图(邻接矩阵A)
-
半监督学习 (我们的拿到的数据不一定全部都有标签)
- 这也是GCN优势
- 不需要全部标签
- 用少量标签也能训练
- 计算损失时只用有标签的
当然,这里我们希望数据集打的标签越多越好啦_
基本计算方法
GCN的基本思想
针对橙色节点,计算它的特征:平均其邻居特征(包括自身)后传入神经网络
网络层数
这个跟CNN一样,GCN也可以做多层,第一层的输入是节点的特征(X)和邻接矩阵(A);之后的每一层都是将当前特征(X_l)和网络结构图(A)当作输入传入下一层就可以不断地计算下去……
这里有一个小问题,GCN地层数是越多要好吗?
图的基本组成
-
G也就是咱们的图
-
A是邻接矩阵 ,体现每个节点和谁有关系
-
D是各个节点的度 ,体现每个节点关系边的数量
-
X是每个节点的特征
特征值计算方法
-
其实就是将邻接矩阵与特征矩阵进行乘法操作,表示聚合邻居信息
-
数学公式为: A*X
-
一个实例:
-
一个小问题:观察邻接矩阵A,他的对角线元素都为0,这说明在聚合邻居信息时,只考虑到了周围邻居的信息但是没有考虑到自身的信息,为了考虑到自身的信息,我们只需要对角线元素都为一;体现在数学公式上为
此时,$\lambda=1$
- 图形化表示:
度矩阵也要变一变
-
其实就是对度矩阵进行D^{-1}操作,这相当于平均的感觉 -- 归一化操作
-
图形化实例:
由于我们是左乘D{-1},相当于对行作归一化。为了对列做归一化操作,我们需要右乘D。但是,我们对行做一次归一化,对列做了一次归一化,总共做了两次归一化,这么做的后果是结果在数值上会更小,为了解决这个问题,我们总共只做一次归一化即可,即左乘D{-(1/2)},右乘D。
-
度矩阵的变化情况如下:
给出GCN的数学表达式
图注意力网络(GAT)
引入
GAT和上面的GNN和GCN一样都是聚合邻居和自身的特征信息来更新节点的特征值,而上面的邻居聚合方式是通过邻接矩阵与特征矩阵进行的,如下图所示;我们可以看到节点E的更新过程为与节点 E 相关的节点特征信息的重要程度都是相同的,这样做的话是否与实际相悖。为了区分不同邻居节点对目标节点(节点e)的重要性,我们引入了图注意力网络。
首先我们先引入数学公式来感受一下目标节点特征向量(h_i)是如何更新的:
计算注意力系数(attention coefficient)
对于目标节点i,逐个计算它的邻居们( j∈N(i) )和它自己之间的相似系数
我们先来解读一下公式:首先一个共享参数 W 的线性映射对于顶点的特征进行了增维,当然这是一种常见的特征增强(feature augment)方法,||表示目标节点i和邻居节点j的增强后的特征向量h_i和h_j进行拼接操作,最后是a表示把拼接后的高维特征向量映射为一个实数。这么做的好处是该注意力系数能够学习得到目标节点i和邻居节点j的特征信息,通过特征增强方法——全连接神经网络和a(.)来实现的。
接下来我们通过softmax进行归一化操作,进一步拉开不同邻居节点对目标节点的重要程度。
加权求和(aggregate)
完成第一步,已经成功一大半了。第二步很简单,根据计算好的注意力系数,把特征加权求和(aggregate)一下
h'_i就是GAT输出的对于每个顶点 i 的新特征(融合了邻域信息), σ(⋅) 是激活函数。这样就和引入当中的图进行了呼应。看着还有点单薄,俗话说一个篱笆三个桩,attention得靠multi-head帮!来进化增强一下!也就是我们下面要说的多头图注意力机制
上面的步骤可以参考下面的图进行理解
- 简单的说一下,该图的多头GAT是如何体现的 —— 不同颜色的波纹线
下期跟新图像领域OpenCV的一些基础操作,至于本期更新代码实例我也会不定期的放在我的Gitee账号上面,欢迎大家来看!!!
标签:特征,邻接矩阵,GCN,神经网络,邻居,节点 From: https://www.cnblogs.com/DLChen/p/18630388