1、GCN的算法原理
假设有一批图数据,其中有N个节点(node),每个节点都有自己的特征,假设特征一共有D个,我们设这些节点的特征组成一个N×D维的矩阵X,然后各个节点之间的关系也会形成一个N×N维的矩阵A,也称为邻接矩阵(adjacency matrix)。X和A便是我们模型的输入。
GCN算法的步骤简单可总结为:
1、初始化:为每个节点分配初始特征表示。
2、邻居聚合:对于每个节点,将其自身特征与邻居节点的特征进行加权平均或拼接,得到聚合后的特征。
3、特征转换:对聚合后的特征进行线性变换,以充分利用特征之间的关系。
4、非线性激活:应用非线性激活函数,如ReLU,将线性变换后的特征映射到非线性空间。
5、循环迭代:重复进行邻居聚合、特征转换和非线性激活的步骤,直到达到所需的网络层数或收敛条件。对于每个节点,我们在聚类时从它的所有邻居节点处获取其特征信息,当然也包括它自身的特征。
GNN的输入一般是所有节点的起始特征向量和表示节点间连接关系的邻接矩阵。聚合操作和节点特征更新是图神经网络的核心操作。以下图为例,我们首先考虑A节点,聚合操作会将当前节点A的邻居节点信息乘以系数聚合起来加到节点A身上作为A节点信息的补足信息,当作一次节点A的特征更新。对图中的每个节点进行聚合操作,更新所有图节点的特征。通过不断交换邻域信息来更新节点特征,直到达到稳定均衡,此时所有节点的特征向量都包含了其邻居节点的信息,然后我们就能利用这些信息来进行聚类、节点分类、链接预测等等。不同的GNN有不同的聚合函数,可根据任务的不同自由选择,这里举的只是一个很简单的例子,重点是要明白我们需要用到什么信息需要做什么操作,做这些操作的目的是什么。一次图节点聚合操作和权重学习,可以理解为一层神经网络,后面再重复进行聚合、加权,就是多层迭代了。一般GNN只要3~5层就可以学习到足够的信息,所以训练GNN对算力要求很低。注意, GNN 不会更新和改变输入图(Input Graph)的结构和连通性,所以我们可以用与输入图相同的邻接矩阵和相同数量的特征向量来描述 GNN 的输出图(Output Graph),输出的图只是更新了每个节点的特征。
那就来举了例子吧
我们需要理解A矩阵和X矩阵相乘的含义,因为它们的相乘代表了GCN的聚合操作。以下图为例,观察邻接矩阵的第一行,我们看到节点 A 与 E 有一个连接。相乘之后,结果矩阵的第一行是 E 的特征向量。同样,结果矩阵的第二行是 D 和 E 的特征向量之和。通过将A和X相乘,我们可以得到所有邻居向量的和。
但是如果按照这样简单聚合的话就会出现问题
- 我们没有包含节点本身的特征。结果矩阵也应该包含节点本身的特征。
- 我们需要取平均值或者邻居的特征向量的加权平均值,而不是 sum() 函数把这些信息全部加起来。原因是在使用 sum() 函数时,度数高的节点可能会对度数低的节点的更新有很大的影响,而实际上如果一个度数低的节点在特征更新的过程中加入了全部的度数高的节点信息,这是不合理的。此外,神经网络对输入数据的规模很敏感。因此,我们需要对这些向量进行归一化以消除潜在问题。
这两个问题我们这样来解释:我们想通过聚类,估计出一个人的工资水平,