- GNN = message + aggregation
- MSG可以是一个线性变换,注意
h
v
l
{h_v}^l
hvl利用了v结点本身的信息。
经典的GCN Layers:
这里的 h v l h_v^l hvl没有利用 h v l − 1 h_v^{l-1} hvl−1的信息,下一种方法GraphSAGE进行了改进,把 h N ( v ) l h_{N(v)}^l hN(v)l的信息与 h v l − 1 h_v^{l-1} hvl−1的信息连接起来,这里的concat操作就是把向量连接的意思
GraphSAGE neighbor Aggregation的一些方法:求和,求平均值,还有非常有意思的是用LSTM,其中求和的message是除以 N ( v ) N(v) N(v),然后aggregation是求和;求平均值(池化)massage是用MLP,然后求平均值;LSTM就是把结点v的所有邻接结点的信息连接起来做一个LSTM
这里所谓 l 2 l_2 l2标准化就是除以这个数据本身的平方和的平方根,但是这是可选的,因为有些情况下使用这种方法有效,有些情况下无效
这里所谓的GAT就是加权求和,给v不同的邻接结点分配不同的权重,因为不同的邻接结点重要性是不同的,重要的权重就更大,而在GCN和GraphSAGE中,认为v的每个邻接结点的重要性是一样的,权重相同,相当于说 α v u = 1 \alpha_{vu} = 1 αvu=1对于任意的v,u均成立 。这里 α v u \alpha_{vu} αvu是一个可学习的参数,一开始是随意分配的
α
v
u
\alpha_vu
αvu的计算方法,先计算
e
v
u
e_{vu}
evu,它是通过对
W
l
h
u
l
−
1
W^l h_u^{l-1}
Wlhul−1和
W
l
h
v
l
−
1
W^l h_v^{l-1}
Wlhvl−1做attention来计算的,然后对
e
v
u
e_{vu}
evu做一个softmax得到
α
v
u
\alpha_{vu}
αvu
这里提出一个问题,什么叫attention机制?它的形式是什么?
这里给出的一个例子是先把
W
l
h
u
l
−
1
W^l h_u^{l-1}
Wlhul−1和
W
l
h
v
l
−
1
W^l h_v^{l-1}
Wlhvl−1连接起来,然后做一个线性变换。
跟transformer一样,GAT也使用了一个多头注意力的机制,其目的是为了稳定attention的过程,那么是怎么使用多头的呢?这里采用了计算多个
h
v
l
[
i
]
h_v^l[i]
hvl[i],通过不同的
α
v
u
i
\alpha_{vu}^i
αvui来计算,其实就是多用了几个
α
v
u
\alpha_{vu}
αvu的意思,有多个
h
v
l
[
i
]
h_v^l[i]
hvl[i],最后把他们连接起来或者求和得到最后的
h
v
l
h_v^l
hvl。
attention机制的优点:
- 最关键的就是可以给不同的邻接结点分配不同的权重
- 有利于并行计算,即GPU计算,因为attention的系数的计算可以使用并行计算,aggregation也可以使用并行计算
- 存储空间少
- 只需要考虑局部的网络邻接结点
- 共享的参数,不依赖于图的整体结构
通过的GNN层
其中:
- BatchNorm: 为了让训练更加稳定,单个输入变化太大,会导致训练不稳定
- Dropout:避免过拟合
- Attention/Gating:控制一个message的重要程度
这里batch normalization,使均值为0,方差为1,它的方法在除以标准差还加了个偏移,偏移符合高斯分布
这里dropout是为了避免过拟合,思想是在训练的时候以一个概率p,随机把一些神经元设置为0,但是在测试的时候,使用所有神经元用于计算
如何搭建GNN网络:之前我们讲了单个的GNN层,堆叠多个GNN层就变成了一个GNN网络
多层的GNN会导致一个over-smoothing问题:所有结点的embedding收敛于相同的值。这是为什么呢?
- 定义一个概念 接收域:一些决定这个结点embedding的结点组成的一个范围叫接收域
- 在K层的GNN网络中,每个结点有K跳邻接结点接收域
- 共享结点的增长非常快,3跳结点的接收域就几乎是所有结点了,因为一个结点的embedding由它的接收域的结点决定,所以如果每个结点接受域为所有结点的话就会导致每个结点的embedding都是一样的。
产生了一个问题,GNN的层数越多,结点的接收域就越大,结点的embedding的会更相似,就会导致over-smoothing问题
那么,怎么解决over-smoothing问题呢?
- 分析必要的接收域
- 把GNN的层数设置为稍微比我们想要的接收域大一点,不要让层数不必要的多
既然层数要有限制,甚至会很少,那么又有问题了:如果GNN的层数很少的话,怎么增强GNN的表达能力呢?
- 可以增强每一个GNN层的表达能力,可以让aggregation/transformation变成一个深度神经网络
- 可以添加一些不进行信息传递的GNN层,一个GNN网络可以不用只有GNN层,可以添加一些MLP层,比如pre-process 层和 post-process 层,进行数据的预处理和输出数据的处理
现在考虑一个新的问题,如果我现在就是需要很多层GNN层呢?那怎么办?
- 可以添加skip connections, 意思就是跳过一些层
思考一个问题,既然可以跳过这一层,那为什么就不直接把这一层给删了呢?这不更直接吗?
是因为这不是简单的跳过,每一层之间都有一个skip connection,它不是一定会跳过这一GNN层,而是可以跳过,也可以不跳过,那就会产生有2的N次方的路径组合,N是skip connection的个数,它会给模型带来一系列的混合模型
说实话,看到这个GNN layer with skip connection的公式,让我想起了GraphSAGE,也是应用了前一层v结点的信息,只不过GraphSAGE是concat h v l − 1 h_v^{l - 1} hvl−1, 而skip connection是直接进行相加
这里还有skip connections的一些其他的方法