机器学习_图卷积神经网络
现在最常用的是GCN,所以首先讲解。后面再根据模型的发展历程讲解。
图卷积神经网络GCN
原文:GNN | 从序列神经网络到GCN、GraphSage、GAT图模型总结
我们发现,无论是序列结构,还是图结构,其在增强token表示的过程,实际上是融合上下文信息的过程。以CNN为例,其通过滑窗的方式,学习到的是制定n-gram的共现信息(其中的n取决于卷积核的大小),LSTM学习的是上文之间的依赖关系,双向LSTM建模的是上下文之间的关系。这种上下文的获取是很直接的,可以是整个句子,也可以是指定的窗口。
但对于GNN而言,对应的token的上下文则是其一阶邻居或者二阶邻居,将邻居的特征融入到该token上的方式很直观的想法就是不同邻居的特征,按照不同的贡献度(权重),联合自身的特征进行加权求和,像能量传递一样,传递给当前token,并得到该token的总体能量表示。这也就是常说的聚合操作。
因此,为了实现上述过程,我们至少需要有以下输入:
我们需要针对每一个节点,再每次特征聚合时,都拿到一阶邻居和自身信息。这就用到了就邻阶矩阵。
-
每个token节点的特征信息,即特征矩阵X。就像CNN的输入一样,我们针对每个词,可以通过lookup embedding的方法获取每个词对应的embedd表示(通过word2vec训练得到),可以是100维、300维等。当然也有其他的特征表示方法,如收集特征,然后对应的获取指定特征项上的值。
-
每个token的上下文信息,即邻阶矩阵A。图的上下文信息通过邻接矩阵(记录了每个节点对应的邻居信息)实现,而为了获取自身的信息,需要添加一个自环操作,即邻接矩阵+对角矩阵(对角线值为1,其余为0)。
-
上下文贡献信息,即度矩阵D。上面说到当前节点token,其接受到其上下文节点的信息,但需要有不同的权重,这个权重比较直观的想法就是借助当前节点的邻接个数来说,如果邻接个数多,那么每个对应的节点开源所贡献就会被分解,因此,可以通过计算每个节点对应的邻居个数,得到一个度矩阵,然后再求倒数(取逆),得到对应的值。而对于度数很大的超级节点,其值趋近于0,所以通常也会先对度开根号,然后再取逆。
因此,很自然的,有了上述三个矩阵,做一个连乘,即\(D*A*X\),将token节点的特征矩阵,通过邻阶矩阵获取上下文节点及其对应的特征,再乘以根据对应的权值,就完成了可以将每个token节点一阶邻居在相同维度上的特征值进行聚合(最简单的是直接相加)。
进一步的,我们将这一过程纳入神经网络当中进行拟合学习,需要用到一个参数矩阵W,一个激活函数,如Relu,得到经过一层GNN后得到的节点隐藏状态表示H。
当然,这是比较朴素的方法,在实际的工作中,会使用归一化后的邻阶矩阵进行处理。
发展历程
原文:回顾频谱图卷积的经典工作:从ChebNet到GCN
图卷积神经网络2-谱域卷积:SCNN/ChebNet/GCN的引入和介绍
https://www.zhihu.com/question/54504471/answer/3328747512
从图(Graph)到图卷积(Graph Convolution):漫谈图神经网络模型 (一)
https://www.cnblogs.com/SivilTaram/p/graph_neural_network_1.html
SCNN
ChebNet
对SCNN进行简化(砍手砍脚)
GCN
再ChebNet基础上,再次对SCNN进行简化(只剩头部)
Graph Transformer
为什么可以使用? Transformer有能力将其他节点的信息 附加到 该节点,和GCN的目的一致。
关键点是什么? position embedding,需要position embedding将本节点与有关系的节点表示出来。
使用了什么position embedding(PE)?
-
Global PE
-
Local PE
-
Relative PE
-
Structural PE