如何理解 Graph Convolutional Network(GCN)?我主要参考知乎上这个回答。这个回答从热传播模型开始说起,介绍了图卷积网络和热传播模型的关系,说明了图卷积网络方法的一般思路。本博客重述了该回答的主要内容。
图卷积网络的本质“图中的每个结点无时无刻不因为邻居和更远的点的影响而在改变着自己的状态直到最终的平衡,关系越亲近的邻居影响越大。”结点状态的改变与GCN使用的Laplacian矩阵有关。“知道了Laplacian矩阵在干什么后,剩下的只是解法的不同——所谓的Fourier变换只是将问题从空域变换到频域去解,所以也有直接在空域解的(例如GraphSage)。”
热传播模型
连续欧氏空间的热传播模型
根据牛顿冷却定律,热量传递的速度正比与温度梯度。假设有一根均匀的铁棒,不同位置温度不一样,热量从铁棒的一端传播到另一端,现在我们刻画这个铁棒上面温度热传播随着时间变化的关系。首先,我们把问题简单化,假设铁棒是一个一维链条,链条上每个单元温度一致,热量在相邻的不同的单元之间传播,如下图
假设
T
1
T_1
T1温度低,
T
n
T_n
Tn温度高,热量从右边向左边传播。对于第i个单元,它接受第i+1个单元传来的热量,从把自身的热量传到温度较低的第i-1个单元,假设它当前的温度为
ϕ
i
\phi_i
ϕi,那么有:
d
ϕ
i
d
t
=
k
(
ϕ
i
+
1
−
ϕ
i
)
−
k
(
ϕ
i
−
ϕ
i
−
1
)
(1)
\frac{d\phi_i}{dt} = k(\phi_{i+1} - \phi_i) - k(\phi_i - \phi_{i-1}) \tag{1}
dtdϕi=k(ϕi+1−ϕi)−k(ϕi−ϕi−1)(1)
d
ϕ
i
d
t
\frac{d\phi_i}{dt}
dtdϕi是指第i个单元的温度相对于时间的变化梯度,直观上的理解是单位时间内第i个单元温度的变化量。k和单元的比热容、质量有关,是个常数。右边第一项是下一个单元向本单元的热量流入导致温度升高,第二项是本单元向上一个单元的热量流出导致温度降低。变换一下上式得到:
d
ϕ
i
d
t
−
k
[
(
ϕ
i
+
1
−
ϕ
i
)
−
(
ϕ
i
−
ϕ
i
−
1
)
]
=
0
(2)
\frac{d\phi_i}{dt} - k[(\phi_{i+1} - \phi_i) - (\phi_i - \phi_{i-1})] = 0 \tag{2}
dtdϕi−k[(ϕi+1−ϕi)−(ϕi−ϕi−1)]=0(2)
第二项是两个差分的差分,推广到连续空间,就是导数的导数,即二阶导数。
所以,可以推出铁棒这样的连续一维空间的热传导方程是:
∂
ϕ
∂
t
−
k
∂
2
ϕ
∂
x
2
=
0
(3)
\frac{\partial \phi}{\partial t} - k \frac{\partial^2 \phi}{\partial x^2} = 0 \tag{3}
∂t∂ϕ−k∂x2∂2ϕ=0(3)
x表示距离。同理,在高维的欧氏空间中,一阶导数就推广到梯度,二阶导数就是拉普拉斯算子:
∂
ϕ
∂
t
−
k
∇
2
ϕ
=
0
(4)
\frac{\partial \boldsymbol{\phi}}{\partial t} - k \boldsymbol{\nabla}^2 \boldsymbol{\phi} = \boldsymbol{0} \tag{4}
∂t∂ϕ−k∇2ϕ=0(4)
图上热传播模型
现在考虑热传播在在图上发生。图上的每个每个结点是一个单元,且这个单元只和与这个结点相连的单元发生热交换。
假设热量流动的速度依然满足牛顿冷却定律,研究任一结点i,它的温度随着时间的变化可以用下式来刻画:
d
ϕ
i
d
t
=
−
k
∑
j
A
i
j
(
ϕ
i
−
ϕ
j
)
(5)
\frac{d \phi_i}{d t} = -k \sum_j \boldsymbol{A}_{ij} (\phi_i - \phi_j) \tag{5}
dtdϕi=−kj∑Aij(ϕi−ϕj)(5)
其中
A
\boldsymbol{A}
A是这个图的邻接矩阵(Adjacency Matrix),对于
A
i
j
\boldsymbol{A}_{ij}
Aij,如果结点
i
i
i和
j
j
j连接,那么
A
i
j
=
1
\boldsymbol{A}_{ij}=1
Aij=1,否则
A
i
j
=
0
\boldsymbol{A}_{ij}=0
Aij=0。这里只考虑简单的情况:1、这张图是无向图,
A
i
j
=
A
j
i
\boldsymbol{A}_{ij}=\boldsymbol{A}_{ji}
Aij=Aji,
A
A
A是对称矩阵。2、结点没有自己到自己的回环边,即
A
\boldsymbol{A}
A的对角线上元素都是0。
对上式进行变形
d
ϕ
i
d
t
=
−
k
ϕ
i
∑
j
A
i
j
ϕ
i
−
k
∑
j
A
i
j
ϕ
j
=
−
k
[
ϕ
i
d
e
g
(
i
)
+
∑
j
A
i
j
ϕ
j
]
(6)
\begin{aligned} \frac{d \phi_i}{d t} & = -k \phi_i \sum_j \boldsymbol{A}_{ij} \phi_i - k \sum_j \boldsymbol{A}_{ij} \phi_j \\ & = -k [\phi_i deg(i) + \sum_j \boldsymbol{A}_{ij} \phi_j] \end{aligned} \tag{6}
dtdϕi=−kϕij∑Aijϕi−kj∑Aijϕj=−k[ϕideg(i)+j∑Aijϕj](6)
其中
d
e
g
(
i
)
deg(i)
deg(i)表示对结点i求度(degree),一个结点点的度被定义为这个结点有多少条边连接出去,很显然,根据邻接矩阵的定义,公式右边第一项的求和正是在计算结点
i
i
i的度。
再看右边括号里面的第二项,这可以认为是邻接矩阵的第 i i i行和所有结点的温度组成的向量做内积。
把所有结点的温度变化写出向量形式
[
d
ϕ
1
d
t
d
ϕ
2
d
t
⋯
d
ϕ
n
d
t
]
=
−
k
[
d
e
g
(
1
)
∗
ϕ
1
d
e
g
(
2
)
∗
ϕ
2
⋯
d
e
g
(
n
)
∗
ϕ
n
]
+
k
A
[
ϕ
1
ϕ
2
⋯
ϕ
n
]
(7)
\begin{bmatrix} \frac{d \phi_1}{d t} \\ \frac{d \phi_2}{d t} \\ \cdots \\ \frac{d \phi_n}{d t} \end{bmatrix} = -k \begin{bmatrix} deg(1) * \phi_1 \\ deg(2) * \phi_2 \\ \cdots \\ deg(n) * \phi_n \end{bmatrix} + k \boldsymbol{A} \begin{bmatrix} \phi_1 \\ \phi_2 \\ \cdots \\ \phi_n \end{bmatrix} \tag{7}
⎣⎢⎢⎡dtdϕ1dtdϕ2⋯dtdϕn⎦⎥⎥⎤=−k⎣⎢⎢⎡deg(1)∗ϕ1deg(2)∗ϕ2⋯deg(n)∗ϕn⎦⎥⎥⎤+kA⎣⎢⎢⎡ϕ1ϕ2⋯ϕn⎦⎥⎥⎤(7)
定义
ϕ
=
[
ϕ
1
,
ϕ
2
,
⋯
,
ϕ
n
]
T
\boldsymbol{\phi} = [\phi_1, \phi_2, \cdots, \phi_n]^T
ϕ=[ϕ1,ϕ2,⋯,ϕn]T,则
d
ϕ
d
t
=
−
k
D
ϕ
+
k
A
ϕ
=
−
k
(
D
−
A
)
ϕ
(9)
\frac{d \boldsymbol{\phi}}{d t} = -k\boldsymbol{D}\boldsymbol{\phi} + k \boldsymbol{A} \boldsymbol{\phi} = -k(\boldsymbol{D} - \boldsymbol{A}) \boldsymbol{\phi} \tag{9}
dtdϕ=−kDϕ+kAϕ=−k(D−A)ϕ(9)
其中
D
=
d
i
a
g
(
d
e
g
(
1
)
,
d
e
g
(
2
)
,
⋯
,
deg
(
n
)
)
\boldsymbol{D} = diag (deg(1), deg(2), \cdots, \deg(n))
D=diag(deg(1),deg(2),⋯,deg(n))称为度矩阵,只有对角线上有值,且这个值表示对应的结点的度的大小。继续整理,得到:
d
ϕ
d
t
+
k
L
ϕ
=
0
(10)
\frac{d \boldsymbol{\phi}}{d t} + k \boldsymbol{L} \boldsymbol{\phi} = \boldsymbol{0} \tag{10}
dtdϕ+kLϕ=0(10)
回顾在连续欧式空间的那个微分方程(公式4):
∂
ϕ
∂
t
−
k
∇
2
ϕ
=
0
\frac{\partial \boldsymbol{\phi}}{\partial t} - k \boldsymbol{\nabla}^2 \boldsymbol{\phi} = \boldsymbol{0}
∂t∂ϕ−k∇2ϕ=0
二者具有一样的形式。对比一下二者之间的关系:
- 相同点:刻画空间温度分布随时间的变化,且这个变化满足一个相同形式的微分方程。
- 不同点:前者刻画拓扑空间有限结点,用向量 ϕ \boldsymbol{\phi} ϕ刻画当前状态,单位时间状态的变化正比于线性变化 − L -\boldsymbol{L} −L算子。后者刻画欧氏空间的连续分布,单位时间状态变化正比于拉普拉斯算子 ∇ 2 \boldsymbol{\nabla}^2 ∇2。
这就是同一种变换、同一种关系在不同空间上面的体现。于是,可以把连续空间中的热传导推广到图上面。把两个公式等同起来,以矩阵形式体现的 L \boldsymbol{L} L就叫做拉普拉斯矩阵。这就是GCN中原始形式的拉普拉斯矩阵 L = D − A \boldsymbol{L}=\boldsymbol{D}-\boldsymbol{A} L=D−A。
GCN
现在问题已经很明朗了,只要你给定了一个空间,给定了空间中存在一种东西可以在这个空间上流动,两邻点之间流动的强度正比于它们之间的状态差异,那么何止是热量可以在这个空间流动,任何东西都可以!自然而然,假设在图中各个结点流动的东西不是热量,而是特征(Feature),而是消息(Message),那么问题自然而然就被推广到了GCN。所以GCN的实质是什么,是在一张Graph Network中特征(Feature)和消息(Message)中的流动和传播!这个传播最原始的形态就是状态的变化正比于相应空间(这里是Graph空间)拉普拉斯算子作用在当前的状态。抓住了这个实质,剩下的问题就是怎么去更加好的建模和解决这个问题。建模方面就衍生出了各种不同的算法,你可以在这个问题上面复杂化这个模型,不一定要遵从牛顿冷却定律,你可以引入核函数、引入神经网络等方法把模型建得更非线性更能刻画复杂关系。解决方面,因为很多问题在频域解决更加好算,你可以通过Fourier变换把空域问题转化为频域问题,解完了再变换回来,于是便有了所有Fourier变换中的那些故事。
本质上,这是一种Message Passing,是一种Induction,卷积、傅立叶都是表象和解法。
GCN迭代
结合公式10,结点的状态计算公式是
ϕ
=
ϕ
+
d
ϕ
d
t
=
ϕ
−
k
L
ϕ
(11)
\boldsymbol{\phi} = \boldsymbol{\phi} + \frac{d \boldsymbol{\phi}}{d t} = \boldsymbol{\phi} -k \boldsymbol{L} \boldsymbol{\phi} \tag{11}
ϕ=ϕ+dtdϕ=ϕ−kLϕ(11)
结点的状态会因为邻居的影响而不断改变。每个结点都给一个初始状态,随着时间的推移,图中的结点都会趋向于某个稳定的状态,整个系统最终稳定下来。当我们不知道结点的状态,并想获得结点的状态时,就可以用这种方法:首先为每个结点给定一个初始状态
ϕ
t
0
\boldsymbol{\phi}_{t_0}
ϕt0,带入公式11的右边,得到的
ϕ
t
1
\boldsymbol{\phi}_{t_1}
ϕt1继续带入公式11的右边,不断迭代,直到
ϕ
\boldsymbol{\phi}
ϕ不在发生变化,用公式表示:
ϕ
t
+
1
=
ϕ
t
−
k
L
ϕ
t
(12)
\boldsymbol{\phi}_{t+1} = \boldsymbol{\phi}_{t} -k \boldsymbol{L} \boldsymbol{\phi}_{t} \tag{12}
ϕt+1=ϕt−kLϕt(12)
该方法是求公式11关于 ϕ \boldsymbol{\phi} ϕ的解的一种解决方法。如果学习过PageRank算法,可以发现PageRank的解法和该方法是一样的。
机器学习中,时间是离散的,我们可以逐步更新结点的状态。右边用拉普拉斯算子作用一次到全局的状态上,就能把状态更新一步!
实际解决的过程中,可以发挥机器学习搬砖工懂得举一反三的优良精神,首先,不一定要全局操作,我们可以batchify操作一部分结点,大家轮着来,其次,我们可以只考察这个点的一阶和二阶邻居对当前点作Message Passing,这个思想就是对拉普拉斯算子作特征分解,然后只取低阶的向量,因为矩阵的谱上面能量一般具有长尾效应,头几个特征值dominate几乎所有能量。
Laplacian加和性
Laplacian矩阵/算子不仅表现的是一种二阶导数的运算,另一方面,它表现了一种加和性,这个从图上热/消息传播方程最原始的形态就能一目了然:
d
ϕ
i
d
t
=
k
∑
j
A
i
j
(
ϕ
j
−
ϕ
i
)
\frac{d \phi_i}{d t} = k \sum_j \boldsymbol{A}_{ij} (\phi_j - \phi_i)
dtdϕi=kj∑Aij(ϕj−ϕi)
可见,每个结点每个时刻的状态变化,就是所有邻居对本结点差异的总和,也就是所有的邻居把message pass过来,然后再Aggregate一下,这正是GraphSage等空域算法的关键步骤Aggregate思想的滥觞。
在实际建模中,我们的Aggregate不一定是加和,作为一个熟练的机器学习搬砖工,我们懂得可以把Aggregate推广成各种操作例如Sum Pooling,例如LSTM,例如Attention,以求刷效果,发paper 😃