QA派|初识GraphSAGE
图网络中节点的低维embedding,对于各类预测、图分析任务都非常有用;相对于要求一整张图作为输入的GCN,能分批训练的GraphSAGE在工业界似乎更加常用。本文通过问答的形式,来对GraphSAGE有个初步的理解。
QA派,用问答的形式为加深对模型、问题的理解,同时也有助于不断深入。
基本概念
有了GCN为啥还要GraphSAGE?
GCN灵活性差、为新节点产生embedding要求额外的操作,比如“对齐”:
- GCN是 直推式(transductive) 学习,无法直接泛化到新加入(未见过)的节点;
- GraphSAGE是 归纳式(inductive) 学习,可以为新节点输出节点特征。
GCN输出固定:
- GCN输出的是节点唯一确定的embedding;
- GraphSAGE学习的是节点和邻接节点之间的关系,学习到的是一种映射关系,节点的embedding可以随着其邻接节点的变化而变化。
GCN很难应用在超大图上:
- 无论是拉普拉斯计算还是图卷积过程,因为GCN其需要对整张图进行计算,所以计算量会随着节点数的增加而递增。
- GraphSAGE通过采样,能够形成minibatch来进行批训练,能用在超大图上。
GraphSAGE有什么优点?
- 采用归纳学习的方式,学习邻居节点特征关系,得到泛化性更强的embedding;
- 采样技术,降低空间复杂度,便于构建minibatch用于批训练,还让模型具有更好的泛化性;
- 多样的聚合函数,对于不同的数据集/场景可以选用不同的聚合方式,使得模型更加灵活。
GraphSAGE的基本思路是什么?
既然新增的节点,一定会改变原有节点的表示,那么为什么一定要得到每个节点的一个固定的表示呢?何不直接学习一种节点的表示方法呢?
为了回答上面的问题,GraphSAGE的基本思路是:利用一个聚合函数,通过采样和学习聚合节点的局部邻居特征,来为节点产生embedding。
跳数(hops)、搜索深度(search depth)、阶数(order)有啥区别?
我们经常听到一阶邻居、二阶邻居,1-hops、2-hops等等,其实他们都是一个概念,就是该节点和目标节点的路径长度,如果路径长度是1,那就是一阶邻接节点、1-hops node。
搜索深度其实和深度搜索的深度的概念相似,也是用路径长度来衡量。
简单来说,这几个概念某种程度上是等价。
在GraphSAGE中,还有聚合层数\迭代次数,比如说只考虑了一阶邻接节点,那就只有一层聚合(迭代了一次),以此类推。
采样
为什么要采样?
出于对计算效率的考虑,对每个节点采样一定数量的邻接节点作为待聚合信息的节点。
从训练效率考虑:
- 通过采样,可以得到一个固定大小的领域集,可以拼成一个batch,送到GPU中进行批训练。
从复杂度角度考虑:
- 如果没有采样,单个batch的内存使用和预期运行时间是不可预测的;最坏的情况是 O ( ∣ V ∣ ) O(|\mathcal{V}|) O(∣V∣),即所有的节点都是目标节点的邻接节点。
- 而GraphSAGE的每个batch的空间和时间复杂度都是固定的, O ( ∏ i = 1 K S i ) O(\prod^K_{i=1}S_i) O(∏i=1KSi),其中K是指层数,也就是要考虑多少阶的邻接节点, S i S_i Si是在第i层采样的数量。
采样数大于邻接节点数怎么办?
设采样数量为K:
- 若节点邻居数少于K,则采用有放回的抽样方法,直到采样出K个节点。
- 若节点邻居数大于K,则采用无放回的抽样。
当然,若不考虑计算效率,我们完全可以对每个节点利用其所有的邻居节点进行信息聚合,这样是信息无损的。但这么做可能就没法使用批训练了。
采样的邻居节点数应该选取多大?
关于邻居的个数,文中提到 K = 2 a n d S 1 ⋅ S 2 ≤ 500 K = 2~and~S_1⋅S_2 \leq 500 K=2 and S1⋅S2≤500,即两次扩展的邻居数之积小于500,大约每次只需要扩展20来个邻居时获得较高的性能。
实验中也有关于邻居采样数量的对比,如下图,随着邻居抽样数量的递增,边际效益递减,而且计算时间也会增大。
每一跳采样需要一样吗?
不需要,可以分别设置每一跳的采样数量,来进一步缓解因阶数越高涉及到的节点越多的问题。
原文中,一阶采样数是25,二阶采样数是10。这时候二阶的节点总数是250个节点,计算量大大增加。
适合有向边吗?
适合,只需要采样邻居节点时考虑边的方向即可。
采样是随机的吗?
原论文里使用的是uniform sampling,即均匀采样。
同时原文指出,探索非均匀采样是值得探索的方向(比如pinSAGE的重要性采样)。
聚合函数
聚合函数的选取有什么要求?
由于在图中节点的邻居是天然无序的,所以我们希望构造出的聚合函数是对称的(即改变输入的顺序,函数的输出结果不变),同时具有较强的表达能力(比如可以参数学习)。
GraphSAGE论文中提供多少种聚合函数?
原文中提供三种聚合函数:
- 均值聚合
- pooling聚合(max-pooling/mean-pooling)
- LSTM聚合
均值聚合的操作是怎样的?
- 目标节点 v v v 和邻居节点 u , ∀ u ∈ N ( v ) u,\forall{u}\in \mathcal{N}(v) u,∀u∈N(v)
- 把目标节点和邻居节点的特征纵向拼接起来 { h v k − 1 } ∪ { h u k − 1 } \{h^{k-1}_{v}\}\cup\{h^{k-1}_{u}\} { hvk−1}∪