backgroud:图网络数据普遍存在,要解决的问题是将原始的网络结构映射到低维向量空间,并保持相似性,进而可以用到各种机器学习算法中。
network embedding产出方法大致可以分为两类:浅层、深层网络
浅层网络:deepwalk 基于同线性越多,欧式空间表示越像的想法,解决思路是MF矩阵分解,重点在于similarity function构建,不足是网络节点增加需要重新训练网络学的embedding向量。
深层网络:deeplearn 基于CNN卷积核提取特征的想法,困难在于语音、图片数据具有平移不变性,图数据没有,目前大致有两大类方法:Spectral based GCN (谱方法),Spatial based GCN (空间方法)。
1、GCN(Graph Convolutional Network)
GCN定义:
2、GCN SGAE
GCN的缺点:Transductive learning的方式,需要把所有节点都参与训练才能得到node embedding,无法快速得到新node的embedding。
得到新节点的表示的难处:要想得到新节点的表示,需要让新的graph或者subgraph去和已经优化好的node embedding去“对齐”。然而每个节点的表示都是受到其他节点的影响,因此添加一个节点,意味着许许多多与之相关的节点的表示都应该调整。这会带来极大的计算开销,即使增加几个节点,也要完全重新训练所有的节点。
因此我们需要换一种思路:既然新增的节点,一定会改变原有节点的表示,那么我们干嘛一定要得到每个节点的一个固定的表示呢?我们何不直接学习一种节点的表示方法。这样不管graph怎么改变,都可以很容易地得到新的表示。
基本思想:去学习一个节点的信息是怎么通过其邻居节点的特征聚合而来的。学习到了这样的“聚合函数”,而我们本身就已知各个节点的特征和邻居关系,我们就可以很方便地得到一个新节点的表示了。
GCN等transductive的方法,学到的是每个节点的一个唯一确定的embedding;而GraphSAGE方法学到的node embedding,是根据node的邻居关系的变化而变化的,也就是说,即使是旧的node,如果建立了一些新的link,那么其对应的embedding也会变化,而且也很方便地学到。
大致的思路是:假设我们要聚合K次,则需要有K个聚合函数(aggregator),可以认为是N层。每一次聚合,都是把上一层得到的各个node的特征聚合一次,在假设该node自己在上一层的特征,得到该层的特征。如此反复聚合K次,得到该node最后的特征。最下面一层的node特征就是输入的node features。
前面一直都没讨论一个点,那就是如何选择一个节点的邻居以及多远的邻居。这里作者的做法是设置一个定值,每次选择邻居的时候就是从周围的直接邻居(一阶邻居)中均匀地采样固定个数个邻居。
3、GCN ATTENTION
为何要GAT
因为GCN是无法解决动态的图,而且GCN给每个邻居节点都分配相同的权值,但每个邻居节点的重要性都是相同的,得出了GAT要解决的两个问题,首先是如何确定每个节点对其不同邻居的权重,然后是如何将处理好的邻居特征与自身特征结合在一起。
(1)权重的确定
(2)特征的结合
参考文献:
1、深度学习新星 | 图卷积神经网络(GCN)有多强大?
https://zhuanlan.zhihu.com/p/37894842
2、GraphSAGE:我寻思GCN也没我厉害!
https://blog.csdn.net/dQCFKyQDXYm3F8rB0/article/details/98540692
3、图卷积网络之GAT(Graph Attention Networks)