GNN各阶段与BFS算法的联系

GNN各阶段与BFS算法的联系

之前把GNN的各阶段细分为Linear、Message、Aggregate、Update,再加上最开始的Sample阶段,进行了实验。汇报的时候老师提出了「哪个阶段用到了图遍历中BFS算法的思想」这个问题,让我再去确认一下,下次再说一下。和师姐又讨论了一下,大致得出了如下的结论。

图遍历从广义上其实可以理解为中心节点去访问自己邻居的过程,而BFS算法核心的逻辑/流程也就是从一个节点出发,访问其邻居节点并将其加入队列(活节点表)。所以从访问邻居节点(属性)这个角度来看,Sample和Aggregate阶段和「遍历」是有点关系的,其他的阶段都属于计算密集型,关系不大。

首先来看一下Sample阶段。这个阶段所做的操作是从一个节点出发,分别去访问其邻居节点并将其并入采样集当中。这和BFS算法十分相似,如果使用BFS算法的加速思路去改进Sample阶段,应该也会得到不错的加速效果。在Sample阶段进行遍历并构建子图的数据结构,这样也是为了能够让后面Aggregate阶段不再去进行类似这样的遍历操作(比较耗时)。

然后是Aggregate阶段。因为在公式中涉及到了节点的邻居聚合,看上去不可避免的也会用到BFS操作,但其实仔细查看分析源代码,发现并没有这么做。这个阶段主要先是利用源节点索引去构造邻居节点特征矩阵src,然后对特征矩阵src进行scatter归约操作就可以巧妙地实现邻居聚合操作了。可以看到,这个过程虽然也有不规则访问,但是并没有出现BFS算法中的那种过程,(如果需要minibatch)更像是在Sample阶段就把一切准备工作都做好了,Aggregate阶段就直接利用scatter进行加速了。所以,BFS算法的改进对于Aggregate阶段没有影响。

总结:Sample阶段用到了BFS算法的思想,Aggregate阶段和BFS算法几乎没有关系。

猜你喜欢

转载自blog.csdn.net/weixin_41650348/article/details/113702260