代码: http://snap.stanford.edu/graphsage/
文章解决的是GNN的存在的不能很好地进行归纳学习的问题,大多数只是进行的直推学习,所以文章不是只对每个节点进行单独学习,而是考虑的局部节点的邻域信息。
进行K次汇集,每次汇集使用不同的信息汇集参数和节点更新函数,共k个aggregate,以及K组要调的参数 W 1 , W 2 , . . . W K W^1,W^2,...W^K W1,W2,...WK。整个过程如下面所示,第一个循环为聚集K轮,第二个循环为对每个节点信息信息更新 第一跳选3个,第二跳5个
使用随机梯度下降,对K组参数进行更新 基于图的损失函数鼓励附近的节点有相似的表示,同时迫使不同节点(也就是正负样本)的表示不同: 其中v是在定长随机游走中同时出现在u附近的节点, P n P_n Pn是一个负采样分布,Q定义了负样本的数量。
这里为了减少计算量,只随机采样固定数量的邻接点,而不是使用当前节点的所有邻域。而且对于每一次传播 k ( 0 < k < K ) k(0<k<K) k(0<k<K),都是随机取样的。
为了使得结果与节点排列的顺序无关,这里提出了4种的聚集函数
也就是将当前信息和邻居信息一起做个平均,求和是交换,加法交换律
LSTM具有比较强大的序列表达能力,但是其不是跟节点排列无关的,所以这里只是每次聚合的时候对节点顺序进行随机排列。 邻接特征 { x 1 . . . x k } \{x_1...x_k\} {x1...xk}作为LSTM输入。
为了可以训练和对称性(结果与排列无关),我们使用了全连接层对邻接节点特征进行处理,然后通过最大池化产生聚合后的信息表示。 这里还说明了使用max pooling跟mean pooling具有差不多的效果,但是max 更加的高效,所以选择max 作为后面的pooling实验。
K=2 ,也就是跑两轮,两层GNN ,第一层选择25个邻接节点 S 1 = 25 S_1=25 S1=25,第二层选择10个连接节点 S 2 = 10 S_2=10 S2=10