图神经网络
本文基于b站 【图神经网络】GNN从入门到精通的基础上进一步添加内容进行介绍
本文将用4个PPT总结图神经网络中的基本思想与算法
在之前的文章中我们简单介绍了图神经网络GNN与Graph embedding
接下来我们来介绍三个算法GCN、GraphASGE、GAT
代码已上传在:https://download.csdn.net/download/lulu_Tang/71519821
简介
GNN模型主要研究图节点的表示(Graph Embedding),图边结构预测任务和图的分类问题,后两个任务也是基于Graph Embedding展开的
spectral domain
- 因为CNN无法处理非欧几里得结构的数据,学术上的表述是传统的离散卷积在非欧几里得结构的数据上无法保持平移不变性。通俗来说就是在拓扑图中每个顶点的相邻顶点数目都可能不同,那就没办法用一个同样尺寸的卷积核来进行卷积操作;
- 希望在这样的数据结构(拓扑图)上有效地提取空间特征来进行机器学习
- 广义来讲任何数据在赋范空间内都可以建立拓扑关联,谱聚类就是应用了这样的思想,所以说拓扑连接是一种广义的数据结构,GCN有很大的应用空间。
综上,GCN是要为除CV、NLP之外的任务提供一种处理、研究的模型。
GCN的本质目的就是用来提取拓扑图的空间特征,那么实现这个目标只有graph convolution这一种途径吗?
Learning Convolutional Neural Networks for Graphs
组合拉普拉斯算子
对称归一化拉普拉斯算子
随机游走归一化拉普拉斯算子
算法介绍
GCN
本节中,我们将为本文其余部分将使用的特定的基于图的神经网络模型f(X,a)提供理论动机。我们考虑一个多层图卷积网络(GCN),其层间传播规则如下:
下面我们再从一个具体的例子来推一遍
- A波浪=A+I,I是单位矩阵
- D波浪是A波浪的度矩阵(degree matrix),公式为
- H是每一层的特征,对于输入层的话,H就是X
- σ是非线性激活函数
我们需要计算以下几个矩阵:
如果数据可以构成图,可以考虑下图卷积GCN,将卷积网络用于图数据上能对网络中的节点或者整个图进行分类,能利用节点的属性和节点的label进行训练,但这个算法不适应与规模大的图结构,因为GCN需要输入整个邻接矩阵A和特征矩阵X,这是非常耗内存的。
在看了上面的公式以及训练方法之后,我并没有觉得GCN有多么特别,无非就是一个设计巧妙的公式嘛,也许我不用这么复杂的公式,多加一点训练数据或者把模型做深,也可能达到媲美的效果呢。
但是一直到我读到了论文的附录部分,我才顿时发现:GCN原来这么牛啊!
为啥呢?
因为即使不训练,完全使用随机初始化的参数W,GCN提取出来的特征就以及十分优秀了!这跟CNN不训练是完全不一样的,后者不训练是根本得不到什么有效特征的。
可以发现,在原数据中同类别的node,经过GCN的提取出的embedding,已经在空间上自动聚类了。
而这种聚类结果,可以和DeepWalk、node2vec这种经过复杂训练得到的node embedding的效果媲美了。
所以 我们再来看一下论文中的公式
接着我们可以对GCN的算法做什么样的改进呢
GraphSAGE
Inductive Learning
Deepwalk,LINE, node2vec, SDNE等模型能够高效地得到每个节点的embedding。然而,这些方法无法有效适应动态图中新增节点的特性, 往往需要从头训练或至少局部重训练。
通过对节点的本地邻域中的特征进行采样和聚合(平均/LSTM/pooling聚合)来生成嵌入,而不是为每个节点训练单个嵌入。
聚合器参数和权重变量的学习:有监督情况下,可以使用每个节点的预测label和真实label的交叉熵作为损失函数;无监督情况下,可以假设相邻节点的输出embedding应当尽可能相近,保证相邻节点的embedding的相似度尽量大的情况下,保证不相邻节点的embedding的期望相似度尽可能小。
GraphSage 并没有为每个顶点训练一个 embedding,而是训练了一组聚合函数,这些聚合函数用于从顶点的局部邻域中聚合信息特征。
在测试期间,我们使用训练好的模型的聚合函数来为从未见过的顶点生成 embedding
这里K是网络的层数,也代表着每个顶点能够聚合的邻接点的跳数,如K=2的时候每个顶点可以最多根据其2跳邻接点的信息学习其自身的embedding表示。
在每一层的循环k中,对每个顶点v,首先使用v的邻接点的k-1层的embedding表示 来产生其邻居顶点的第k层聚合表示 ,之后将 和顶点v的第k-1层表示 进行拼接,经过一个非线性变换产生顶点v的第k层embedding表示
单位化
- Mean aggregator 直接产生顶点的向量表示,而不是邻居顶点的向量表示。 mean aggregator将目标顶点和邻居顶点的第k-1层向量拼接起来,然后对向量的每个维度进行求均值的操作,将得到的结果做一次非线性变换产生目标顶点的第k层表示向量。
- Pooling aggregator 先对目标顶点的邻接点表示向量进行一次非线性变换,之后进行一次pooling操作(maxpooling or meanpooling),将得到结果与目标顶点的表示向量拼接,最后再经过一次非线性变换得到目标顶点的第k层表示向量。
- LSTM相比简单的求平均操作具有更强的表达能力,然而由于LSTM函数不是关于输入对称的,所以在使用时需要对顶点的邻居进行一次乱序操作。
我们再次回到开始的例子中
GAT
- 公式(1)对 l 层节点嵌入做了线性变换,W^((l)) 是该变换可训练的参数
- 公式(2)计算了成对节点间的原始注意力分数。它首先拼接了两个节点的 z 嵌入,注意 || 在这里表示拼接;随后对拼接好的嵌入以及一个可学习的权重向量 做点积;最后应用了一个 LeakyReLU 激活函数。这一形式的注意力机制通常被称为加性注意力,区别于 Transformer 里的点积注意力。ReLU是将所有的负值都设为零,保留正值;相反,Leaky ReLU是给所有负值赋予一个非零斜率,即x<0时,y=α·x
- 公式(3)对于一个节点所有入边得到的原始注意力分数应用了一个 softmax 操作,得到了注意力权重。
- 公式(4)形似 GCN 的节点特征更新规则,对所有邻节点的特征做了基于注意力的加权求和。