对于初学者来说,GNN还是好理解的,但是对于GCN来说,我刚开始根本不理解其中的卷积从何而来!! 这篇博文分为两部分,第一部分是我对GNN的理解,第二部分是我个人对GCN中卷积的理解。
看了B站上up主小淡鸡的视频(视频:传送门)收益匪浅,我认为,GNN的目的就是怎样聚合各节点之间的信息。
以上图 A A A节点为例, A A A的邻居是节点 B , C , D B, C, D B,C,D, 经过一次聚合后:聚合到的信息为:
邻居信息 N = a × ( 2 , 2 , 2 , 2 , 2 ) + b × ( 3 , 3 , 3 , 3 , 3 ) + c × ( 4 , 4 , 4 , 4 , 4 ) N = a \times (2,2,2,2,2) + b \times (3,3,3,3,3) + c \times (4,4,4,4,4) N=a×(2,2,2,2,2)+b×(3,3,3,3,3)+c×(4,4,4,4,4)
这里 a , b , c a,b,c a,b,c都是权重参数
A = σ ( W ( ( 1 , 1 , 1 , 1 , 1 ) ) + α × N ) A = \sigma (W((1,1,1,1,1))+ \alpha \times N) A=σ(W((1,1,1,1,1))+α×N)
σ \sigma σ是激活函数(relu,sigmoid 等)这里有点像普通神经网络的线性层。
W W W是模型需要学习的参数。
图经过一次聚合后:
A A A有节点 B , C , D B, C, D B,C,D的信息
B B B有节点 A , C A, C A,C的信息
C C C有节点 A , B , D , E A, B, D, E A,B,D,E的信息
D D D有节点 A , C A, C A,C的信息
E E E有节点 C C C的信息
第二次聚合,再以 A A A节点为例,此时 A A A聚合 C C C的时候, C C C中有上一层聚合到的 E E E的信息,所以这时 A A A获得了二阶邻居 E E E的特征。
GCN的卷积意义难以理解,我接下来会用图片(image)的卷积来讲解。
首先看一下公式: H ( l + 1 ) = σ ( D ~ − 1 / 2 A ~ D ~ 1 / 2 H ( l ) W ( l ) ) H^{(l+1)} = \sigma (\tilde{D}^{-1/2} \tilde{A} \tilde{D}^{1/2} H^{(l)} W^{(l)}) H(l+1)=σ(D~−1/2A~D~1/2H(l)W(l))
这里 A A A是邻接矩阵, D ~ \tilde{D} D~是 A ~ \tilde{A} A~的行求和所组成的对角阵, 也就是节点的度矩阵。
先看这个图
该图的邻接矩阵 A A A:
[ 0 1 1 1 0 0 1 0 0 ] \begin{bmatrix} 0&1&1\\ 1&0&0\\ 1&0&0 \end{bmatrix} ⎣⎡011100100⎦⎤
节点特征值 H ( l ) H^{(l)} H(l)为:
{ [ 0.1 0.4 ] [ 0.2 0.3 ] [ 0.1 0.2 ] } \begin{Bmatrix} [0.1&0.4]\\ [0.2&0.3]\\ [0.1&0.2] \end{Bmatrix} ⎩⎨⎧[0.1[0.2[0.10.4]0.3]0.2]⎭⎬⎫
我们首先看一下 A H ( l ) A H^{(l)} AH(l)是啥:
[ 0 1 1 1 0 0 1 0 0 ] ⋅ [ 0.1 0.4 0.2 0.3 0.1 0.2 ] = [ 0.2 + 0.1 0.3 + 0.2 0.1 0.4 0.1 0.4 ] \begin{bmatrix} 0&1&1\\ 1&0&0\\ 1&0&0 \end{bmatrix} · \begin{bmatrix} 0.1&0.4\\ 0.2&0.3\\ 0.1&0.2 \end{bmatrix} = \begin{bmatrix} 0.2+0.1&0.3+0.2\\ 0.1&0.4\\ 0.1&0.4 \end{bmatrix} ⎣⎡011100100⎦⎤⋅⎣⎡0.10.20.10.40.30.2⎦⎤=⎣⎡0.2+0.10.10.10.3+0.20.40.4⎦⎤
可以看到这做到了汇聚(上一节提到的GNN)的作用
再加上自己的特征值,也就是 A ~ H ( l ) \tilde{A} H^{(l)} A~H(l) (这里 A ~ = A + I \tilde{A} = A + I A~=A+I):
[ 1 1 1 1 1 0 1 0 1 ] ⋅ [ 0.1 0.4 0.2 0.3 0.1 0.2 ] = [ 0.1 + 0.2 + 0.1 0.4 + 0.3 + 0.2 0.1 + 0.2 0.4 + 0.3 0.1 + 0.1 0.4 + 0.2 ] \begin{bmatrix} 1&1&1\\ 1&1&0\\ 1&0&1 \end{bmatrix} · \begin{bmatrix} 0.1&0.4\\ 0.2&0.3\\ 0.1&0.2 \end{bmatrix} = \begin{bmatrix} 0.1+0.2+0.1&0.4+0.3+0.2\\ 0.1+0.2&0.4+0.3\\ 0.1+0.1&0.4+0.2 \end{bmatrix} ⎣⎡111110101⎦⎤⋅⎣⎡0.10.20.10.40.30.2⎦⎤=⎣⎡0.1+0.2+0.10.1+0.20.1+0.10.4+0.3+0.20.4+0.30.4+0.2⎦⎤
这些矩阵乘法从数学上实现了个节点之间的聚合
Note:公式: H ( l + 1 ) = σ ( D ~ − 1 / 2 A ~ D ~ 1 / 2 H ( l ) W ( l ) ) H^{(l+1)} = \sigma (\tilde{D}^{-1/2} \tilde{A} \tilde{D}^{1/2} H^{(l)} W^{(l)}) H(l+1)=σ(D~−1/2A~D~1/2H(l)W(l))中的 D ~ − 1 / 2 \tilde{D}^{-1/2} D~−1/2的作用其实是为了归一化
首先, 以两层的特征提取器举例:
Z = f ( X , A ) = s o f t m a x ( A ^ ⋅ R e L U ( A ^ X ⋅ W ( 0 ) ) ⋅ W ( 1 ) ) ) Z = f(X, A) = softmax(\hat{A} · ReLU(\hat{A}X · W^{(0)}) · W^{(1)})) Z=f(X,A)=softmax(A^⋅ReLU(A^X⋅W(0))⋅W(1)))
这里 A ^ = D ~ − 1 / 2 A ~ D ~ 1 / 2 \hat{A} = \tilde{D}^{-1/2} \tilde{A} \tilde{D}^{1/2} A^=D~−1/2A~D~1/2, X X X是特征向量, W W W是要学习的参数。
我们可以这么理解,如下图,图(graph) 的分类可以近似成 图片(image) 的像素级分类(即对每个像素(节点)进行分类)
好, 现在根据形状参数 A ^ \hat{A} A^ 给 图片 I ∈ R N × C I \in \R^{N \times C} I∈RN×C 做卷积(这里图片有N个像素),得到特征图 H ( 2 ) ∈ R N × F H^{(2)} \in \R^{N \times F} H(2)∈RN×F,现在特征图的每个像素的特征值维度是 R 1 × F \R^{1 \times F} R1×F,因为是像素级分类,我们就可以让每个像素进入分类器(全连接层)了!这样像素级(GCN)分类就做完了.