Graph Convolutional Networks(GCN)图卷积网络
1.前言
许多问题本质上都是图表,在我们的世界里,我们看到很多数据都是图,比如分子、社交网络和论文引用网络。
2.图上的任务分类
1.节点分类:预测给定节点的类型
2.链接预测:预测两个节点是否链接
3.社区检测:识别密集链接的节点集群
4.网络相似性:两个子网络的相似程度
在图中,我们有节点特征(节点的数据)和图的结构(节点的连接方式)。
对于前者,我们可以轻松从每个节点获取数据,但当涉及结构时,从中提取有用的信息并非易事。例如,如果两个节点彼此靠近,我们是否应该将他们与其他节点区别对待?度数高的节点和度数低的节点怎么样?事实上,每个特定的任务都可能消耗大量的时间和精力来进行特征工程,例如将结构提炼成我们的特征。
所以,面临的问题是 如何将节点特征和结构作为输入,让机器自己找出哪些信息是有用的,那就更好了,从而去掉了人工特征的步骤。
3.图卷积神经网络的过程
GCN是一种卷积神经网络,可以直接处理图形并利用其结构信息。
3.1 图卷积过程及主要思想
GCN的一般思路:对于每个节点,我们从它的所有邻居那里获取特征信息,当然还有它自己的特征。假设我们使用average()函数,我们将对所有的节点执行相同的操作,最后,我们将这些平均值输入神经网络。
具体的过程例子如下图:(包括中心节点都执行了average操作)
在实践中,我们还可以堆叠更深的GCN,层的输出被视为下一层的输入。
3.2 背后的数学原理和直觉感受
图中A是邻接矩阵,D是图的度数矩阵,X是节点的特征信息。
用邻接矩阵A和特征矩阵X相乘,就相当于将邻居节点的特征信息,给提取到特征矩阵,但是很直观的也可以发现,就是虽然提取到了邻居节点的特征信息,但是同样也失去了自身节点的特征信息。
另外一个潜在的问题就是我们得使用加权平均值,而不是sum(),为什么呢?因为使用sum()函数 ,对于度数较多的中心节点,其特征信息就可能值特别大,度数较少的则反之,容易造成梯度消失或者梯度爆炸,此外,由于神经网络似乎对输入数据的规模很敏感,因此需要对这些向量进行归一化。
1、对于节点自身特征信息丢失的问题
λ的值通常取1
更新后的A矩阵:
2、如何缩放/归一化向量?
D是度数矩阵,D的逆矩阵就是对角线元素取倒数。
通过D的逆矩阵和X的成绩,我们就可以实现取所有特征向量的平均值。
右乘D的逆矩阵,实现对应列也缩放
完整的特征信息聚合更新流程:
另一种计算公式,因为行列都进行了归一化,所以取-1/2次,就相当于只归一化了一次。
3.3 GCN流程公式
4、GCN另外的一些问题
1、GCN的层数不应该设置得太大,一般2-3层取到最好的结果。
2、GCN的主要思想:取所有邻居节点的加权平均值,低度节点获得较大的权重,然后,我们将生成特征向量通过神经网络进行训练。
3、该框架目前仅限于无向图 (加权或未加权)。但是,可以通过将原始有向图表示为无向二分图,并使用表示原始图中边的附加节点来处理有向边和边特征。
4、对于多关系的edge我们需要使用R-GCN。
参考链接:
https://ai.plainenglish.io/graph-convolutional-networks-gcn-baf337d5cb6b