这是关于GAT的一些介绍,注意力机制在图神经网络中的应用;inductive learning;局部信息的聚合
相较于GCN,GAT更加的注重局部环境
图注意力层
注意力机制的三要素:query,source,attention value。可以设置如下
- Query :设置成当前中心节点的特征向量
- Source设置为所有邻居的特征向量
- attention value:设置为中心节点经过聚合操作后的新的特征向量
设图中任意节点vi在第l层所对应的特征向量,hi∈Rd(l),d(l)表示节点特征的长度;经过一个以注意力机制为核心的聚合操作之后,输出的是每个节点的新特征向量:hi′∈Rd(l+1),d(l+1)表示输出的特征向量的长度。这个聚合操作叫做:图注意力层(GAL)!

假设中心节点为vi,我们假设邻居节点vj到vi的权重系数为:
eij=a(Whi,Wj)
W∈Rd(l+1)×d(l))是该层节点特征变换的权重参数。a是相关度计算,只要满足Rd(l+1)×Rd(l)→R
论文采用一个单层全连接层来处理:其中权重参数:a∈R2d(l+1)
eij=Leaky ReLU(aT[Whi∣∣Whj])
其实我认为这里有点问题,从计算(代码)来看更因该像这样eij=Leaky ReLU([Whi∣∣Whj]a),中间是拼接操作。代码采用采用了一种很神奇的方式:没有使用拼接技术将两个矩阵拼接起来,而是采用了——广播机制:
1 2 3 4 5 6 7 8 9 10 11 12 13
| def _prepare_attentional_mechanism_input(self, Wh): Wh1 = torch.matmul(Wh, self.a[:self.out_features, :]) Wh2 = torch.matmul(Wh, self.a[self.out_features:, :]) e = Wh1 + Wh2.T return self.leakyrelu(e)
|
代码原链接:https://github.com/Diego999/pyGAT
采用了广播机制减少了计算量:4O2→2O2,O(out_features)
最后的权重系数:对e进行归一化处理:
αij=softmaxj(eij)=vk∈N~(vi)∑exp(eik)exp(eij)
这样就保证了所有邻居的权重系数的和为1.完成权重系数的计算对节点vi进行更新:
hi′=σ(vk∈N~(vi)∑αijWhj)
当然也可以采用多头注意力机制:
ht′=∣∣k=1Kσ(vj∈N~(vI)∑αij(k)W(k)hj)
