骨架
堆叠 KNN attention pooling layers , 是 Graph Attention Networks的泛化,首先不需要提前计算图,which is difficult for some kind of data(有没有graph都可以),其次不需要输入整幅图,将图分割有利于计算。
算法
1. feature attention layer
Graph Attention Model 在最初的特征使用线性变换,也就是仿射变化对原始特征进行了处理,从F‘不一定等于F可以看出来。
对于一个样本的特征向量,如果特征维度是F的话,就使用维度为F的一个特征注意力向量w来对特征进行处理
w
=
(
w
1
,
w
2
,
⋯
 
,
w
F
)
∑
i
=
1
F
w
i
=
1
w = (w_1,w_2,\cdots,w_F) \quad \sum_{i=1}^{F}w_i=1
w=(w1,w2,⋯,wF)i=1∑Fwi=1
h
~
i
=
w
⊗
h
i
\widetilde{h}_i = w \otimes h_i
h
i=w⊗hi即,每个元素相乘,因此该操作后特征维度不变,只是特征的影响能力会乘以一个权重,在总体流程图中以不同的颜色表示重要性。 【权重作用于特征】
2. Attention kernel
实质: 计算样本之间的相似性促进池化,作用于feature attention之后。
- cosine similarity: α i j = h ~ i ⋅ h ~ j ∥ h ~ i ∥ ⋅ ∥ h ~ j ∥ \alpha_{ij} = \frac{\widetilde{h}_i \cdot \widetilde{h}_j }{\|\widetilde{h}_i \|\cdot \|\widetilde{h}_j\|} αij=∥h i∥⋅∥h j∥h i⋅h j
- Inner product: α i j = h ~ i ⋅ h ~ j \alpha_{ij} = \widetilde{h}_i\cdot \widetilde{h}_j αij=h i⋅h j
- Perceptron affine kernel: α i j = w T ⋅ ( h ~ i ∥ h ~ j ) \alpha_{ij} = w^T\cdot(\widetilde{h}_i\| \widetilde{h}_j) αij=wT⋅(h i∥h j)
- Inverse distance with weighted L2 norm (w is the feature weight):
α
i
j
=
−
∥
w
⊗
h
~
i
−
w
⊗
h
~
j
∥
2
\alpha_{ij} = -\| w\otimes \widetilde{h}_i - w \otimes \widetilde{h}_j \|^2
αij=−∥w⊗h
i−w⊗h
j∥2
使用softmax归一化,其他归一化也是可行的。 a i j = a ( h ~ i , h ~ j ) = e α i j ∑ j ∈ N i e α i j a_{ij} = a(\widetilde{h}_i ,\widetilde{h}_j) = \frac{e^{\alpha_{ij}}}{\sum_{j\in N_i}e^{\alpha_{ij}}} aij=a(h i,h j)=∑j∈Nieαijeαij
[attention kernels 实质是计算两个样本之间的相似性,如果样本之间的关系图没有给出的话,可以使用其中一种kernel计算affinity graph,使用另一种来计算规范化注意力]
3. kNN attention pooling layer
前面样本经过了特征注意力处理,然后对attention feature之后的样本进行attention 和normalized处理之后,整个过程如下:
h
~
i
′
=
f
(
∑
j
∈
N
i
a
(
h
~
i
,
h
~
j
)
⋅
h
~
j
)
\widetilde{h}'_i = f(\sum _{j \in N_i}a(\widetilde{h}_i ,\widetilde{h}_j)\cdot \widetilde{h}_j )
h
i′=f(j∈Ni∑a(h
i,h
j)⋅h
j)其中
h
~
i
′
\widetilde{h}'_i
h
i′ 表示池化输出,
f
f
f表示池化函数,作用于attention 之后归一化的结点,确定该结点是否激活。例如
f
(
h
)
=
m
a
x
(
W
h
+
b
,
0
)
f(h)=max(Wh+b,0)
f(h)=max(Wh+b,0)
[与GAM一样,括号内是一个结点新的输出,所以pooling layers 作用于结点,而不是特征,与之前的CNN等池化缩小feature map尺寸不一样]
如果给定了一个图可以直接来确定邻居节点。如果图较大,为了降低计算复杂度,随机选择K个样本用于计算。k是一个超参数。【我认为就是作者实现里面batch_size的大小,如果model 的设置里面k=None,那么k邻近就是batch_size的大小,如果k 有值,那么k邻近就是在batch_size里面选择k个样本】
后面堆叠基础层和半监督小样本学习都比较简单了,可以根据文章提供的源码对照分析。