图神经网络(GNN)
转载: https://zhuanlan.zhihu.com/p/89503068
目前有用的分类:图卷积神经网络(GCN)、图注意网络(GAT)
重点介绍:GCN
图的定义:
对于图 G = ( V , E ) , V G=(V,E), V G=(V,E),V为节点的集合, E E E 为边的集合,对于每个节点 i i i , 均有其特征 x i x_i xi,可以用矩阵 X N ∗ D X_{N∗D} XN∗D表示。其中 N N N表示节点数, D 表示每个节点的特征维度。
图中的每个结点无时无刻不因为邻居和更远的点的影响而在改变着自己的状态直到最终的平衡,关系越亲近的邻居影响越大。
图相关矩阵的定义
度矩阵D、邻接矩阵A、拉普拉斯矩阵L
以无向图且边无权重举例:
度矩阵 D D D 只有对角线上有值,为对应节点的度,其余为0;邻接矩阵 A A A只有在有边连接的两个节点之间为1,其余地方为0;拉普拉斯矩阵 L 为 D−A 。
图卷积通式
H l + 1 = f ( H l , A ) H^{l+1}=f(H^l,A) Hl+1=f(Hl,A)
H 0 = X H^0=X H0=X为第一层输入, X ∈ R R ∗ D X \in R^{R*D} X∈RR∗D, N N N为图的节点个数, D D D 为节点维度, A A A为邻接矩阵
实现1
H l + 1 = σ ( A H l W l ) H^{l+1} = \sigma(AH^lW^l) Hl+1=σ(AHlWl)
其中 W l W^l Wl为第 l l l层的权重参数矩阵, σ ( ⋅ ) \sigma(\cdot) σ(⋅)为非线性激活函数,如RELU。
某节点的邻居节点的特征相加。这样多层隐含层叠加,能利用多层邻居的信息。
但这样存在两个问题:
- 没有考虑节点自身对自己的影响;
- 邻接矩阵A没有被规范化,这在提取图特征时可能存在问题,比如邻居节点多的节点倾向于有更大的影响力。
实现2
H l + 1 = σ ( L H l W l ) H^{l+1} = \sigma(LH^lW^l) Hl+1=σ(LHlWl)
拉普拉斯矩阵 L = D − A L=D-A L=D−A,针对上述问题1 进行了改进
- 引入了度矩阵,从而解决了没有考虑自身节点信息自传递的问题
实现3
H l + 1 = σ ( D − 1 2 A ^ D − 1 2 H l W l ) H^{l+1} = \sigma(D^{-\frac 12}\hat{A}D^{-\frac12}H^lW^l) Hl+1=σ(D−21A^D−21HlWl)
对这里的拉普拉斯矩阵,
L
s
y
m
=
D
−
1
2
A
^
D
−
1
2
=
D
−
1
2
D
−
A
D
−
1
2
=
I
n
−
D
−
1
2
A
D
−
1
2
L^{sym}=D^{-\frac 12}\hat{A}D^{-\frac12}=D^{-\frac 12}{D-A}D^{-\frac 12}=I_n-D^{-\frac 12}AD^{-\frac 12}
Lsym=D−21A^D−21=D−21D−AD−21=In−D−21AD−21
改进:
- 引入自身度量矩阵,解决自传递问题
- 对邻接矩阵的归一化操作,(对邻接矩阵A两遍×开方逆得到)具体到每一个节点对 i , j i ,j i,j,元素计算方式如下:
L i , j s y m = { 1 , if i = j and deg( v i )!=0 − 1 d e g ( v i ) d e g ( v j ) , if i ! = j and v i is adjacent to v j 0 , otherwise L^{sym}_{i,j}= \begin{cases} 1, & \text{if $i=j$ and deg($v_i$)!=0} \\ -\frac{1}{\sqrt{deg(v_i)deg(v_j)}}, & \text{if $i!=j$ and $v_i$ is adjacent to $v_j$} \\ 0, & \text{otherwise} \\ \end{cases} Li,jsym=⎩ ⎨ ⎧1,−deg(vi)deg(vj)1,0,if i=j and deg(vi)!=0if i!=j and vi is adjacent to vjotherwise
其中, d e g ( v i ) , d e g ( v j ) deg(v_i),deg(v_j) deg(vi),deg(vj)分别是节点 i , j i,j i,j的度,即度矩阵在该点的值。
至于为何这样做可以归一化,对于单个节点运算来说,做归一化就是除以其节点的度,这样每一条邻接边信息传递的值就被规范化了,不会因为某一个节点有10条边而另一个只有1条边导致前者的影响力比后者大,因为做完归一化前者的权重只有0.1了,从单个节点上升到二维矩阵的运算,就是对矩阵求逆了,乘以矩阵的逆的本质,就是做矩阵除法完成归一化。但左右分别乘以节点 i , j i,j i,j度的开方,就是考虑一条边的两边的点的度。
实现3虽是主流的实现方式,但还有其他的拉普拉斯矩阵,具体实践时可以都试试。