理解GNN的训练过程
GNN的“模拟卷积核”在每个节点做的事情就是按照连接关系对每个节点进行聚合:
n e w _ n o d e _ e m b e d d i n g = α ∗ o l d _ n o d e _ e m b e d d i n g + β ∗ f ( a r o u n d _ n o d e s _ e m b e d d i n g s ) new_node_embedding = \alphaold_node_embedding +\betaf(around_nodes_embeddings)new_node_embedding=α∗old_node_embedding+β∗f(around_nodes_embeddings)
其中f ff可以看作是对其周围所有节点的一种操作方式,α , β \alpha, \betaα,β以及f ff内部对应的参数都可以成为训练的对象。
这就是GNN做的事情。
import numpy as np
# 这个图是一个有向无环图(DAG)
# -1 代表什么也不连
# 图用二维列表,第一行代表节点编号,第二行为对应节点的指向节点
graph = [
[0,0,1,2,3],
[1,2,3,3,4]
]
# 定义5个节点的初始特征值
embeddings = [
[1,2,3],
[2,6,5],
[2,3,7],
[7,8,6],
[1,0,0]
]
# 定义聚合的权重w全为1
w = [1,1,1,1,1]
# 下面开始图神经网络的聚合过程(训练过程)
# 在这里每个节点只按照方向聚合一层
for i in range(len(graph[0])): # 每个节点
# 先寻找指向节点i的节点们
temp_roots = []
for j, eve in enumerate(graph[1]):