好用的还是 GAT, GIN(指出最好的卷积 就是 hi + 邻居特征(而且只能用 sum))
Introduction
GNN 可以理解为是由 Graph(图) + Nerual Networks 组合而成的,图结构应该都在数据结构与算法里了解得很清楚,关键要解决的问题是:将图的结构和图中每个节点和边的特征转化为一般的神经网络的输入(张量)。
常见GNN应用
可以做的事情主要包括:分类和生成
① 对化学分子结构特征进行分类 ,判断其特征是否属于会导致突变的那类
② 学习若干个分子结构特征后,能够去生成类似结构的分子(GraphVAE)
新冠靶向药的开发。
在生成的过程中可以加入很多constraint,例如:是新药,比较好合成,有效性等。
如何做
现有问题
1.How do we utilize the structures and relationship to help our model?关系杂
2.What if the graph is larger, like 20k nodes?模型大
3.What if we don't have the all the labels?无标签
看下面一个例子来理解,现有这样一个图结构:
蓝色是Unlabeled Node,褐色是Labeled Node
现在要推断黄圈中的节点的标签。
思想是A node can learn the structure from its neighbors(近朱者赤,近墨者黑), but how?
和filter相乘相加后就得到feature map。如何把卷积操作移植到Graph上?
Solution 1: Generalize the concept of convolution (corelation) to graph >> Spatial-based convolution空间
Solution 2: Back to the definition of convolution in signal processing>> Spectral-based convolution频域
第一种是把CNN的操作Generalize到GNN上。
第二种是借鉴信号处理中做法来进行卷积操作。
RoadMap
根据上面的两种Solutions,本次课程的内容如下:
Spatial-based GNN
基于空间特征的图神经网络
这个是solution 1,因此是根据CNN的卷积进行移植:
要把下面的图中箭头所指的节点进行更新得到下一层的状态
注意上图中的箭头所指的节点是
Terminology:
ØAggregate: 用 neighbor feature update 下一层的 hidden state
ØReadout: 把所有 nodes 的 feature 集合起來代表整个 graph(类似LSTM把整个句子向量压缩为一个向量)
法1:NN4G (Neural Networks for Graph)09年
input layer 首先经过基本的 embedding 之后到 hidden layer 0。然后更新的话是将其相邻的节点相加然后乘以权重再加上之前 input layer 的原始输入。
Aggregate 更新方法:
每个隐藏层都是一个图,图中每个结点的权值 = 一个待学习的参数 w × 上一层这个结点所有相邻结点的权值和 + 原本在第一层 input layer 这个结点输入的值(例如: w 1 w_1 w1 * x 3 x_3 x3 就是 h 3 0 h_3^0 h30 )
需要注意的是,全连接神经网络的神经元是固定的,因此对于每个图输入后,最后进入全连接层的 vector 维度应该是一样的。因此 NN4G 使用的方法特点是:对于每个图都固定隐藏层数量,然后取每层的均值 送入全连接神经网络,这样可以避免图大小的影响
关于为什么要相加的问题:如果不用相加的话,你就很难去处理节点间邻居数量不同这个巨大的区别 。另外,相加是最简单也是被证实最有效的利用邻点信息的方法。
Readout 方法:
通过求出整个图中的每个顶点间的特征均值(按照层数求平均),然后各自乘以相应的权重(需要学习)再把每个结点得到的结果相加。
法2:DCNN (Diffusion-Convolution Neural Network )15年
思想:对每一层进行更新时,第 n 层看离当前节点距离 n 的节点信息。
例如在第一层,更新结点 3 首先找到与它距离为 1 的节点(有 0、2、4),然后用这三个与节点距离为 1 的 结点的原始的输入相加取平均值(mean)再乘以权重;
在第二层,更新节点 3 首先找到与它距离为2的节点 (有 1 和 自己本身,注意结点 3 和 3 本身的距离也是 2 ),然后用这几个符合条件的结点的原始的输入相加取平均值再乘以权重。
这样就可以将每一层的节点特征组成一个矩阵,然后叠在一起。
当我们需要每个节点的feature 信息 的时候,采用以下的方式来表示图中每个节点的特征:
每个节点的特征计算就把节点i对应的 h i 1 h_i^1 hi1 从堆叠结果中提取出来,然后点乘w即可。
如对节点 1 来说,也就是将每一层的结点 1 提出来,然后乘以权重得到最后结点 1 的表示。按照类似的操作可以得到其余结点的表示。
另一种方法:DGC (Diffusion Graph Convolution) ------ 直接将每一层的结点 1 所在信息提出来相加求和
法3:MoNET (Mixture Model Networks)16年
特点:与之前只是将相关联结点信息相加求和相比,MoNET 考虑到一个节点的邻居跟之间的区别(例如,有的相邻结点和该结点之前的关系可能更重要一点)
思路:
- deg(x) 表示x的出入度数
- u(x,y) 自定义的距离计算方式
这里定义的距离公式可以有不同的。也就是给每个节点不同的权重 weighted sum。
法4:GraphSAGE.18年
SAmple and aggreGatE
Can work on both transductive and inductive setting
GraphSAGE learns how to embed node features from neighbors
这个方法在提取邻居信息上提出了三种方式:
AGGREGATION: mean, max-pooling, or LSTM
法5:GAT (Graph Attention Networks).18年
特点:与 MoNET 相比,GAT 在定义距离公式时所用的权重 weighted sum 需要学习而得(相当于对邻居结点做 attention ,不同的邻居结点给出不同的 weight ),而不是事先规定好的。
理论:GIN (Graph Isomorphism Network)
提供了一些关于图神经网络什么方式的aggregate能够work的理论证明和结论。
更新第k层第v个节点的时候要把它的邻居做求和,然后加上该节点与某个常数的乘积。这里提的是直接求和,不是求平均,也不是做maxpooling。为什么?
特点:首先把邻居结点都求加相见 + 结点自己本身信息 × 系数,不用 maxpooling 和 meanpooling(例如在下图中,a 中 每个结点的特征值都一样。在邻居数值相同的状况,若选择 maxpooling 和 meanpooling,都无法确定最后选择的到底是 v 的哪个邻居结点,只有sum可以区别两者。 )
b:在邻居最大值相同的情况,取最大值会失败
c:在邻居最大值相同且平均相同的情况,只有总和成功
思想:用 sum 的方式对每个相邻结点的特征值相加 + 选用多层感知器(而不是一层)
公式中 ε 可以为 0,代表 其实 Graph 中所有相邻结点和其本身节点相加就可以。
Graph Signal Processing and Spectral-based GNN
这节讲的是solution 2,就是用信号处理 的方式来进行特征提取。之前讲过,直接对图中的节点做卷积是不行的,因为不能把节点的邻居和CNN中的卷积核位置一一对应,然后做运算,于是借鉴信号处理的方法,先用傅里叶变化分别处理节点和卷积核,然后相乘,然后再反傅里叶变化得到结果
GCN
Graph Convolutional Networks 就是用上面的公式,设置k=1
展开:
最后形式:
大概意思是邻居乘以w取平均,然后加上bias,经过激活函数得结果。