赞
踩
主要有Transformer layer组成,每一层包括MHA(多头自注意)和FFN(前馈)模块,并增加了LN。
h
′
(
l
)
=
MHA
(
LN
(
h
(
l
−
1
)
)
)
+
h
(
l
−
1
)
h
(
l
)
=
FFN
(
LN
(
h
′
(
l
)
)
)
+
h
′
(
l
)
h^{'(l)} = \text{MHA}(\text{LN}(h^{(l-1)})) + h^{(l-1)}\\ h^{(l)} = \text{FFN}(\text{LN}(h^{'(l)})) + h^{'(l)}
h′(l)=MHA(LN(h(l−1)))+h(l−1)h(l)=FFN(LN(h′(l)))+h′(l)
Graphormer主要是在MHA模块内进行了改动,Transformer原始的self-attention如下:
Q
=
H
W
Q
,
K
=
H
W
K
,
V
=
H
W
V
,
A
=
Q
K
⊤
d
K
,
a
t
t
n
(
H
)
=
s
o
f
t
m
a
x
(
A
)
V
,
Q = HW_Q,\quad K = HW_K,\quad V = HW_V,\\ A = \frac{QK^\top}{\sqrt{d_K}}, \quad attn(H) = softmax(A)V,
Q=HWQ,K=HWK,V=HWV,A=dK
QK⊤,attn(H)=softmax(A)V,
原始的
H
∈
R
n
×
d
H \in R^{n \times d}
H∈Rn×d,最后算出来的
a
t
t
n
(
H
)
∈
R
n
×
d
attn(H)\in R^{n \times d}
attn(H)∈Rn×d。
缺点,Transformer是全局视野,不能有效的使用图的结构信息。
在输入层中,将节点特征x和由入读和出度索引的可学习的embedding相加。
h
i
(
0
)
=
x
i
+
z
deg
−
(
v
i
)
−
+
z
deg
+
(
v
i
)
+
,
h_i^{(0)} = x_i + z^-_{\text{deg}^{-}(v_i)} + z^+_{\text{deg}^{+}(v_i)},
hi(0)=xi+zdeg−(vi)−+zdeg+(vi)+,
# init
self.in_degree_encoder = nn.Embedding(512, hidden_dim, padding_idx=0)
self.out_degree_encoder = nn.Embedding(512, hidden_dim, padding_idx=0)
# degree encoder
# in_degree, out_degree = batched_data.in_degree, batched_data.in_degree
node_feature = node_feature + self.in_degree_encoder(in_degree) + self.out_degree_encoder(out_degree)
所有节点的度embedding是共享的,由度的数值进行索引。
self-attention模块内,公式里面A可以视为节点相互之间的边权重(相似程度)。元素值
A
i
j
A_{ij}
Aij代表节点i到节点j之间的边权重。
A
i
j
=
(
h
i
W
Q
)
(
h
j
W
K
)
T
d
+
b
ϕ
(
v
i
,
v
j
)
,
A_{ij}=\frac{(h_iW_{Q})(h_jW_{K})^T}{\sqrt{d}} + b_{\phi(v_i,v_j)},
Aij=d
(hiWQ)(hjWK)T+bϕ(vi,vj),
Spatial encoding是
b
ϕ
(
v
i
,
v
j
)
b_{\phi(v_i,v_j)}
bϕ(vi,vj),它作为bias加到原始值上面。
ϕ
(
v
i
,
v
j
)
\phi(v_i,v_j)
ϕ(vi,vj)表示节点i到节点j之间的最短路径(SPD),
b
ϕ
(
v
i
,
v
j
)
b_{\phi(v_i,v_j)}
bϕ(vi,vj)有所有层共享,由SPD索引,输出一个可学习的标量。这样做的优点是可以自适应的和不同距离的节点进行消息传递。
多源最短路径使用Floyd算法求解,得到shortest_path矩阵。
对edge feature进行编码,
A
i
j
=
(
h
i
W
Q
)
(
h
j
W
K
)
T
d
+
b
ϕ
(
v
i
,
v
j
)
+
c
i
j
,
where
c
i
j
=
1
N
∑
n
=
1
N
x
e
n
(
w
n
E
)
T
,
A_{ij}=\frac{(h_iW_{Q})(h_jW_{K})^T}{\sqrt{d}} + b_{\phi(v_i,v_j)} + c_{ij},\ \text{where}\ c_{ij}=\frac{1}{N}\sum_{n=1}^{N} x_{e_n}(w^{E}_{n})^T,
Aij=d
(hiWQ)(hjWK)T+bϕ(vi,vj)+cij, where cij=N1n=1∑Nxen(wnE)T,
编码信息
c
i
j
c_{ij}
cij(标量)的计算,取节点i到节点j的最短路径SPD上所有(edge feature
⊙
\odot
⊙ 可学习的embedding)的平均值,可学习的embedding由序号n来索引。
新增一个虚拟节点和所有节点相连,最终图表示的结果就是虚拟节点的嵌入表示。
对抗性数据增强方法(Adversarial Train)。
主要在化学分子图数据集中进行。
200个epoch,OGB-LSC的test没有对外公布,只有valid数据。
Degree Encoding | Spatial Encoding | Edge Encoding | Valid MAE |
---|---|---|---|
---- | ✅ | ✅ | 0.1298 |
✅ | ---- | ✅ | 0.1279 |
✅ | ✅ | ---- | 0.1361 |
✅ | ✅ | ✅ | 0.1294 |
✅ | Adj. | Adj. | 0.1297 |
---- | Adj. | Adj. | 0.1307 |
SPD换成Adj.好像差的不是很大。去掉Spatial Encoding效果居然还要好一点?
官方给出的LSC上的简化版(为节省计算资源)Graphormer消融实验结果。
../../checkpoints/epoch=200-step=298886.ckpt
)
Degree Encoding | Spatial Encoding | Edge Encoding | Valid AUC (%) | Test AUC (%) |
---|---|---|---|---|
---- | ---- | ---- | 78.49 | 67.43 |
✅ | ---- | ---- | 72.39 | 63.40 |
---- | ✅ | ---- | 61.62 | 36.88 |
---- | ---- | ✅ | 78.11 | 77.31 |
---- | ✅ | ✅ | 76.56 | 75.53 |
✅ | ---- | ✅ | 76.49 | 78.35 |
✅ | ✅ | ---- | 46.01 | 30.12 |
✅ | ✅ | ✅ | 79.70 | 79.68 |
✅ | Adj. | Adj. | 79.78 | 77.14 |
一个有趣的现象,有Spatial Encoding、无Edge Encoding,效果要比什么都不加差。
用Adj替换SPD矩阵,test auc下降不是很多,但是减少了Floyd( O ( N 3 ) O(N^3) O(N3))的计算量。从消融实验中可以发现,基于SPD的edge encoding与spatial encoding配合使用是比较有用的,单独使用degree encoding是比较有效的。edge encoding对于auc的提升影响是很大的。
Degree Encoding | Spatial Encoding | Edge Encoding | Valid AUC (%) | Test AUC (%) |
---|---|---|---|---|
---- | ✅ | ✅ | ||
✅ | ---- | ✅ | 78.19 | 77.80 |
✅ | ✅ | ---- | 83.97 | 74.89 |
✅ | ✅ | ✅ | 79.70 | 79.68 |
✅ | Adj. | Adj. | ||
---- | Adj. | Adj. |
Model | Test ROC-AUC | Valid ROC-AUC |
---|---|---|
GCN+Vn+FLAG | 76.83 | 81.76 |
GCN+VN+FLAG+DE | 71.28 | 81.83 |
GIN+Vn+FLAG | 77.48 | 84.38 |
GIN+VN+FLAG+DE | 76.29 | 82.24 |
加上Degree Encoding (DE),Test auc震荡的很厉害,并且表现也并不好。
代码和具体做法:https://github.com/ytchx1999/Graphormer/tree/main/examples/ogb
处理得到 MorganFingerprint 和 MACCSFingerprint ,拼接后得到feat
使用Random Forest进行分类训练任务,保存训练结果
作为平滑项,和Graphormer学到的graph_pred进行加权求和
o
u
t
p
u
t
=
(
1
−
α
)
⋅
S
i
g
m
o
i
d
(
o
u
t
p
u
t
)
+
α
⋅
m
g
f
_
m
a
c
c
s
_
p
r
e
d
output = (1-\alpha)\cdot Sigmoid(output) + \alpha \cdot mgf\_maccs\_pred
output=(1−α)⋅Sigmoid(output)+α⋅mgf_maccs_pred
Model | Test ROC-AUC | Valid ROC-AUC | Parameters | Hardware |
---|---|---|---|---|
Graphormer (without pre-train) | 72.60 | 72.94 | 47085378 | Tesla V100 (32GB) |
Graphormer | 80.51 ± 0.53 | 83.10 ± 0.89 | 47183040 | Tesla V100 (16GB) |
Graphormer + FPs | 82.25 ± 0.01 | 83.96 ± 0.01 | 47085378 | Tesla V100 (32GB) |
test auc提升2%左右,榜三(但标准差更小),前三名差距比较小。
代码:https://github.com/ytchx1999/PyG-ogbn-products/tree/main/spectral%2Bmlp%2Bcs
论文:https://arxiv.org/abs/2010.13993
排行榜:https://ogb.stanford.edu/docs/leader_nodeprop/#ogbn-products
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。