GCN,图卷积神经网络,实际上跟CNN的作用一样,就是一个特征提取器,只不过它的对象是图数据。GCN精妙地设计了一种从图数据中提取特征的方法,从而让我们可以使用这些特征去对图数据进行节点分类、图分类、边预测,还可以顺便得到图的嵌入表示(graph embedding),可见用途广泛。
深度学习一直都是被几大经典模型给统治着,如CNN、RNN等等,它们无论再CV还是NLP领域都取得了优异的效果,那这个GCN是怎么跑出来的?是因为我们发现了很多CNN、RNN无法解决或者效果不好的问题——图结构的数据。
图的结构一般来说是十分不规则的,可以认为是无限维的一种数据,所以它没有平移不变性。每一个节点的周围结构可能都是独一无二的,这种结构的数据,就让传统的CNN、RNN瞬间失效。这里涌现出了很多方法,例如GNN、DeepWalk、node2vec等等,GCN只是其中一种。
这个公式中:
这个公式看上去非常难理解,而且论文中的推导公式也用到了图拉普拉斯算子和切比雪夫多项式,这里我们就当看不见这个公式的推导过程,就好比我们得到了一个公式,可以基于图结构,从原始节点的特征中提取特征信息。
这样,通过若干层GCN,每个node的特征就从X变成了Z,但是无论中间有多少层,node之间的连接关系,即A,都是共享的。如下图所示:
推导比较长,如果想了解整体过程的话可以跳过这个部分~
这里参考了江南綿雨博客内容:
对于传统的GNN,一个图网络需要节点特征矩阵和邻接矩阵的输入,这样才能进行节点的聚合操作。但是GCN中还需要引入一个度矩阵,这个矩阵用来表示一个节点和多少个节点相关联,对于后面的步骤有巨大的作用,如图所示:
Step2:进行特征计算
求得矩阵A , D , X A,D,XA,D,X后,进行特征的计算,来聚合邻居节点的信息。GCN中的聚合方式和传统GNN中的方式有较大差异,这里分解为几个细节点:
① 邻接矩阵的改变
邻接矩阵 A AA 没有考虑自身的加权,所以GCN中的邻接矩阵实际上等于 A AA +单位对角矩阵 I II。
② 度矩阵的改变
首先对度矩阵的行和列进行了归一化(具体格式看下图),为什么这么做呢?行归一化系数代表着节点自身的一个变化程度,关联的节点越少,系数越大,越容易随波主流,更易受别人影响。而列归一化系数,代表关联节点对当前节点的影响程度,关系网越复杂的节点,它对其他节点的作用就越小,比如我认识一个亿万富翁,但富翁认识很多人,我们也就是一面之缘,那么能说因为我和他认识,我就是个百万富翁了嘛,显然有点草率了。通过行和列归一化系数,相互制衡,秒不可言。
同时,归一化的系数还开了根号,就是因为考虑到归一化后的行和列系数都加权给了节点特征,均衡一点。
Step3:训练参数 w ww 的加权
进行完聚合操作后,新的节点特征向量再乘上 w ww,往往会改变一下特征的维度,具体见下图:
接下来重复step1~3,每重复一次算一层,GCN正常只需要3–5层即可,这里就和CNN、RNN很不一样。因为节点每更新一次,感受野就变大一些,如果网络太深,那么每个节点就会受无关节点的影响,效果反而下降。
假如对于一个图分类任务,我们构造一个两层的GCN,激活函数分别采用ReLU和Softmax,则整体的正向传播公式为:
通过整体正向传播公式,我们可以提取节点的特征和位置信息,但并不是所有节点都带有标签信息。
这里针对所有带标签的节点计算交叉熵损失函数:
利用交叉熵损失函数训练优化W权重矩阵,最终就可以训练得到一个node classification的模型了。由于即使只有很少的node有标签也能训练,作者称他们的方法为半监督分类。
实验:使用一个俱乐部会员的关系网络,使用随机初始化的GCN进行特征提取,得到各个node的embedding,然后可视化:
可以发现,在原数据中同类别的node,经过GCN的提取出的embedding,已经在空间上自动聚类了。
而这种聚类结果,可以和DeepWalk、node2vec这种经过复杂训练得到的node embedding的效果媲美了。
说的夸张一点,比赛还没开始,GCN就已经在终点了。看到这里我不禁猛拍大腿打呼:“NB!”
还没训练就已经效果这么好,那给少量的标注信息,GCN的效果就会更加出色。
作者接着给每一类的node,提供仅仅一个标注样本,然后去训练,得到的可视化效果如下:
1、没有节点特征也可以使用GCN,例如论文中的俱乐部网络就用单位矩阵I代替了特征矩阵X
2、不训练的GCN的效果就已经非常优秀了,相比CNN、RNN如果不训练根本得不到什么有效特征
3、即使节点没有任何类别标准或者其他标准,也可以使用GCN,因为通过随机化权重参数也可以将节点的位置信息聚类到一起,做到不训练也有分类的效果。