GNN(Graph Neural Network)
概念
图神经网络是一类专门设计用于处理图结构数据的神经网络。目标是学习图中节点或边的表示
(representations),这些表示能够捕捉图中的拓扑结构以及节点或边的属性信息。这些学习到的表示可以进一步用于各种图相关的任务
,如节点分类、图分类、链接预测、推荐系统等。
基本思想
通过迭代地聚合邻居节点的信息来更新节点的表示
。简单来说就是我不仅要学习结点本身的特征,我周围的结点跟我有关系,所以我可以适当的学习一点他们的特征,然后与我自己的特征进行聚合得到最终的特征来训练模型。举例来说,我只有三个朋友,而且他们都很有钱,故可以猜测我也很有钱。
聚合
聚合就是通过下面提出的式子为每一个结点计算他们的信息,这个计算利用了他的邻居们的信息和自己的信息
。也就是说利用了所有相关的信息,把他们通过某种方式计算出一个最终的属于自己的信息。
图1
这是一种简单的写法,其中
- N N N:为邻居们的信息
- a 、 b 、 c a、b、c a、b、c:是邻居们的权重,可以让模型自己学习
- α α α:是一个超参数,可以用attention(我现在还没学过attention)
- W W W:是结点本身的信息的权重
- σ σ σ:是激活函数
当然了,也有很多其他的方式来利用邻居的信息,如下图,可以是汇总(也就上面这种),也可以是求和、取平均、最大值、最小值等。
图2
更新
更新就是在我们上面提到的,将每个结点聚合完成后的值替换原来的值
,此为更新,这个新的值包含更多的信息(他的所有邻居的信息)
循环
循环,就是在第一轮(即所有的结点都聚合更新一遍)聚合、更新完成之后,继续下一轮的聚合更新
,依次类推,一直循环到我们规定的轮数后为止。
为什么要这样呢?这样不是重复了吗?其实不是的,因为你经过第一轮聚合更新之后,每个结点的值已经不是只包含自己的信息了,他们都会包含自己的一阶邻居(就是与该结点直接相连的结点)的信息,然后再次进行聚合之后,每个结点的值就包含了二阶邻居的信息了,循环到次数越多,包含的更多的邻居。以图1为例,第一轮聚合更新后,A中包含了B、C、D的信息,同时C中包含了A、B、D、E的信息,如果进行第二轮,则A再次与B、C、D进行聚合,而此时C中已经包含了E中的信息,那是不是就代表着A中也聚合了E的信息,E是A的二阶邻居。
GCN(Graph Convolutional Network)
基本概念
通过卷积操作来聚合邻居节点的信息。
- CNN 的卷积核是一个在图像上滑动的固定大小的窗口,用于计算窗口内像素的加权和。
- GCN 的卷积操作更加复杂,通常
通过聚合邻居节点的特征来更新节点的特征表示
,这可以看作是一种在图上的“卷积”。GCN的卷积核通常不是传统意义上的滑动窗口,而是基于节点间关系的聚合函数。
基本原理
以下图为例看看GCN究竟是如何计算的
特征计算的方法其实就让邻接矩阵与特征矩阵进行乘法运算,表示聚合邻居信息
但是这样这是聚合了邻居的信息,我们还得考虑自己的信息,所以在邻接矩阵的主对角线都从0换为1,表示自己与自己有关系,这样进行矩阵乘法的时候就会将自己的特征一起计算进去
因为每个结点的邻居数量可能不一样,所以我们可以做一个类似于归一化的操作,就是将度矩阵取个倒数
这样我的公式就编程下图红色框内的样子,不过可以发现,这样只对最终的特征矩阵的每一行取了平均,对列还是没有作用,所以还需要改进
改进后的公式如下图的红框,即在新的邻接矩阵
左边和右边都乘以度的矩阵的逆
,左乘相当于对行做了平均,右乘相当于对列做了平均,但是这样又有个问题,就是好像做了两次平均,有点过了,还得改进
改进后的公式就是下图蓝色框内的,相当于在新的邻接矩阵
左边和右边都乘以度的矩阵的-1/2次方
,需要注意的是左右两边乘以的不是同一个矩阵
如下图,A的度为1,只与B有关,而B的度很大,于很多结点关联,如果不进行取平均的操作的话,B会对A产生很大的影响。例如你是一个贫民,而你只认识一个非常有钱的人,那么就能推断出你也很有钱吗?显然是不可以的。
基本公式
一般来说GCN的层数不会太多,两到三层最常见
。举例来说,你老婆的情绪会影响到你的情绪,然后你老婆的哥哥的情绪可能会影响到你的情绪,那么你老婆的哥哥的朋友的情绪会对你有什么影响吗?也就是说,层数多了可能学到的特征没什么用
以两层为例