graphsage
- 2021 年 6 月 18 日
- AI
其实看懂了gcn之后,graphsage基本上也能看懂,graphsage一直强调自己是归纳式的,gcn是直推式的,其实gcn稍微改动一下就可以变成归纳式的,所以其实硬说gcn是直推式的其实对于应用来说帮助不大。
从代码实现上来看,
gcn有直推嫌疑的地方只有标准化的部分:


这里的标准化需要用到全图信息,也就是公式里:

这两个d的-1/2的部分以及加了self-loop之后的A波浪号的部分,前面提到过,这个公式拆解开来:

(w是linear的权重可以忽略)
就是做这么一个操作,Dii和Djj分别是中心节点i的度(或加权度)和节点j的度(或加权度),Aij是节点i和节点j的edge的权重,无权图中为1,即表示成Aij的形式,即邻接矩阵的第i行第j列,从这个层面上来看,其实标准化处理可以提前做好,当gcn预测新节点的时候,只需要这个新节点本身的度(或加权度)的信息,和它与邻节点的边的权重以及邻节点的本身的度(或加权度)就可以完成上述的标准化过程了,所以从这个角度来说,GCN也可以预测在训练集中没有出现的节点没得问题。。。
所以,其实对比来看,很好理解graphsage的原理:
1、graphsage和gcn都可以inductive;
2、graphsage引入了采样,降低了计算的复杂度,gcn里没有提到采样的操作,

每层的消息传递方式都是复制,聚合都是直接求和(如果有权重则加权求和)包括被聚合的节点自身,这种处理有个问题就是对于超级节点来说,这得算死,比如某个节点有上万个邻居,则一次计算需要复制上万个邻节点的信息,在计算上很难适应大图,所以退而求其次用上了采样,实际应用中,一般取k=2,第一层和第二层的采样节点数量的乘积小于等于500,graphsage中使用的均匀采样的方式进行采样,但是实际上如果存在边权重,按照权重的方式采样更合理,这块儿的采样方法其实很灵活,可以参照node2vec中的带权采样的方式来进行采样或者使用其它采样的方法来采样邻节点,核心目标就是尽可能找到能够符合某种预期的邻节点来帮助在端到端的过程中找到好的“邻居”,另外,graphsage中的邻节点采样的数量是固定,如果某个节点的邻节点不够则重复重采样直到满足设定的采样数量,超过则随机下采样;
3、聚合计算不同:gcn就是直接sum一切,而graphsage做了改进,被聚合的节点本身的features保持不变,仅对邻居节点进行聚合计算,这样的方式感觉更合理,毕竟节点自身的信息往往是节点的特点最直观的反应,相对于邻居来说可能更重要,聚合计算的算子有均值聚合,LSTM聚合,和池化聚合,均值聚合就是简单求平均,LSTM聚合的方式非常有意思,LSTM还可以拿来做无序数据的聚合计算我是没想到,技巧是每个batch都对节点的顺序做shuffle避免学习到错误的顺序信息;池化聚合就是先一个全连接层对所有的邻节点的features做线性变换,然后做最大池化,其实从池化聚合的层面展开,这里的聚合算子的选择可以非常的灵活,因为聚合计算对应的输入数据是sequence类型的,也就是 (batchsize,sequence,features)这样的形式,和时间序列以及自然语言处理中的输入数据的形式是一样的,只不过没有顺序关系,因此这部分的处理的灵活性很高,凡是能够处理这种数据类型的网络结构都可以放进来,只要保证这种网络结构是一个Nv1的形式就可以,就是效果好不好的问题了;对了,还有一个叫gcn的聚合计算:

额,感觉大同小异吧。。
另外每一层也可以使用不同的聚合函数,感谢dgl和torch,让这一切的实现简单多了~~
3、提出了用图神经网络来实现图嵌入,这块儿和word2vec差不多,形式上和做link prediction类似,目标是近邻的节点的embeding相似,则假设节点A和B连接,则A-B构成的node pairs是正样本,经过sage之后得到A的embedding以及B的embedding,两embedding点积,标签为1,A和不与它连接的某个node C 构成付样本node pair,A和C的embedding点积,标签为0,就完事儿了;
4、graphsage的dgl的实现里就没有标准化处理这一项了,这个可以自己显式的在图数据预处理的时候完成。
//github.com/dmlc/dgl/blob/master/python/dgl/nn/pytorch/conv/sageconv.py
没了,下面直接引用《图神经网络—基础与前沿》中的一段话:
graphsage的提出为图神经网络的发展带来了非常积极的意义,归纳式学习的方式让图神经网络更容易被泛化;而邻居采样的方法引领了大规模图学习的潮流。虽然缺乏更加理论性的分析,但是它在实际应用中的易用性和良好的性能得到了广泛的关注,很多大规模图学习的开源代码都是基于graphsage的方法完成的。另外,graphsage提出的邻节点聚合方法和多种不同聚合函数本身也开拓了空域神经网络的思路。它仿照网络嵌入提出了图神经网络无监督学习的训练方法,也算是一个小小的贡献,因此,graphsage和gcn一样,都算是图神经网络中里程碑式的模型,是常被用到的图神经网络之一。