GraphSAGE
SAmple+aggreGatE:采样与聚合;
之前谈到的GCN是利用节点的邻居信息来聚合它下一层的节点的表示; 这种直推式的方法,只能在一张图上做GCN,如果在一张没有见过的图上,GCN是无法进行的 ;
Graphsage正是采样和聚合,采用归纳式的方法,对于没见过的节点也可以生成embedding;
如下图,我们的输入是:图
G
G
G,节点的特征
X
v
X_v
Xv,层数K,权重矩阵
W
k
W^k
Wk;
h
v
0
=
X
v
h_v^0=X_v
hv0=Xv首先,我遍历K层的Graphsage,在每一层上我遍历所有的节点,我求一下v节点周围的节点信息,我将邻居节点的信息聚合在一起,就可以求v节点在第K层的邻居向量
h
N
(
v
)
k
h_{N(v)}^k
hN(v)k;
这个时候,我再将上一层(K-1)的v节点的特征表示
h
v
k
−
1
h_v^{k-1}
hvk−1和第K层v节点邻居聚合后的特征向量
h
N
(
v
)
k
h_{N(v)}^k
hN(v)k拼在一起,在乘以这个
W
k
W^k
Wk参数,就可以得到v节点在这一层的特征表示
h
v
k
h_v^{k}
hvk;
经过K层graphsage,就可以得到v节点学习到的特征表示;
最重要的就是第4步的聚合和第五步的连接;
举个例子:
首先,聚合3456在第0层的特征
h
3
,
4
,
5
,
6
0
h_{3,4,5,6}^0
h3,4,5,60,求得邻域特征
h
N
(
1
)
1
h_{N(1)}^1
hN(1)1;
之后将
h
1
0
h_{1}^0
h10与
h
N
(
1
)
1
h_{N(1)}^1
hN(1)1拼接在一起;再乘以可学习参数
W
W
W,就得到了1节点在经过了1层graphsage之后的特征表示
h
0
0
h_0^0
h00;
邻居采样:
不对所有邻居进行聚合,采样聚合固定长度的邻居数量,会出现以下两种情况:
①邻居节点比采样节点多,如1与3456,那么在3456中随机选3个即可;
②邻居节点比采样节点少,如2与13,那么在选择完13之后,还需要重新重复选择一下1或者3;
作者表明该模型
K
=
2
K=2
K=2 和
S
1
∗
S
2
≤
500
S_1*S_2\le500
S1∗S2≤500时,效果会比较好;ps:
S
1
,
S
2
S_1,S_2
S1,S2分别是第一层聚合的邻居数量和第二层聚合的邻居数量;
举个例子:
ps:1-4是出度,对1没有影响;
聚合函数:需要满足对称排列不变性
①Mean aggregator:上面提到的都是采用mean
作者提出了mean也可以直接算,不用后面的那步连接操作;
②LSTM aggregator:LSTM本身是由顺序的,通过将输入节点随机排列,使得LSTM也可以适用于无序的集合;(模型容量大,做出来效果好)
③Pooling aggregator:
最后,抽取的便是,0.6,1,0.8,1.2;池化层可以有效的缩小参数矩阵的尺寸,从而减少最后连接层的中的参数数量。所以加入池化层可以加快计算速度和防止过拟合的作用。
GraphSAGE(mini_batch版本)
我们是从第K层开始,通过K-1的节点再去求取K-2层的节点,通过这样我们就求得了最终我要计算的minibeatch所需的所有的节点,那么我就将这个部分节点把它存下来就可以,然后我将存下来的这些节点,我再通过一个graphsage的操作,那么我就学习到了每个节点的特征。
举个例子:
这个例子由两层GraphSAGE组成,第一层聚合两个邻居,第二层聚合三个邻居;
首先是B2层是我们的最终层,我们要求目标节点a;然后看倒数第一层B1,它要聚合的是我们a节点周围的节点,采样3个邻居节点C,F,J;然后看一下倒数第二层B0,我需要选择聚合C,F,J 的k,l,i,h,d,e这六个节点。
将一整个大图简化为只需要,三种颜色的这种小图;
Graph_embedding:
作者说这两个节点比较相近得,这两个节点得表征是比较相似的;
通过损失函数,训练GraphSAGE的权重函数W,这种方法学习的不是节点的embedding,而是学习了W,当我学习完这个W,我就可以推出一个节点的embedding。