GNN的计算过程
因为需要研究基于图网络的漏洞检测的可解释性需要熟悉图神经网络,故需要总结以下常见的图网络的前向传播过程。
1.GCN
GCN目前看到的基于结点分类的示例比较多,不过对图分类的还没见过,欢迎大佬补充。
GCN的输入为
- 图的邻接矩阵 A ∈ R n × n A \in R^{ n \times n} A∈Rn×n
- 图的结点特征矩阵 X ∈ R n × d X \in R^{n \times d} X∈Rn×d
其中,图 G = ( V , E ) G = (V,E) G=(V,E) 中,结点数量 ∣ V ∣ = n |V| = n ∣V∣=n, 结点特征向量维度为 d d d。
计算过程:
关于图卷积过程有好多版本,这里列举其中之一。
层间传播过程如下:
H
l
+
1
=
σ
(
D
−
1
2
.
A
~
.
D
−
1
2
.
H
l
.
W
l
)
H^{l + 1} = \sigma(D^{-\frac{1}{2}}.\widetilde{A}.D^{-\frac{1}{2}}.H^l.W^l)
Hl+1=σ(D−21.A
.D−21.Hl.Wl)
- A ~ = A + I ∈ R n × n \widetilde{A} = A + I \in R^{n \times n} A =A+I∈Rn×n, I I I 为单位矩阵
- D ∈ R n × n D \in R^{n \times n} D∈Rn×n 为图的度矩阵
- H ∈ R n × d H \in R^{n \times d} H∈Rn×d 为图的隐层向量,其中 H 0 = X H^0 = X H0=X
- W l ∈ R d × d W^l \in R^{d \times d} Wl∈Rd×d 为GCN的参数
- σ \sigma σ 为激活函数,比如 s i g m o i d , R e l u sigmoid, Relu sigmoid,Relu
结点分类结果计算为
Z
=
s
o
f
t
m
a
x
(
H
L
.
W
)
Z = softmax(H^L.W)
Z=softmax(HL.W)
- W ∈ R d × c W \in R^{d \times c} W∈Rd×c 为最终全连接分类层
- Z ∈ R n × c Z \in R^{n \times c} Z∈Rn×c 为 n n n 个结点在 c c c 个类别上的概率分布
- L L L 为GCN的网络层数
2.Gated Graph Sequence Neural Network
对于有向图 G = ( V , E ) G = (V,E) G=(V,E)。
- C o ( v ) , v ∈ V Co(v), v \in V Co(v),v∈V 表示结点 v v v 的入边和出边集合(与 v v v 相连的边集合)。
- N B R ( v ) , v ∈ V NBR(v), v \in V NBR(v),v∈V 表示结点 v v v 的邻居结点集合(包括入边连接和出边连接的)
这里
- 图的邻接矩阵 A = [ A o u t , A i n ] ∈ R D . ∣ V ∣ × 2. D . ∣ V ∣ A = [A_{out}, A_{in}] \in R^{ D.|V| \times2.D.|V|} A=[Aout,Ain]∈RD.∣V∣×2.D.∣V∣
- 图的结点特征矩阵 X ∈ R n × d X \in R^{n \times d} X∈Rn×d
其中,图 G = ( V , E ) G = (V,E) G=(V,E) 中, 结点特征向量维度为 d d d,这里邻接矩阵也很特别,每个元素不是数字而是边的特征,用 D × D D \times D D×D 向量表示。
论文提到了2种结构
2.1. Gated Graph Neural Networks(GG-NNs)
模型隐层向量输入为,
v
v
v下标表示结点
v
v
v 的向量(论文中的维度标记确实挺乱)
h
v
1
=
[
x
v
,
0
]
∈
R
D
,
对
x
v
进
行
补
0
h^1_v = [x_v, 0] \in R^D, 对x_v进行补0
hv1=[xv,0]∈RD,对xv进行补0
前向传播过程类似GRU,如下:
a
v
t
=
A
v
T
.
[
h
1
(
t
−
1
)
.
.
.
h
∣
V
∣
(
t
−
1
)
]
T
+
b
a^t_v = A_v^T .[h^{(t−1)}_1 ... h^{(t−1)}_{|V|}]^T +b
avt=AvT.[h1(t−1)...h∣V∣(t−1)]T+b
z v t = σ ( W z . a v t + U z . h v t − 1 ) z^t_v= \sigma(W^z.a^t_v + U_z.h^{t−1}_v) zvt=σ(Wz.avt+Uz.hvt−1)
r v t = σ ( W r . a v t + U r . h v t − 1 ) r^t_v = \sigma(W^r. a^t_v + U^r.h^{t−1}_v) rvt=σ(Wr.avt+Ur.hvt−1)
h v t ~ = t a n h ( W . a v t + U . ( r v t ⊙ h v t − 1 ) ) \widetilde{h^t_v} = tanh(W.a^t_v + U.(r^t_v \odot h^{t−1}_v)) hvt =tanh(W.avt+U.(rvt⊙hvt−1))
h v t = ( 1 − z v t ) ⊙ h v t − 1 + z v t ⊙ h v t ~ h^t_v = (1 − z^t_v) \odot h^{t−1}_v + z^t_v \odot \widetilde{h^t_v} hvt=(1−zvt)⊙hvt−1+zvt⊙hvt
可以看到模型有 W z , W r , W , U z , U r , U W^z, W^r, W, U_z, U^r, U Wz,Wr,W,Uz,Ur,U 这些参数,并且这个聚合算法中每个结点的向量聚合了整个图的表示。
其中(由于没看代码,有些向量维度是自己推测的,可能有误):
- A v ∈ R D . ∣ V ∣ × 2. D A_v \in R^{D.|V| \times 2.D} Av∈RD.∣V∣×2.D
- a v t ∈ R 2. D a^t_v \in R^{2.D} avt∈R2.D
- σ 为 s i g m o i d \sigma为sigmoid σ为sigmoid
- [ h 1 ( t − 1 ) . . . h ∣ V ∣ ( t − 1 ) ] T [h^{(t−1)}_1 ... h^{(t−1)}_{|V|}]^T [h1(t−1)...h∣V∣(t−1)]T 表示将 t t t 时刻所有结点向量append形成一个 R D . ∣ V ∣ R^{D.|V|} RD.∣V∣ 向量
- z v t , r v t z^t_v, r^t_v zvt,rvt 分别为update gate和reset gate
输出为
h
G
=
t
a
n
h
(
∑
v
∈
V
.
σ
(
[
h
v
T
,
x
v
]
)
⊙
t
a
n
h
(
[
h
v
T
,
x
v
]
)
)
h_\mathcal{G}= tanh(\sum\limits_{v \in V}.σ([h^T_v,x_v]) \odot tanh([h^T_v,x_v]))
hG=tanh(v∈V∑.σ([hvT,xv])⊙tanh([hvT,xv]))
2.2. Gated Graph Sequence Neural Networks(GGS-NNs)
架构如下
其中
F
o
(
1
)
,
F
o
(
2
)
,
.
.
.
,
F
x
(
1
)
,
F
x
(
2
)
,
.
.
.
F_o^{(1)},F_o^{(2)},...,F_x^{(1)},F_x^{(2)}, ...
Fo(1),Fo(2),...,Fx(1),Fx(2),... 为普通GG-NNs网络。可以看到GGS-NNs本身是多个GG-NNs组合成的复杂网络。
模型输出为 o ( 1 ) , o ( 2 ) , . . . o^{(1)}, o^{(2)},... o(1),o(2),...
3.Graph Attention Networks(GAT)
GAT和普通的attention一样,是一种机制而不是一个模型。
输入为图
n
n
n 个顶点的向量
h
=
{
h
1
,
h
2
,
.
.
.
,
h
n
}
,
h
i
∈
R
F
\mathcal{h} = \{h_1, h_ 2, ... , h_n\}, h_i \in R^F
h={h1,h2,...,hn},hi∈RF
输出新的向量
h
′
=
{
h
1
′
,
.
.
.
,
h
n
′
}
,
h
i
′
∈
R
F
′
h^{'} = \{h_1^{'}, ..., h_n^{'} \}, h_i^{'} \in R^{F^{'}}
h′={h1′,...,hn′},hi′∈RF′。
这里定义 N i N_i Ni 为结点 i i i 的邻居结点集合。
3.1. attention层因子 α \alpha α 的计算
这里定义
-
a
a
a 函数:
a
:
R
F
′
×
R
F
′
→
R
a: R^{F^{'}} \times R^{F^{'}} \rightarrow R
a:RF′×RF′→R
即:输入2个 F ′ F^{'} F′ 维向量,输出一个标量, a a a 函数可以有不同的实现过程,向量内积为其中一种。 - attention层参数矩阵 W ∈ R F ′ × F W \in R^{F^{'} \times F} W∈RF′×F
通常的计算过程如下:
e
i
j
=
a
(
W
.
h
i
,
W
.
h
j
)
e_{ij} = a(W.h_i, W.h_j)
eij=a(W.hi,W.hj)
α i j = s o f t m a x j ( e i j ) = e x p ( e i j ) ∑ k ∈ N i e x p ( e i k ) \alpha_{ij} = softmax_j(e_{ij}) = \frac{exp(e_{ij})}{\sum_{k \in N_i} exp(e_{ik})} αij=softmaxj(eij)=∑k∈Niexp(eik)exp(eij)
这里,作者定义
e
i
j
=
a
(
W
.
h
i
,
W
.
h
j
)
=
L
e
a
k
y
R
e
L
U
(
a
→
T
.
(
W
.
h
i
∣
∣
W
.
h
j
)
)
e_{ij} = a(W.h_i, W.h_j) = LeakyReLU(\overset\rightarrow{a}^T.(W.h_i || W.h_j))
eij=a(W.hi,W.hj)=LeakyReLU(a→T.(W.hi∣∣W.hj))
- a → ∈ R 2. F ′ \overset\rightarrow{a} \in R^{2.F^{'}} a→∈R2.F′
- . T .^T .T 表示转置
- ∣ ∣ || ∣∣ 表示concatenation
3.2. 输出向量的计算
一开始
h
i
′
=
σ
(
∑
j
∈
N
i
α
i
j
.
W
.
h
i
)
h_i^{'} = \sigma(\sum\limits_{j \in N_i}\alpha_{ij}.W.h_i)
hi′=σ(j∈Ni∑αij.W.hi)
其中
- W ∈ R F ′ × F W \in R^{F^{'} \times F} W∈RF′×F 为graph attention layer的参数矩阵
- σ \sigma σ 为非线性激活函数
而作者在计算 α \alpha α 时定义了 K K K 个不同的 a a a 函数(不同的 a → \overset\rightarrow{a} a→ 参数), 计算了 K K K 个不同的 α \alpha α 因子,同时模型的参数矩阵也从1个变成 K K K 个,改进后的计算公式为
h i ′ = σ ( 1 K ∑ k = 1 K ∑ j ∈ N i α i j k . W k . h i ) h_i^{'} = \sigma(\frac{1}{K}\sum\limits_{k = 1}^K \sum\limits_{j \in N_i}\alpha_{ij}^k.W^k.h_i) hi′=σ(K1k=1∑Kj∈Ni∑αijk.Wk.hi)
4.GraphSAGE
GraphSAGE类似word2vec是一个无监督的预训练任务,并不是特定的分类任务
这里定义
- 图 G = ( V , E ) G = (V, E) G=(V,E) 及特征矩阵 X ∈ R ∣ V ∣ × d X \in R^{|V| \times d} X∈R∣V∣×d。
- x v ∈ X x_v \in X xv∈X 表示结点 v v v 的向量。
- 图的网络层数 K K K (也可以理解为时间步),每层对应一个参数矩阵 W k , 1 ≤ k ≤ K W^k, 1 \leq k \leq K Wk,1≤k≤K, K K K 也代表着每个顶点能够聚合的邻接点的跳数,如 K = 2 K=2 K=2 的时候每个顶点可以最多根据其 2 跳邻接点的信息学习其自身的embedding表示
- N ( v ) N(v) N(v) 表示 v v v 的邻居结点
4.1.embedding的计算
结点 v v v 的embedding z v z_v zv 计算过程如下:
隐层向量初始化
h
v
0
=
x
v
,
v
∈
V
h^0_v = x_v, v \in V
hv0=xv,v∈V
层间传递
h
N
(
v
)
k
=
A
g
g
r
e
g
a
t
o
r
k
(
{
h
u
k
−
1
}
)
,
u
∈
N
(
v
)
,
h
v
k
=
σ
(
W
k
.
C
o
n
c
a
t
(
h
v
k
,
h
N
(
v
)
k
)
)
,
∀
v
∈
V
,
h_{N(v)}^k = Aggregator_k(\{h_u^{k - 1}\}) , u \in N(v), \\ h_v^k = \sigma(W^k.Concat(h_v^k, \; h_{N(v)}^k)), \\ \forall v \in V,
hN(v)k=Aggregatork({huk−1}),u∈N(v),hvk=σ(Wk.Concat(hvk,hN(v)k)),∀v∈V,
h v k = h v k ∣ ∣ h v k ∣ ∣ 2 , ∀ v ∈ V , h_v^k = \frac{h_v^k}{||h_v^k||_2}, \forall v \in V, hvk=∣∣hvk∣∣2hvk,∀v∈V,
z v = h v K , ∀ v ∈ V z_v = h_v^K, \forall v \in V zv=hvK,∀v∈V
其中:
- A g g r e g a t o r k Aggregator_k Aggregatork 表示网络第 k k k 层采用的可微分聚合函数
- 这里作者设置 K = ∣ V ∣ K = |V| K=∣V∣, 意思是每个结点都可以聚合到整个图所有结点的向量表示
- 出于对计算效率的考虑。这里作者定义 N ( v ) N(v) N(v) 并不是 v v v 的所有邻居结点,而是做了固定尺寸的采样。对每个顶点采样一定数量的邻居顶点作为待聚合信息的顶点。设采样数量为 k k k,若顶点邻居数少于 k k k,则采用有放回的抽样方法,直到采样出 k k k个顶点。若顶点邻居数大于 k k k,则采用无放回的抽样。
4.2.Loss Function
作者给出的是无监督损失,相邻节点有相似的embedding,无关节点的embedding有明显差别。
这里loss定义如下:
J
G
(
z
u
)
=
−
l
o
g
(
σ
(
z
u
T
.
z
v
)
)
−
Q
.
E
v
v
∼
P
n
(
v
)
l
o
g
(
σ
(
−
z
u
T
.
z
v
n
)
)
J_{\mathcal{G}}(z_u) = -log(\sigma(z_u^T.z_v)) - Q.E_{v_v \sim P_n(v)}log(\sigma(-z_u^T.z_{v_n}))
JG(zu)=−log(σ(zuT.zv))−Q.Evv∼Pn(v)log(σ(−zuT.zvn))
其中:
- z u , ∀ u ∈ V z_u,\forall u \in V zu,∀u∈V 表示图中任意节点的embedding
- v v v 表示在一个固定长度的随机游走上的结点 u u u 的邻居结点
- P n P_n Pn 为负采样分布
- Q Q Q 为负采样数量
4.3.聚合函数的选择
聚合函数(aggregator function) 的作用是把一个向量的集合转换成向量,,也就是聚合。和其他机器学习任务中的数据(如图像,文本等)不同,图中的节点是没有顺序的。
aggregator function有两个性质:
- 可微
- 对称
作者使用过的aggregator有
- Mean Aggregator(平均值)
- LSTM Aggregator:和mean aggregator相比,LSTM有更大的表达能力。但是LSTM不符合对称的性质,输入是有顺序的。所以把相邻节点的向量集合随机打乱顺序,然后作为LSTM的输入。
- Pooling aggregator:pooling做aggregator, 所有相邻节点的向量共享权重,先经过一个非线性全连接层,然后做max-pooling
A g g r e g a t o r k p o o l ( . ) = m a x ( { σ ( W p o o l . h u i k + b ) } ) , u i ∈ N ( v ) Aggregator_k^{pool}(.) = max(\{\sigma(W_{pool}.h_{u_i}^k + b)\}), u_i \in N(v) Aggregatorkpool(.)=max({σ(Wpool.huik+b)}),ui∈N(v)
实验结果表明,LSTM或者Pooling效果比较好
参考文献
[3] Velikovi P , Cucurull G , Casanova A , et al. Graph Attention Networks[J]. 2017.