PyTorch图神经网络(二)

PyTorch图神经网络(二)

1.Node2Vec

​ Node2Vec在DeepWalk的基础上,对随机游走本身的生成方式进行了改进。这里的思想是参考了图遍历的两种方法:BFS和DFS,具体做法为:使每次随机游走偏向以下任一方案:

​ 1.游走到与前一个节点未连接的节点(类似于DFS)

​ 2.游走到与前一个节点接近的节点(类似于BFS)

​ 在具体代码中是通过搜索偏差ɑ(a,b)实现的:

\[\alpha(a,b) = \left\{ \begin{array}{l} 1/p,d(a,b)=0 \\ 1 ,d(a,b)=1\\ 1/q,d(a,b)=2 \end{array} \right. \]

​ 我们可以自己设定p和q的值来决定模型的偏好。我们可以设定不同的p和q组合来看看最终的结果。

​ 在实际分类过程中,我们可以把随机游走的序列放到Word2Vec模型中,生成每个节点的向量,然后根据随机森林等分类算法对节点进行分类。

2.普通图神经网络

​ 这里讲的普通图神经网络与前面的DeepWalk或者Node2Vec不同,上面这两种方法只考虑了图的结构(也就是相邻关系),但是如果节点有自己的特征,就不能仅仅依靠随机游走和Word2Vec来定义每个节点的对应特征向量了。

​ 因此,对于有特征节点的分类,我们可以结合邻接矩阵和每个点的特征,这里,我们可以把普通的图神经网络与普通神经网络进行对比。

​ 对于普通的神经网络,在做分类的时候,我们可以利用Linear层把特征维度投影到分类类别的维度(中间会加上中间层),公式为:

\[h=xW^T \]

​ 这个网络的问题就是,我们在训练的时候是把每个特征的数据单独放入网络中,依次更新网络参数,这样就忽略了数据与数据之间的关系,而把每个数据点都看成一个孤立的个体。

​ 因此,图神经网络的线性层解决了这个问题,他把公式修改成:

\[H=A^TXW^T \]

​ 在这里,A是邻接矩阵+单位矩阵(因为要考虑自己)。需要注意的的是,这里的x和h都换成了大写,意思就是图神经网络在训练的时候,输入的是一个包含所有节点信息(特征)的矩阵,而不仅仅只是一个节点的信息。根据我们之前提出的网络同质性假设, 彼此接近的节点总是相似的,所以这里乘上A的作用实际上是筛选和这个节点相关的节点以及对应的信息。

​ 这样,我们就把数据点之间的关系根据邻接矩阵联系在一起了,模型更新的时候,不仅仅会考虑当前的数据点,也会考虑和当前数据点相邻的点。

​ 这里需要知道的是:邻接矩阵的n次方就是当前节点走n个边能够到达的节点。所以,一个GNN的线性层可以考虑与该点距离为1的点,多个GNN线性层的叠加,就可以考虑距离更远的点,使得图神经网络可以分析更加复杂的图。

注意:在实际应用中,并不是GNN线性层的层数越多越好,比如书上用Cora数据集做的例子,当你把层数增加到4-5层之后,分类的准确率反而会下降。合适的层数需要根据具体的图的性质来决定。

3.图卷积网络

​ 上面的线性层有一个很严重的问题,就是在乘上邻接矩阵的时候没有考虑邻居的数量,这样就可能导致邻居数量不同的点,计算出来的值会有较大差异。(这可能是单纯用上面的网络做Cora分类准确率较低的原因)

​ 因此,我们在乘上邻接矩阵的时候,要根据节点的度来对数值进行归一化,这里引入矩阵D,只有对角线的数值为每个节点度的倒数,其他部分数值都为0,并将图线性层的公式改写为:

\[H=D^{1/2}A^TD^{1/2}XW^T \]

​ 这里把D拆成两个放在矩阵A的左右是为了对行和列分别进行归一化,所以要开根号放在邻接矩阵的左右。

​ 用图卷积网络再训练上面的Cora数据集,训练过程就会稳定很多,并且增大层数的时候也不会让准确率明显下降。

posted @ 2025-09-22 17:08  爱露查  阅读(15)  评论(0)    收藏  举报