注:本人理解可能有误,各位按需取舍
给定图
G
(
V
,
E
)
G(V, E)
G(V,E),
V
V
V表示图中的所有节点,假设图中有
N
N
N个节点,那么图信号就是一种描述
V
→
R
V\rightarrow R
V→R的映射,其中
X
X
X表示成向量的形式,即
X
=
[
x
1
,
x
2
,
.
.
.
.
,
x
N
]
T
X=[x_1, x_2, ...., x_N]^T
X=[x1,x2,....,xN]T,其中
x
i
x_i
xi表示的是
v
i
v_i
vi的特征,而这个特征可能是多个维度的,而有几个维度也就是他有几个通道,说白了就是之前那些文章里讲的顶点特征维度数和通道数是同一个东西,而每个维度上值的大小,我们就管他叫做这个通道的信号强度。
我们举个例子:假设存在六个有不同颜色的节点,每个节点有
(
R
,
G
,
B
)
(R,G,B)
(R,G,B)三种颜色通道,这六个点以某种方式连接,如下图所示:
上面的图对应着的节点的向量形式如下,其中每一行的三个值就是每个节点的
(
R
,
G
,
B
)
(R,G,B)
(R,G,B)值,也就是每个节点三个颜色通道的强度,具体的值如下式, 此时,我们同时知道了小明对
{
x
1
,
x
3
,
x
4
,
x
5
}
\{x_1, x_3, x_4, x_5\}
{x1,x3,x4,x5}的喜好,我们记为
{
y
1
,
y
3
,
y
4
,
y
5
}
\{y_1, y_3, y_4, y_5\}
{y1,y3,y4,y5},而我们接下来的目的就是要求出未知的
y
2
,
y
6
y_2, y_6
y2,y6,这个问题就变成了一个在图结构上使用聚类来进行分类的算法了。
X
=
{
x
1
x
2
x
3
x
4
x
5
x
6
}
=
{
73
191
112
189
32
232
102
148
162
101
104
163
214
233
31
56
208
103
}
Y
=
{
1
U
n
k
n
o
w
1
0
0
U
n
k
n
o
w
}
(公式1)
X= \left\{ \begin{matrix} x_1 \\ x_2 \\ x_3 \\ x_4 \\ x_5 \\ x_6 \\ \end{matrix} \right\} = \left\{ \begin{matrix} 73 & 191 & 112 \\ 189 & 32 & 232 \\ 102 & 148 & 162 \\ 101 & 104 & 163 \\ 214 & 233 & 31 \\ 56 & 208 & 103 \\ \end{matrix} \right\} \quad\quad Y=\left\{ \begin{matrix} 1 \\ Unknow \\ 1 \\ 0 \\ 0 \\ Unknow \\ \end{matrix} \right\} \tag{公式1}
X=⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧x1x2x3x4x5x6⎭⎪⎪⎪⎪⎪⎪⎬⎪⎪⎪⎪⎪⎪⎫=⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧73189102101214561913214810423320811223216216331103⎭⎪⎪⎪⎪⎪⎪⎬⎪⎪⎪⎪⎪⎪⎫Y=⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧1Unknow100Unknow⎭⎪⎪⎪⎪⎪⎪⎬⎪⎪⎪⎪⎪⎪⎫(公式1)
这时候,我们已经通过上面的图1知道了所有节点之间的连接关系。
对此,我们可以使用邻接矩阵
A
A
A来表示所有节点之间的连接关系,其中图1中的图的邻接矩
A
A
A如公式2,而度矩阵
D
D
D为公式3:
A
=
{
0
1
1
0
0
0
1
0
1
1
1
0
1
1
0
0
1
1
0
1
0
0
1
0
0
1
1
1
0
1
0
0
1
0
1
0
}
(公式2)
A = \left\{ \begin{matrix} 0 & 1 & 1 & 0 & 0 & 0 \\ 1 & 0 & 1 & 1 & 1 & 0 \\ 1 & 1 & 0 & 0 & 1 & 1 \\ 0 & 1 & 0 & 0 & 1 & 0 \\ 0 & 1 & 1 & 1 & 0 & 1 \\ 0 & 0 & 1 & 0 & 1 & 0 \\ \end{matrix} \right\} \tag{公式2}
A=⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧011000101110110011010010011101001010⎭⎪⎪⎪⎪⎪⎪⎬⎪⎪⎪⎪⎪⎪⎫(公式2)
D = { 2 0 0 0 0 0 0 4 0 0 0 0 0 0 4 0 0 0 0 0 0 2 0 0 0 0 0 0 4 0 0 0 0 0 0 2 } (公式3) D = \left\{ \begin{matrix} 2 & 0 & 0 & 0 & 0 & 0 \\ 0 & 4 & 0 & 0 & 0 & 0 \\ 0 & 0 & 4 & 0 & 0 & 0 \\ 0 & 0 & 0 & 2 & 0 & 0 \\ 0 & 0 & 0 & 0 & 4 & 0 \\ 0 & 0 & 0 & 0 & 0 & 2 \\ \end{matrix} \right\} \tag{公式3} D=⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧200000040000004000000200000040000002⎭⎪⎪⎪⎪⎪⎪⎬⎪⎪⎪⎪⎪⎪⎫(公式3)
我们知道在计算图像边缘的时候,我们往往会使用一个拉普拉斯算子对图像做卷积来求出某个像素是否是边缘点,拉普拉斯算子的形式如下式所示
{
0
1
0
1
−
4
1
0
1
0
}
\left\{ \begin{matrix} 0 & 1 & 0\\ 1 & -4 & 1\\ 0 & 1 & 0\\ \end{matrix} \right\}
⎩⎨⎧0101−41010⎭⎬⎫
我们可以看出,对于边缘检测问题,拉普拉斯算子本质上就是通过收集了所有自由度上的微小变化之后所获得的一个增益。在和图片卷积之后每个像素位置的值就是以这个像素为中心之后,周边像素和他之间的差异,这个值如果越大,也就表明这个像素越有可能就是边缘点,这时候,我们如果用启发式的思想去思考,是不是这样的方法同样也能被用在聚类当中,毕竟,对于一个聚类问题而言,我们要做的就是在他的向量空间中找到一个划分用的超平面,而图的结构则帮我们更好了约束了两组特征之间的关系,把没有关系但相近的特征全部都用图的形式给剔除掉了。
接下来,我们就尝试将拉普拉斯算子用到图结构上,最终的结果就是每个节点的特征都直接的更新为了其和邻居节点之间的差,当然,这里的差是每个维度上单独计算的。
就拿上面公式1中 X X X的第一个维度举例子吧
更 新 后 x 1 在 第 一 个 维 度 上 的 值 = ( 73 − 189 ) + ( 73 − 102 ) = 2 ∗ 73 − 1 ∗ 189 − 1 ∗ 102 − 0 ∗ 101 − 0 ∗ 214 − 0 ∗ 56 更新后x_1在第一个维度上的值=(73-189) + (73-102) = 2 * 73 - 1 * 189 - 1 * 102 - 0 * 101 - 0 * 214 - 0 * 56 更新后x1在第一个维度上的值=(73−189)+(73−102)=2∗73−1∗189−1∗102−0∗101−0∗214−0∗56
我们弄成向量的形式,就是下面的形式
{
2
−
1
−
1
0
0
0
}
∗
{
73
189
102
101
214
56
}
\left\{ \begin{matrix} 2 & -1 & -1 & 0 & 0 & 0 \end{matrix} \right\} * \left\{ \begin{matrix} 73 \\ 189 \\ 102 \\ 101 \\ 214 \\ 56 \\ \end{matrix} \right\}
{2−1−1000}∗⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧7318910210121456⎭⎪⎪⎪⎪⎪⎪⎬⎪⎪⎪⎪⎪⎪⎫
我们可以看出左边就是当前节点的度数乘以他在第一个维度上的值减去其他相邻节点在第一个维度上的值,设矩阵
M
M
M的第
i
i
i行第
j
j
j列的元素是
M
i
j
M_{i}^{j}
Mij,其中第
i
i
i行的向量为
M
i
M_i
Mi,如果是列,那么就是
M
j
M^j
Mj。那么顶点1的第一维在更新之后就是
(
D
1
−
A
1
)
X
1
(D_1-A_1)X^1
(D1−A1)X1,那么
(
D
1
−
A
1
)
X
(D_1-A_1)X
(D1−A1)X就是每一维都更新后的结果,是1行3列,
(
D
−
A
)
X
(D-A)X
(D−A)X就是每个点每一维度都更新后的结果,是6行3列,最终结果如下。
{
2
−
1
−
1
0
0
0
−
1
4
−
1
−
1
−
1
0
−
1
−
1
4
0
−
1
−
1
0
−
1
0
2
−
1
0
0
−
1
−
1
−
1
4
−
1
0
0
−
1
0
−
1
2
}
{
73
191
112
189
32
232
102
148
162
101
104
163
214
233
31
56
208
103
}
=
{
−
145
202
−
170
266
−
548
460
−
124
−
72
170
−
201
−
57
63
408
440
−
536
−
204
35
13
}
\left\{ \begin{matrix} 2 & -1 & -1 & 0 & 0 & 0 \\ -1 & 4 & -1 & -1 & -1 & 0 \\ -1 & -1 & 4 & 0 & -1 & -1 \\ 0 & -1 & 0 & 2 & -1 & 0 \\ 0 & -1 & -1 & -1 & 4 & -1 \\ 0 & 0 & -1 & 0 & -1 & 2 \\ \end{matrix} \right\} \left\{ \begin{matrix} 73 & 191 & 112 \\ 189 & 32 & 232 \\ 102 & 148 & 162 \\ 101 & 104 & 163 \\ 214 & 233 & 31 \\ 56 & 208 & 103 \\ \end{matrix} \right\} = \left\{ \begin{matrix} -145 & 202 & -170 \\ 266 & -548 & 460 \\ -124 & -72 & 170 \\ -201 & -57 & 63 \\ 408 & 440 & -536 \\ -204 & 35 & 13 \\ \end{matrix} \right\}
⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧2−1−1000−14−1−1−10−1−140−1−10−102−100−1−1−14−100−10−12⎭⎪⎪⎪⎪⎪⎪⎬⎪⎪⎪⎪⎪⎪⎫⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧73189102101214561913214810423320811223216216331103⎭⎪⎪⎪⎪⎪⎪⎬⎪⎪⎪⎪⎪⎪⎫=⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧−145266−124−201408−204202−548−72−5744035−17046017063−53613⎭⎪⎪⎪⎪⎪⎪⎬⎪⎪⎪⎪⎪⎪⎫
我们管
D
−
A
D-A
D−A叫做拉普拉斯矩阵
L
L
L,而关于拉普拉斯矩阵细节的内容,我们先讲到这里,因为再讲下去就会和滤波有关了,我们先回过头来看一下上面的聚类需要怎么做,也就是不再涉及到傅里叶变换的基础上怎么去完成这个分类任务。
对于一般的线性分类,我们往往会采用被监督的几个节点,比如上面的 { x 1 , x 3 , x 4 , x 5 } \{x_1, x_3, x_4, x_5\} {x1,x3,x4,x5}来进行训练,在图神经网络中,我们所采用的形式也是一样的,我们首先需要进行图上每个节点信息的聚合,方式也很简单就是: x ( 0 ) = X , x ( 1 ) = L x ( 0 ) , x ( 2 ) = L x ( 1 ) , . . . , x ( K ) = L x ( K − 1 ) x^{(0)}=X, x^{(1)}=Lx^{(0)}, x^{(2)}=Lx^{(1)},...,x^{(K)}=Lx^{(K-1)} x(0)=X,x(1)=Lx(0),x(2)=Lx(1),...,x(K)=Lx(K−1), 其中 K K K是 L L L的特征向量数,为什么是这个后面滤波讲,反正就是这么多数目。
然后我们设定一个向量 { h 0 , h 1 , h 2 , . . . , h k } \{h_0, h_1, h_2, ..., h_k\} {h0,h1,h2,...,hk}。
我们知道 x ( K ) x^{(K)} x(K)就是聚合了 K K K次的 X X X, x ( k ) x^{(k)} x(k)的维度相对 X X X没有丝毫变化,此时我们简单粗暴的设输出 y = σ ( h 0 x ( 0 ) + h 1 x ( 1 ) + h 2 x ( 2 ) + . . . + h K x ( K ) ) y = \sigma (h_0x^{(0)}+h_1x^{(1)}+h_2x^{(2)}+...+h_Kx^{(K)}) y=σ(h0x(0)+h1x(1)+h2x(2)+...+hKx(K))就是每个节点 的输出结果。
y = σ ( W ( h 0 x ( 0 ) + h 1 x ( 1 ) + h 2 x ( 2 ) + . . . + h K x ( K ) ) T ) y = \sigma (W(h_0x^{(0)}+h_1x^{(1)}+h_2x^{(2)}+...+h_Kx^{(K)})^T) y=σ(W(h0x(0)+h1x(1)+h2x(2)+...+hKx(K))T)
有了上面这条公式之后,我们同时也拥有了
{
x
1
,
x
3
,
x
4
,
x
5
}
\{x_1, x_3, x_4, x_5\}
{x1,x3,x4,x5}四个有label的特征向量,接着,我们就可以直接用梯度下降来训练
{
h
0
,
h
1
,
h
2
,
.
.
.
,
h
k
}
\{h_0, h_1, h_2, ..., h_k\}
{h0,h1,h2,...,hk}这个向量了,当然还有一个
(
1
∗
3
)
(1*3)
(1∗3)的矩阵,最后,你会发现,这时候
{
x
2
,
x
6
}
\{x_2, x_6\}
{x2,x6}由于在计算上式的时候已经被代进去了,
{
y
2
,
y
6
}
\{y_2, y_6\}
{y2,y6}也随着训练的结束直接得了出来,这时候,你可能要问了,那这个向量在算的时候
{
y
2
,
y
6
}
\{y_2, y_6\}
{y2,y6}都出来了,那训练的时候,他们的Loss怎么处理啊?这个啊,很简单,你们在训练的时候也加个权重,把
{
y
2
,
y
6
}
\{y_2, y_6\}
{y2,y6}的输出后面乘个0,其他输出后面乘个1,不就可以直接算出合理的Loss了嘛?最后在训练好了,再把
{
y
2
,
y
6
}
\{y_2, y_6\}
{y2,y6}输出来就可以了,如下式:
M
=
y
⊙
{
1
0
1
1
1
0
}
−
{
1
0
1
0
0
0
}
L
o
s
s
=
M
T
M
M = y\odot\left\{ \begin{matrix} 1 & 0 & 1 & 1 & 1 & 0 \end{matrix} \right\} - \left\{ \begin{matrix} 1 & 0 & 1 & 0 & 0 & 0 \end{matrix} \right\} \\ Loss = M^TM
M=y⊙{101110}−{101000}Loss=MTM
这样一来,损失函数就出来了,我们可以轻松的了解GNN的基本原理了,如果大家需要,我以后讲下带滤波的怎么做。