图计算任务成功的关键是为节点生成节点表征,本节主要任务如下:
1.首先学习图神经网络生成节点表征的规范-消息传递范式(Message Passing)
2.接着初步分析PyG为我们提供的实现图神经网络的MessagePassing基类。
3.然后以继承MessagePassing基类的GCNConv类为例,学习如何通过继承MessagePassing基类实现一个简单的图神经网络。
4.再接着对MessagePassing基类进行剖析
5.最后我们将学习再继承MessagePassing基类的子类中覆写message(),aggreate(),message_and_aggreate()和update()方法的规范。
参考:1.https://blog.csdn.net/qq_41987033/article/details/103377561(这篇超赞的!!)
2.Datawhale提供的课程链接:https://github.com/datawhalechina/team-learning-nlp/blob/master/GNN
一、消息传递范式介绍
神经网络的生成节点表征的操作称为节点嵌入(Node Embedding),节点表征也可以称为节点嵌入。为了统一表述,在本篇内容中我们规定节点嵌入只代指神经网络生成节点表征的操作。
下图展示了基于消息传递范式的生成节点表征的过程:
如图2所示,节点A是我们的目标节点,节点A的Embedding,是它的邻接节点B、C、D的Embedding传播的结果,而节点B、C、D的Embedding,又是由它们各自的邻接节点Embedding传播的结果。具体步骤如下:
1.B节点的邻接节点(A、C)的信息经过变换后聚合到B节点,接着B节点信息与邻居节点聚合信息一起经过变换得到B节点的新的节点信息。C、D节点的信息也遵循同样的过程被更新。实际上,同样的过程在所有节点都进行了一遍,所有节点的信息都更新了一遍。
2.这样的邻居节点信息传递到中心节点的过程会进行多次。如图2所示,A节点的邻接节点(B,C,D)的已经更新过一次的节点信息经过变换、聚合、再变换得到了A节点第二次更新的节点信息。多次更新后的节点信息就作为节点表征。
二、GCNConv源码解析
PyG提供了MessagePassing基类,它封装了“消息传递”的运行流程。通过继承MessagePassing基类,可以方便地构造消息传递图神经网络,构造一个最简单的消息传递图神经网络类,我们只需定义message()方法、update()方法,以及使用的消息聚合方案(aggr="add"、aggr="mean"或aggr="max")。
如图3向量形式的GCNConv公式,其中,相邻节点的特征首先通过权重矩阵进行转换,然后按端点的度进行归一化处理,最后进行求和。这个公式可以分为以下几个步骤:
a.向邻接矩阵添加自环边
b.线性转换节点特征矩阵
c.计算归一化系数
d.归一化j中的节点特征
e.将相邻节点特征相加("求和"聚合)
GCNConv公式实现中步骤a-c是在消息传递发生之前计算的,步骤d-e可以使用MessagePassing基类处理。该层的实现如下: