GCN学习历程
一、GCN 说明
假设一张图中有N个节点(node),每个节点都有自己的特征,我们设这些节点的特征组成一个N×D维的矩阵X,然后各个节点之间的关系也会形成一个N×N维的矩阵A,也称为邻接矩阵(adjacency matrix)。
X和A便是我们模型的输入。
GCN也是一个神经网络层,它的层与层之间的传播方式是:
这个公式中:
- A波浪=A+I,I是单位矩阵
- D波浪是A波浪的度矩阵(degree matrix),可以使用下面公式计算(疑问:如果A的值不是仅表示连接关系的0、1,而是表示边的权重,应该怎么计算D?)
- H是每一层的特征,对于输入层的话,H就是X(即H0=X)
- W为参数矩阵
- σ是非线性激活函数
上图中的GCN输入一个图,通过若干层GCN每个node的特征从X变成了Z,但是,无论中间有多少层,node之间的连接关系,即A,都是共享的。
二、GCN为什么是这样
我们的每一层GCN的输入都是邻接矩阵A和node的特征H,那么我们直接做一个内积,再乘一个参数矩阵W,然后激活一下,就相当于一个简单的神经网络层嘛。参考Kipf的博客
但是此模型存在局限性:
- 只使用A的话,由于A的对角线上都是0,所以在和特征矩阵H相乘的时候,只会计算一个node的所有邻居的特征的加权和,该node自己的特征却被忽略了。因此,我们可以做一个小小的改动,给A加上一个单位矩阵 I ,这样就让对角线元素变成1了。
- A是没有经过归一化的矩阵,这样与特征矩阵相乘会改变特征原本的分布,产生一些不可预测的问题。所以我们对A做一个标准化处理。通过归一化处理,可以将数据变得具有可比性,但又相对保持数据之间的关系。使得原来很难在一张纸上做出的图更方便给出图上的相对位置。首先,给A乘以度矩阵
D − 1 / 2 D^{-1/2} D−1/2,并进一步将其拆为两个 D − 1 / 2 D^{−1/2} D−1/2,得到对称且归一化的矩阵: D − 1 / 2 A D − 1 / 2 D^{−1/2} A D^{−1/2} D−1/2AD−1/2。
通过以上两种方式的改进,就能得到最终的层特征传播公式:
三、关于GCN的一些特点
1.参数矩阵W的选择
即使不训练,完全使用随机初始化的参数W,GCN提取出来的特征就以及十分优秀了。这跟CNN不训练是完全不一样的,后者不训练是根本得不到什么有效特征的。
2.节点特征值
对于很多网络,我们可能没有节点的特征,这个时候可以使用GCN吗?答案是可以的,如论文中作者对那个俱乐部网络,采用的方法就是用单位矩阵 I 替换特征矩阵 X
3.GCN层数
根据作者的论文,GCN层数不宜过多,2~3层即可。
四、学习后的疑问
1.计算D时,如果A的值不是仅表示连接关系的0、1,而是表示边的权重,应该怎么计算D?
一种比较暴力的方法:考虑直接计算度,遍历A的所有元素,如果是0则度不变,不为零则度加一。
2.关于层间特征传播的公式,还没怎么弄明白。比如:为什么要用这个公式?公式推导中 D − 1 A = D − 1 / 2 A D − 1 / 2 D^{−1} A =D^{−1/2} A D^{−1/2} D−1A=D−1/2AD−1/2等式为什么成立?
五、一些比较好的教程
(1)使用GCN的第一篇比较好理解的paper
(2)一般工业界使用GCN的改进版graphSAGE
(3)graphattenion
(4)图深度表示(GNN)的基础和前沿进展 视频讲解
(5)GCN挑战
怎么做大:采样fastgcn,asgcn
怎么做深:原因过拟合,过平滑。dropedge,highway
参考文献:
1.跳出公式,看清全局,图神经网络(GCN)原理详解
2.GCN之邻接矩阵标准化
3.GCN博客
4.Kipf的博客