目录
摘要:GNN层的变换,over-smoothing问题以及解决办法(增强GNN的表达能力、增加跳跃连接)
在实际应用中,也就是在编程的时候,基本就可以把GNN层看作是CNN层,可以往上面加上各种在深度学习中应用的模块。
实践中的GNN层
BN以及dropout之类的具体操作,参考神经网络中的内容。
后面自己补一个,神经网络优化内容的总结。
GNN的过渡平滑问题(节点嵌入趋同)
在GNN中,如果大量GNN层堆叠,就很有可能出现over smoothing问题——通过图神经网络处理得到的各个节点embeddings变得大同小异。显然这样是不行的,各个节点的embeddings都是一样的,那么你怎么做节点分类??!!其他的tasks也很难搞啊!
那为什么会出现这个问题呢??
课程中,老师引入一个概念:接受域
节点的embeddings都是由接受域决定的。
因为每个节点计算embeddings时,都是通过message和aggregataion操作的,都是通过从邻居节点那边得到信息在做处理的。如果你的GNN层数越多,最后得到embeddings它汇集的节点就会越多(接受域越大),而所有节点汇聚的节点都多,那么显而易见,不同节点汇集的对象就会重叠(也就是大家都从相似的接受域汇集),最后汇集的结果就会相似。
其实,也可以用另一个角度去理解,从计算图去理解。
在最开始介绍GNN的时候,提过计算图,如下
如果用GNN实现这个计算图,那么GNN应该是两层。对于上面这个图,如果GNN变成四层或者更多,它对应的计算图会变成什么样子呢??当层数过多之后,计算图就变成俄罗斯套娃,你中有我我中有你,最后得到的结果就会相似。
其实,计算图和接受域是类似的意思。
因此,在设计GNN模型时,得注意GNN的层数。对于GNN模型来讲,不是GNN层数越多,模型的能力越强,而是最开始层数增多,模型能力变强,后来层数增多,模型能力变弱!!
可以通过分析接受域的大小去设计GNN层数。
GNN层数数量有一个总思想,就是层数不能太多!!那么这样又会带来一个问题:GNN层数太少了,模型的表达能力就不强!
增强GNN的表达能力
方法1:增强GNN层内部的表达能力
在transformation和aggregation操作中增加可以训练的参数,可以把transformation和aggregation操作变成深度神经网络DNN。
方法2:在GNN模型中增加其他类型的NN层(譬如MLP)——常用
在节点数据被传入GNN层之前,和数据传出GNN层后,我们都可以增加NN层去做预处理和后处理。
增加跳跃连接
如果我们就是想要GNN层数多一点,那么我们就可以采取增加跳跃连接的方式。
在谈GNN的过渡平滑问题的时候提过,节点embeddings在GNN的前几层差异会比较大,当层数变多,后面的embeddings就会相似。那么我们把前几层的数据直接传到后面的GNN层中,这样也能解决过渡平滑问题。
增加跳跃连接的方式各式各样,就不介绍了。跳跃连接在深度神经网络DNN中也经常会用,是为了防止网络层数增加而导致的梯度弥散问题与退化问题。