文章目录
- 一、图神经网络应用领域分析
- 二、图基本模块定义
- 三、邻接矩阵的定义
- 四、GNN中常见任务
- 五、消息传递计算方法
- 六、多层GCN的作用
- 七、GCN基本模型概述
- 八、图卷积的基本计算方法
- 九、邻接的矩阵的变换
- 十、GCN变换原理解读
本笔记参考自b站up主小巴只爱学习的图神经网络教程
原教学视频链接
一、图神经网络应用领域分析
首先是我们的芯片领域,芯片中很多小单元是连通在一起的,如果直接人为设计难度会很大。但由于都是连在一起的,如果放在图神经网络中进行解决,技术水平收益就比较高。
还有就是推理分析的一些场景,无论我们的数据是图像数据还是文本数据,或者是结构化数据。我们的一些特征之间并不一定是完全独立的,特征之间可能会有关系。
举个例子,我们坐一圈玩剧本杀,我们在考虑特征的时候除了自己的特征肯定还要考虑其他人的特征,考虑其他人的特征能不能和我连上一条边,也就是谁和我有关系,然后根据情况去重构我们所需的特征。
目前应用最多的就是推荐系统了,我们在玩抖音的时候看到一些自己喜欢的人,那推荐系统就会根据这个人的一些特征,还有这个人他自己的关系网络给我们推荐类似的东西。这个本质还是一个图结构,我们的点和点之间会存在一定的关系。
二、图基本模块定义
vertex:也就是图中的各个点,比如我们交通网络中可以把十字路口看成一个点
edge:就是图中的边,点和点之间如果有边,就说明这两个点是有关系的。有时边也会有相关的特征,比如一个点到另一个点的距离。
global:全局的图,它其实也可以看成一个向量,因为目前我们的神经网络中,要计算某个东西是什么,那肯定要有各个特征(各个向量)组成来判断。
我们神经网络最核心的就是要整合特征。比如我们要预测一个人喜欢什么,我们不仅要考虑这个人,还要考虑他的朋友喜欢什么。因为在图上,这些点连在一起,我们的点特征会做一个重构,边特征还有图特征都需要重构。我们把点、边的特征做成最好的,后面整个图的特征自然就会是最好的。
后面要输出一些结果,我们最终的结果其实就是对点做分类回归,对边做分类回归,对图做分类回归。
三、邻接矩阵的定义
这个邻接矩阵主要是表示某个点和其他点是否具有关系。
在做实际案例的时候,邻接矩阵会作为我们的输入一并传过去。比如GNN模型传一个点特征,还有点和其他点的关系。
四、GNN中常见任务
图神经网络的输入格式并不一定是固定的,也就是说不同的数据结构也可能是完全不同的。
比如我们输入100个图,每个数据是一个图,尽管这100个图并不一样,但是只要能做成图的结构,就可以进行计算。
再比如我们生活中的社交网络,由于每个人的社交范围不一样,并且同一个人的社交关系也并不一定是一成不变的,那就可以套用GNN去处理。
五、消息传递计算方法
实际应用中由于邻接矩阵是n*n的,如果数据量比较大,那么矩阵也会非常大。并且由于邻接矩阵很多点到其他点是没有关系的,这种无用数据就可以省略掉。
所以实际存的是2*n的矩阵,我们只存一些有关系的点,比如[1,0]表示1号可以到0号点。
比如1号点连了3个点,2号点连了1个点,3号点连了1个点。它们连接方式是不同的,如果我们需要重构每个点的特征,由于每个点特征更新不仅需要考虑自己的特征还有其他相邻点特征。
我们假设点1、2、6、4特征分别为x1、x2、x6、x4。如果现在要更新点1特征,那我们新的特征x1可以写成下图形式。(不一定百分百是这个形式,只是举个例子)
小结:点的更新不仅要考虑自身的信息,还要考虑到相邻节点的信息。
具体做法如下:
比如我们的6号节点,现在要重构6号节点的特征,那我们可以通过计算x1,x3,x4的各个特征,根据权重进行一个累和。
而这个权重具体是多少,这里是设置了一个可学习的权重参数,我们训练神经网络时就可以得到一个比较好的参数了。
汇总这一块,蓝色框标志的就是某个点它的其他连接点应该给我啥样的特征。w1*hi就表示字节的特征。然后把这两个结果和进行一个投影。
六、多层GCN的作用
比如做两层GNN,从左到右,依次是原始输入,处理1层结果,处理2层结果。
可以看出,无论经过多少层处理,图结构都不会发生改变(邻接矩阵也不会变),只会改变各个点的特征。
尽管做多层GNN每次都考虑相邻的节点,但是主要的原因是相邻的节点是可能不断更新的。
我们通过多层GNN得到点的特征了,然后就要对每个点做分类,最后再把每个点再合成一个图,就可以做图分类。节点、边也都是可以分类的,具体看工业需要。
七、GCN基本模型概述
GCN也就是图卷积
如下图,是我们的一个卷积,它是把我们输入的一张图像的一个小窗口做成一个特征。
而图卷积和卷积就不一样了,因为在图卷积中完全就没有窗口,它只有图(只有图中的每个点)。所以这里图卷积也没有啥卷积的计算,主要还是基于那种消息传递的计算。
由于每个点,它的相邻节点的个数是不一定一致的,所以输入也不要求是相同格式。
对于每个点怎么获得具体特征?直接把图交给神经网络,用损失函数去迭代更新即可。
然后交给GCN的就是两个:各个节点特征,还有就是邻接矩阵。
在图任务中,由于各个节点的重要程度不一样,导致有些边缘的点它没有人工打的标签或者记录。当我们在训练模型的时候,我们也不要求每个点都是有标签的,我们可以当作是半监督的任务。
我们计算损失的时候虽然只用有标签的,但是由于那些有标签的节点特征也会受到相邻节点特征影响,所以也要保证那些有标签的节点的相邻节点也要保证它们的最好特征。
八、图卷积的基本计算方法
上图中每个点都有自己的实际特征。如果现在要更新黄色这个点特征,那么第一步就是消息传递,也可以理解为聚合,即综合它相邻结点的特征。这里具体做法就是把所有点特征拿过来求平均,实际工业中可以根据具体情况调整相邻节点特征所占比例。
而求完平均之后,还需要经过神经网络,相当于加上一组可训练的参数,即下图这样进行一个全连接。
最后我们是得到一个两维向量,原先三维变现在两维,这个向量维度是可以调整的。
我们得到一个图之后,第一个图卷积层会对每一个点进行更新,第二个图卷积层会基于第一个图卷积层的结果进行更新。。。
后面经过图卷积的处理,最后输出的结果就是每个点对应的一共向量。
一般来说,图卷积并不需要做特别深层的。因为一般的图中的点数量不会特别庞大,另外,因为做6层之后理论可以覆盖所有的节点和边,同时所有特征都会趋于自身特征,如果继续往下做就可能过拟合。
GCN中一般会有3个矩阵:邻接矩阵A、度矩阵D、特征矩阵F
A矩阵:就表示某个点和哪些点相连了
D矩阵:表示连上这个点的有几个其他节点
F矩阵:表示某个点的特征值(向量)
如上图有邻接矩阵A和特征矩阵F,现在要求重构完的点A的向量是多少?只需要进行一个简单的矩阵相乘即可。
比如这里重构后的A向量(1.4,2.5,4.5)
0*(-1.1)+00.4+01.2+01.4+11.4=1.4
03.2+05.1+01.3+0(-1.2)+12.5=2.5
04.2+00.4+0(-1.2)+02.5+14.5=4.5
前文的特征计算方法是只考虑了某个点它的相邻节点的特征,没有考虑到它自己的特征。所以一般情况我们还要加一个单位矩阵得到新的邻接矩阵A~。
九、邻接的矩阵的变换
然后还要考虑的一个问题是,有些节点它的度会比较大,如果特征不考虑正负的话,做完矩阵乘法得到新的特征一定会特别大,这和实际情况是不符合的。所以我们还需要把度矩阵考虑进去,进行一个求平均的操作。
将得新的度矩阵D~进行一个求倒数得到D~-1,也就是求平均,进行一个归一化的操作。
正常情况我们是邻接矩阵右乘特征矩阵,再左乘一个度矩阵,如下图
而根据矩阵乘法结合律,我们可以先让度矩阵和邻接矩阵相乘,再右乘特征矩阵
这样就相当于我们的度矩阵对邻接矩阵进行一个scale变换,也就是类似归一化处理。
但是这里还有一个问题,度矩阵左乘邻接矩阵,相当于是对邻接矩阵的行做归一化。
ps:矩阵A,矩阵B。AB相当于A对B做行变换,BA相当于A对B做列变换
所以,为了考虑周全,我们除了对行做归一化处理,还需要对列做归一化处理。
综上,我们会形成一个新的邻接矩阵,分别用度矩阵对它的行和列做归一化处理,最后再乘特征矩阵。
这里还有一个问题,因为我们分别做了行和列的归一化,就相当于对邻接矩阵的每一个值都归一化了两次。这就会导致数据被弄小了。
所以对于度矩阵我们还要将它进行开根处理,如下图:
这里可能会有疑问:为什么GCN中非要左乘右乘还要对度矩阵开根。。。
十、GCN变换原理解读
举一个通俗的例子:
图中的关系网络中,绿色框连接很多其他节点,也就是该节点度比较大。红色框就是连接了绿色,也就是只有一个度。
那如果我们要预测红色框的属性,如果你只考虑度的话,那就肯定大比例是绿色框的特征。但是绿色框又连接了其他很多的节点。说明绿色框是和大部分节点是有相同特征,难道仅仅因为红色框和绿色框相连,就说明红框有绿框所有特征吗?显然这是考虑不周全的。
所以,一个节点与其他节点相连,并不意味着该节点拥有其他节点的所有特征
我们还需要考虑到其他节点的邻接矩阵的权重。
考虑到其他节点度权重之后,如果其他相邻节点的度非常大,那么这个相邻节点对我们指定节点的影响权重就会减小。
整体公式如上图,首先是获得更新过的邻接矩阵(要基于度进行更新)
然后邻接矩阵和特征矩阵相乘,重新组合特征。然后做一个映射,乘W(0)。
然后乘一个ReLU,第一层就完事了。
第二层还是用邻接矩阵去做,再乘一个第二层的可学习参数W(1)。如果后续要做多分类,连一个softmax即可。