本文仅限我个人记录学习历程所用,目前是大一在读,刚刚接触AI领域。如有不足和错误欢迎指出
所谓图表示学习就是,我们在研究某些对象的时候,研究对象之前存在一定的图结构。比如人脉可以构成网络,图学习就是对样本节点所形成的网络进行研究。我们需要做的是把一个复杂的(或者也可能是比较简单的)网络用向量表示出来,进行运算和研究(当研究一个样本集时,我们得到的是一个矩阵)
基于图结构的表示是单纯从图的拓扑结构映射到结点的表示向量
也就是只利用邻接矩阵去表示学习
但是基于图特征的表示学习,是结合了拓扑结构与特征信息
总之,经过表示,我们得到的是一个高维空间\(R^D\)中的样本数据集
这个提取向量的过程叫做embedding(嵌入)
embeding到底是什么???
embedding直接翻译意思是嵌入,但是你暂时可以不去理解这个直译,embedding可以是个名词或者动词,当embedding作为名词时,他的意思类似于feature(特征),指的是节点或者边的一些具体的信息,往往用tensor或者vector存储,这种训练后得到的embedding可以用于神经网络的预测、分类等应用了;embedding作为动词时,我觉得意思就是对于点和边来提取它的feature的这么一个动作。然后,embedding我第一次见的时候出现在word2vec中,觉得也是一种理解的角度吧:就是把一个词转变为一个向量表示。那对于图来说,是不是可以理解为:图是一个高维度的数据结构,每个节点存储很多信息,包括他自身节点的信息,节点与节点直接是否有拓扑连接的关系等等一系列信息。那么这种高维信息现在我们想将它用一个向量表示,(用向量表示只是个例子),向量是一维的,那么从高维的图结构变成一维的向量,这种过程我觉得就是所谓的“嵌入”,你可以想象把一个立方体压平成一个薄片,对应高维度图结构信息压成一维度向量
嵌入时,我们希望在图中接近的两个结点,被映射到向量空间时依然接近。那么怎么定义图中的“接近”呢
基于Randomwalk
在结点处走向各个邻结点的概率相等
加入了结点的特征矩阵,这一类的模型常常被叫做图神经网络
CNN(卷积神经网络)在干的事就是一步一步聚合某个点周围的特征(局部感知和权值共享)
GCN中,思路相同,新的特征来自于上一层邻居结点特征的聚合
\(H_{l}=\sigma(D^{-1/2}(A+I)D{-1/2}H^{l-1}W^l)\)
是一个基于空域的算法
特点:固定的采样倍率和不同的聚合方式
(1):对聚合结点的数量自适应:向量的维度不应随邻居结点和总结点个数改变。
(3):显然,在优化过程中,模型的计算要是可导的。
也就是说图的拉普拉斯矩阵可求?
几种聚合方式
MAX的含义是各元素上运用max算子计算
归纳学习:GraphSAGE是一个归纳学习的模型,所谓归纳学习是指可以对训练过程中见不到的数据直接计算而不需要重新对整个图进行学习。
转导学习:与归纳学习对应的是转导学习(TransductiveLearning),它是指所有的数据都可以在训练的时候拿到,学习的过程是在这个固定的图上进行学习,一旦图中的某些节点发生变化,则需要对整个图进行重新训练和学习。
显然相比于转导学习,归纳学习有更大的应用价值
GraphSAGE流程:
不断聚合邻居信息,然后迭代更新,迭代次数增加,每个节点上有全局的信息
GraphSAGE的伪代码:
1-7行对应采样过程,K是聚合的层数(不是采样的顺序,和采样顺序恰好反序,因为采样是从内到外,聚合是从外到内的,因此k的遍历是从K到1)
采样过程其对应的源码在model.py的sample函数,函数的入参layer_infos是由SAGEInfo元祖组成的list,SAGEInfo中的neigh_sampler表示抽样算法,源码中使用的是均匀采样,因为每一层都会选择一组SAGEInfo,因此每一层是可以使用不同的采样器的。num_samples是当前层的采样的邻居数。采样过程的函数sample
defsample(self,inputs,layer_infos,batch_size=None):"""Sampleneighborstobethesupportivefieldsformulti-layerconvolutions.Args:inputs:batchinputsbatch_size:thenumberofinputs(differentforbatchinputsandnegativesamples)."""ifbatch_sizeisNone:batch_size=self.batch_sizesamples=[inputs]#sizeofconvolutionsupportateachlayerpernodesupport_size=1support_sizes=[support_size]forkinrange(len(layer_infos)):t=len(layer_infos)-k-1support_size*=layer_infos[t].num_samplessampler=layer_infos[t].neigh_samplernode=sampler((samples[k],layer_infos[t].num_samples))samples.append(tf.reshape(node,[support_size*batch_size,]))support_sizes.append(support_size)returnsamples,support_sizesSAGEInfo=namedtuple("SAGEInfo",['layer_name',#nameofthelayer(togetfeatureembeddingetc.)'neigh_sampler',#callableneigh_samplerconstructor'num_samples','output_dim'#theoutput(i.e.,hidden)dimension])伪代码8-15是聚合过程
11行是对该结点的邻结点使用聚合函数进行聚合
12行是将这些聚合的邻居特征与中心节点的上一层的特征进行拼接,然后送到一个单层MLP中得到新的特征向量
13行是对特征向量做归一化处理
对应的源码是model.py中的aggregate函数
具体是进行怎样的线性变换呢???
LSTM的具体算法又是什么???
支持无监督训练和有监督训练2种方式
GraphSAGE的无监督学习的理论基于假设:节点\(u\)与其邻居\(v\)具有类似的的embedding,而与没有交集的节点\(v_n\)不相似,损失函数为:
其中\(z_u\)为结点u通过GraphSAGE得到的embedding,v是结点u通过RandomWalk得到的邻居\(v_n~P_n(v)\)表示负采样,Q为样本数
有监督学习比较简单,使用满足预测目标的任务作为损失函数,例如交叉熵等。
GraphSAGE的一个强大之处是它在一个子集学到的模型也可以应用到其它模型上,原因是因为GraphSAGE的参数是共享的。如图3所示,在计算节点A和节点B的embedding时,它们在计算两层节点用的参数相同。
当有一个新的图或者有一个节点加入到已训练的图中时,我们只需要知道这个新图或者新节点的结构信息,通过共享的参数,便可以得到它们的特征向量。
微积分中,对一个多元函数,拉普拉斯算子是所有自变量的非混合二阶偏导数之和
实际我们只能近似计算导数值,也就是数值微分,在\(\Deltax\)的值很小时
对于二阶导数有:
若是二元函数,
为了简化,做出如下假设
于是,在对二元函数进行采样,使之离散化之后,我们可以得到拉普拉斯算子的计算公式
N(i,j)是点(xi,yj)的所有邻居点的集合。
我们将图的顶点看作函数值,则可以得到图的拉普拉斯算子。在这里调换2个f的位置,与之前相比多一个负号。然后我们把边的权重也考虑进去,得:
Ni是结点i的邻结点的集合
若j不属于Ni,则\(w_{ij}=0\),因此可以把j的范围扩到V,然后进行如下运算:
f是所有结点的函数值构成的列向量
D为加权度矩阵,W是邻接矩阵,共有n个结点,定义拉普拉斯矩阵为:\(L=D-W\)
D和W都是对称矩阵,因此L也是对称的。
同时我们规定,每个结点与其自身的权值为0.所以W的主对角线上的元素均为0.也就是说L的对角线上都是D对角线上的元素,即每个结点的加权度。