GCN大家族
GNN不是理解图,而是在图上做信息扩散。一个图中,每个节点都有一个特征向量,但一开始都只有自己的局部信息。所以GNN的本质是让节点通过图边交换信息,使一个节点逐渐拥有它周围上下文的表示。
邻接矩阵控制的信息扩散
节点间聚合
其中 $\hat{A}$ 是加了自环的邻接矩阵,$H$是所有节点特征矩阵。如果第 i 个节点和第 j 个节点相连,那么 $\hat{A}_{ij}$ = 1
所以
意思是节点 i 把邻居节点 j 的特征全部加起来。
归一化
假设一个节点有100个邻居,另一个节点只有2个邻居,直接求和的话高度节点的表示会变得特别大,所以要进行归一化
于是GCN实际传播的是
特征通道间聚合
注意这里的 H 每一行表示一个节点。单个节点特征是一个行向量,所以线性层H 在 W的左边。如果我们说小写的 h,那往往是列向量。
思考
从底层看,GCN做的是平滑,每个节点不断吸收邻居信息,结果变成相连的节点表示越来越相似。所以GCN倾向于保留低频结构,让局部邻域内的表示变得平滑。这在社交网络中,搜广推中可能有效,但是对于漏洞检测这个任务假设不完全成立。因为代码图不是普通图,真正漏洞只在某一个小点。并且CPG里面的边分很多种,但是GCN会把它们都压成同一种边。所以GCN存在以下问题
- 边的重要性不一样,但GCN相同对待
- 边的类型不一样,但GCN使用同一个 W
GGCN
GGCN的核心变化是给每条边加一个可学习的门控系数
其中
Gate的含义
它学习当前这条边是否应该让信息通过,应该通过多少。也就是说GGCN 把 GCN的固定传播 A 变成了数据相关的自适应传播 。其中 A决定哪些节点物理上相连,G决定这些连接实际上传多少信息。
这解决了GCN将所有边的重要性同等对待的问题
RGCN
RGCN认为图中的边不是同一种关系,所以它不再使用统一一个邻接矩阵 A,而是把图拆成多张关系图
每一种边都有自己的邻接矩阵
RGCN的传播可以写成
此时不同关系有不同的权重W