图神经网络
引言
深度学习一直都是被几大经典模型给统治着,如CNN、RNN等等,CNN在计算机视觉有着优异的性能,RNN在自然语言处理有着很好的效果,但是因为我们发现了很多CNN、RNN无法解决或者效果不好的问题——图结构的数据,所以图神经网络应运而生。
我们做图像识别,对象是图片,是一个二维的结构,于是人们发明了CNN这种神奇的模型来提取图片的特征。CNN的核心在于它的kernel,kernel是一个个小窗口,在图片上平移,通过卷积的方式来提取特征。这里的关键在于图片结构上的平移不变性:一个小窗口无论移动到图片的哪一个位置,其内部的结构都是一模一样的,因此CNN可以实现参数共享。这就是CNN的精髓所在。而RNN系列,它的对象是自然语言这样的序列信息,是一个一维的结构,RNN就是专门针对这些序列的结构而设计的,通过各种门的操作,使得序列前后的信息互相影响,从而很好地捕捉序列的特征。
上面讲的图片或者语言,都属于欧式空间的数据,因此才有维度的概念,欧式空间的数据的特点就是结构很规则。但是现实生活中,其实有很多很多不规则的数据结构,典型的就是图结构,或称拓扑结构,如社交网络、化学分子结构、知识图谱等等;
图卷积神经网络,实际上跟CNN的作用一样,就是一个特征提取器,只不过它的对象是图数据。它精妙地设计了一种从图数据中提取特征的方法,从而让我们可以使用这些特征去对图数据进行节点分类(node classification)、图分类(graph classification)、边预测(link prediction),还可以顺便得到图的嵌入表示(graph embedding)
关于图的卷积我们有两种方法进行对图数据结构进行卷积,一种是谱域卷积,一种是空间域卷积。
谱域卷积
其实谱域卷积和空间域卷积其实都在干一件事情,如何定义卷积核,我们在CNN下,一个像素点相邻的像素点是固定的,这样我们就可以通过移动卷积核,来进行抽取特征。而我们的谱域卷积就是把图的数据结构通过傅里叶变换转换到了谱域,并对其进行卷积。
拉普拉斯矩阵
普通拉普拉斯矩阵:
L
=
D
?
A
L=D-A
L=D?A
D
D
D是矩阵的度矩阵(有向图为入度矩阵),
A
A
A是矩阵的邻接矩阵
元素定义如下:
L
i
,
j
=
{
diag
?
(
v
i
)
i
=
j
?
1
i
≠
j
0
?otherwise?
L_{i, j}= \begin{cases}\operatorname{diag}\left(v_{i}\right) & i=j \\ -1 & i \neq j \\ 0 & \text { otherwise }\end{cases}
Li,j?=??????diag(vi?)?10?i=ji?=j?otherwise?? 归一化拉普拉斯矩阵:
I
I
I为单位矩阵
L
s
y
s
=
D
?
1
/
2
L
D
?
1
/
2
=
I
?
D
?
1
/
2
A
D
?
1
/
2
L^{s y s}=D^{-1 / 2} L D^{-1 / 2}=I-D^{-1 / 2} A D^{-1 / 2}
Lsys=D?1/2LD?1/2=I?D?1/2AD?1/2 元素定义如下:
L
i
,
j
s
y
s
=
{
1
i
=
j
?and?
diag
?
(
v
i
)
≠
0
?
1
diag
?
(
v
i
)
diag
?
(
v
j
)
i
≠
j
0
?otherwise?
L_{i, j}^{s y s}= \begin{cases}1 & i=j \text { and } \operatorname{diag}\left(v_{i}\right) \neq 0 \\ -\frac{1}{\sqrt{\operatorname{diag}\left(v_{i}\right) \operatorname{diag}\left(v_{j}\right)}} & i \neq j \\ 0 & \text { otherwise }\end{cases}
Li,jsys?=????????1?diag(vi?)diag(vj?)
?1?0?i=j?and?diag(vi?)?=0i?=j?otherwise??
傅里叶变换
上述提到了我们在谱域上卷积,实际上是用了傅里叶变换将图转换到谱域,而傅里叶变换其实也是同理,它是将时域转换到频域。
任意一个周期函数可以由若干个正交函数(由
s
i
n
,
c
o
s
sin,cos
sin,cos)的线性组合构成,写出傅里叶级数的形式如下:
f
(
x
)
=
a
0
+
∑
n
=
1
∞
(
a
n
cos
?
(
2
π
n
T
x
)
+
b
n
sin
?
(
2
π
n
T
x
)
)
,
a
0
∈
R
f(x)=a_{0}+\sum_{n=1}^{\infty}\left(a_{n} \cos \left(\frac{2 \pi n}{T} x\right)+b_{n} \sin \left(\frac{2 \pi n}{T} x\right)\right), a_{0} \in \mathbb{R}
f(x)=a0?+n=1∑∞?(an?cos(T2πn?x)+bn?sin(T2πn?x)),a0?∈R 利用欧拉公式
e
i
x
=
cos
?
x
+
i
sin
?
x
e^{ix}=\cos x+i\sin x
eix=cosx+isinx,可以将
cos
?
,
sin
?
\cos,\sin
cos,sin表示成如下:
cos
?
x
=
e
i
x
+
e
?
i
x
2
,
sin
?
x
=
e
i
x
?
e
?
i
x
2
i
\cos x=\frac{e^{i x}+e^{-i x}}{2}, \sin x=\frac{e^{i x}-e^{-i x}}{2 i}
cosx=2eix+e?ix?,sinx=2ieix?e?ix? 所以,任意周期函数可以以
e
i
w
t
e^{iwt}
eiwt为基函数用傅里叶级数的指数形式表示。即,对于一个周期函数
f
(
x
)
f(x)
f(x)以傅里叶级数的指数形式表示为:
f
(
x
)
=
∑
n
=
?
∞
+
∞
=
c
n
?
e
2
π
n
x
i
T
f(x)=\sum_{n={-\infty}}^{+\infty}=c_{n} \cdot e^{\frac{2 \pi nx i}{T}}
f(x)=n=?∞∑+∞?=cn??eT2πnxi? 上述的
e
2
π
i
x
T
e^{\frac{2\pi ix}{T}}
eT2πix?其实也就是频率,就是我们的谱,而在我们的图上的卷积,时域信号就变成了我们的图上的信号
图上的信号
每个节点与
d
d
d个特征相关,故图上的信号矩阵为
X
∈
R
d
×
n
X \in R^{d \times n}
X∈Rd×n,
X
X
X的每一列是定义在节点上的信号
Spectral Network
在处理Graph时,用到的是傅里叶变换的离散形式。由于拉普拉斯矩阵进行谱分解以后,可以得到n个线性无关的特征向量,构成空间中的一组正交基,如下:
L
=
U
Λ
U
T
L=U \Lambda U^T
L=UΛUT 因此归一化拉普拉斯矩阵算子的特征向量构成了图傅里叶变换的基。故图上的傅里叶变换就可以写成:
F
(
x
)
=
U
T
x
\begin{aligned} &\mathscr{F}(\mathbf{x})=\mathbf{U}^{T} \mathbf{x} \end{aligned}
?F(x)=UTx? 傅里叶逆变换便是:
F
?
1
(
x
)
=
U
x
\begin{aligned} &\mathscr{F}^{-1}(\mathbf{x})=\mathbf{U} \mathbf{x} \end{aligned}
?F?1(x)=Ux? 然后由卷积定理(函数卷积的傅里叶变换是函数傅立叶变换的乘积),故图上的卷积可以写成下式:
g
?
x
=
F
?
1
(
F
(
g
)
⊙
F
(
x
)
)
=
U
(
U
T
g
⊙
U
T
x
)
\begin{aligned} \mathbf{g} \star \mathbf{x} &=\mathscr{F}^{-1}(\mathscr{F}(\mathbf{g}) \odot \mathscr{F}(\mathbf{x})) \\ &=\mathbf{U}\left(\mathbf{U}^{T} \mathbf{g} \odot \mathbf{U}^{T} \mathbf{x}\right) \end{aligned}
g?x?=F?1(F(g)⊙F(x))=U(UTg⊙UTx)? 其中
U
T
g
\mathbf{U}^{T} \mathbf{g}
UTg是滤波器,
x
\mathbf{x}
x是输入的图信号矩阵,如果我们通过使用一个可学习的对角矩阵
g
w
\mathbf{g}_{w}
gw?来简化滤波器,那么我们就有了谱系方法的基本功能。
g
w
?
x
=
U
g
w
U
T
x
\mathbf{g}_{w} \star \mathbf{x}=\mathbf{U} \mathbf{g}_{w} \mathbf{U}^{T} \mathbf{x}
gw??x=Ugw?UTx 首先我们通过
U
T
x
\mathbf{U}^{T} \mathbf{x}
UTx,将图信号转换到谱域,然后我们通过
g
w
\mathbf{g}_{w}
gw?卷积后再通过
U
\mathbf{U}
U进行傅里叶逆变换后,重新变换成图信号,这样图神经网络的开山之作Spectral Network的原理介绍完毕,其余的谱域方法都是在
g
w
\mathbf{g}_{w}
gw?这个可学习的卷积核上进行研究。
ChebNet
上述的神经网络有三个严重问题
- 需要对拉普拉斯矩阵进行分解,对于计算机而言,求特征向量是一件时间开销非常大的事情。
- 当我们求出
U
\mathbf{U}
U后还需对他进行矩阵乘法,时间复杂度为
O
(
n
2
)
O(n^2)
O(n2)
- 在节点域中做卷积时并不是以节点的邻域做卷积
ChebNet应运而生,先了解一下什么时切比雪夫多项式
切比雪夫多项式
T
0
(
x
)
=
1
T
1
(
x
)
=
x
T
n
+
1
(
x
)
=
2
x
T
n
(
x
)
?
T
n
?
1
(
x
)
\begin{aligned} &T_{0}(x)=1 \\ &T_{1}(x)=x \\ &T_{n+1}(x)=2 x T_{n}(x)-T_{n-1}(x) \end{aligned}
?T0?(x)=1T1?(x)=xTn+1?(x)=2xTn?(x)?Tn?1?(x)?
我们可以运用上述公式,去逼近任意函数。
回到ChebNet,利用Chebyshev多项式代替卷积核,就可以得到下式:
g
w
≈
∑
k
=
0
K
w
k
T
k
(
L
~
)
x
\mathbf{g}_{w} \approx \sum_{k=0}^{K} w_{k} \mathbf{T}_{k}(\tilde{\mathbf{L}}) \mathbf{x}
gw?≈k=0∑K?wk?Tk?(L~)x 其中
L
~
=
2
λ
m
a
x
L
?
I
N
\tilde{\mathbf{L}}=\frac{2}{\lambda_{max}}\mathbf{L}-\mathbf{I}_{N}
L~=λmax?2?L?IN?,这样我们发现这个式子中没有了
U
\mathbf{U}
U,避免了矩阵的分解,将
N
N
N降维到了
K
K
K,其中的
K
K
K相当于感受野,解决了上述的三个问题。
GCN
GCN也是一个神经网络层,它的层与层之间的传播方式是:
H
(
l
+
1
)
=
σ
(
D
~
?
1
2
A
~
D
~
?
1
2
H
(
l
)
W
(
l
)
)
H^{(l+1)}=\sigma\left(\tilde{D}^{-\frac{1}{2}} \tilde{A} \tilde{D}^{-\frac{1}{2}} H^{(l)} W^{(l)}\right)
H(l+1)=σ(D~?21?A~D~?21?H(l)W(l))
H
l
H^{l}
Hl相当于第
l
l
l层的输出,如果为第一层相当于节点的特征矩阵,$ W^{l}
相
当
与
权
重
参
数
,
其
中
相当与权重参数,其中
相当与权重参数,其中\tilde{\mathbf{A}}=\mathbf{A}+\mathbf{I}{N}
,
,
,\tilde{\mathbf{D}}{i i}=\sum_{j} \tilde{\mathbf{A}}_{i j}
,
,
,\sigma
相
当
于
一
个
激
活
函
数
,
其
中
引
用
了
参
数
共
享
的
概
念
,
在
不
同
的
卷
积
层
中
相当于一个激活函数,其中引用了参数共享的概念,在不同的卷积层中
相当于一个激活函数,其中引用了参数共享的概念,在不同的卷积层中\tilde{\mathbf{A}}$都是共享的
GCN的局限性
- **无法完成inductive任务,即处理动态图问题。**inductive任务是指:训练阶段与测试阶段需要处理的graph不同。通常是训练阶段只是在子图(subgraph)上进行,测试阶段需要处理未知的顶点。(unseen node)
- 处理有向图的瓶颈,不容易实现分配不同的学习权重给不同的neighbor
空间域卷积
空间域卷积此时便有点像我们传统上的CNN了,他不再使用从节点域到谱域的转换,而是在直接在图上做卷积
首先我们再空间域做卷积有几个问题需要注意
- 确定邻域
在CNN中我们的领域因为欧氏空间的特性,非常容易确定,一个像素周围有八个像素点。而在图中每一个节点相邻的周围节点个数都不一样,所以不能直接在图上做卷积。 - 确定顺序
在CNN我们有一个非常重要的概念叫做参数共享,在以不同的节点为中心做卷积时,不同节点的顺序是一样,每个参数都能找到自己的位置,而在图上不一样,即使周围节点个数相同,我们也不知道那个参数该给那个参数共享
GraphSAGE
在这个方法中我们的采样点选择随机采样
Algorithm:GraphSAGE embedding generation
Input: Graph
G
(
V
,
E
)
\mathcal{G}(\mathcal{V}, \mathcal{E})
G(V,E); input features
{
x
v
,
?
v
∈
V
}
\left\{\mathbf{x}_{v}, \forall v \in \mathcal{V}\right\}
{xv?,?v∈V}; depth
K
K
K; weight matrices
W
k
,
?
k
∈
{
1
,
…
,
K
}
;
\mathbf{W}^{k}, \forall k \in\{1, \ldots, K\} ;
Wk,?k∈{1,…,K}; non-linearity
σ
\sigma
σ; differentiable aggregator functions AGGREGATE
k
,
?
k
∈
{
1
,
…
,
K
}
;
_{k}, \forall k \in\{1, \ldots, K\} ;
k?,?k∈{1,…,K}; neighborhood function
N
:
v
→
2
V
\mathcal{N}: v \rightarrow 2^{\mathcal{V}}
N:v→2V
Output:
?Vector?representations?
z
v
?for?all?
v
∈
V
\text { Vector representations } \mathbf{z}_{v} \text { for all } v \in \mathcal{V}
?Vector?representations?zv??for?all?v∈V
h
v
0
←
x
v
h^0_v \leftarrow \mathbf{x}_v
hv0?←xv?
for
k
=
1...
K
k=1...K
k=1...K do
? for
v
∈
V
v \in \mathcal{V}
v∈V do
?
h
N
(
v
)
k
←
AGGREGATE
?
k
(
{
h
u
k
?
1
,
?
u
∈
N
(
v
)
}
)
\mathbf{h}_{\mathcal{N}(v)}^{k} \leftarrow \operatorname{AGGREGATE}_{k}\left(\left\{\mathbf{h}_{u}^{k-1}, \forall u \in \mathcal{N}(v)\right\}\right)
hN(v)k?←AGGREGATEk?({huk?1?,?u∈N(v)})
?
h
v
k
←
σ
(
W
k
?
CONCAT
?
(
h
v
k
?
1
,
h
N
(
v
)
k
)
)
\mathbf{h}_{v}^{k} \leftarrow \sigma\left(\mathbf{W}^{k} \cdot \operatorname{CONCAT}\left(\mathbf{h}_{v}^{k-1}, \mathbf{h}_{\mathcal{N}(v)}^{k}\right)\right)
hvk?←σ(Wk?CONCAT(hvk?1?,hN(v)k?))
? end
?
h
v
k
←
h
v
k
/
∥
h
v
k
∥
2
,
?
v
∈
V
\mathbf{h}_{v}^{k} \leftarrow \mathbf{h}_{v}^{k} /\left\|\mathbf{h}_{v}^{k}\right\|_{2}, \forall v \in \mathcal{V}
hvk?←hvk?/∥∥?hvk?∥∥?2?,?v∈V
end
z
v
←
h
v
K
,
?
v
∈
V
\mathbf{z}_{v} \leftarrow \mathbf{h}_{v}^{K}, \forall v \in \mathcal{V}
zv?←hvK?,?v∈V
K
K
K代表神经网络的层数,
V
\mathcal{V}
V代表节点集,
AGGREGATE
?
\operatorname{AGGREGATE}
AGGREGATE代表聚合操作,有最大值聚合,平均值聚合,还有LSTM聚合,
σ
\sigma
σ为激活函数,
W
k
\mathbf{W}^{k}
Wk代表权重矩阵
这样我们通过随机采样和各种聚合函数解决了上述提到的问题
GAT
h
v
t
+
1
=
ρ
(
∑
u
∈
N
v
α
v
u
W
h
u
t
)
α
v
u
=
exp
?
(
LeakyReLU
?
(
a
T
[
W
h
v
∥
W
h
u
]
)
)
∑
k
∈
H
v
exp
?
(
LeakyReLU
?
(
a
T
[
W
h
v
∥
W
h
k
]
)
)
\begin{gathered} \mathbf{h}_{v}^{t+1}=\rho\left(\sum_{u \in \mathscr{N}_{v}} \alpha_{v u} \mathbf{W h}_{u}^{t}\right) \\ \alpha_{v u}=\frac{\exp \left(\operatorname{LeakyReLU}\left(\mathbf{a}^{T}\left[\mathbf{W h}_{v} \| \mathbf{W h}_{u}\right]\right)\right)}{\sum_{k \in \mathscr{H}_{v}} \exp \left(\operatorname{LeakyReLU}\left(\mathbf{a}^{T}\left[\mathbf{W h}_{v} \| \mathbf{W h}_{k}\right]\right)\right)} \end{gathered}
hvt+1?=ρ(u∈Nv?∑?αvu?Whut?)αvu?=∑k∈Hv??exp(LeakyReLU(aT[Whv?∥Whk?]))exp(LeakyReLU(aT[Whv?∥Whu?]))??
这些公式就描述了图卷积网络是如何进行卷积工作的
首先我们需要计算注意力系数
h
v
\mathbf{h}_{v}
hv?代表
v
v
v节点的隐藏状态,
W
\mathbf{W}
W代表一种共享参数,
[
?
∥
?
]
[\cdot \| \cdot]
[?∥?]这个数学符号代表将两个向量连接起来,最后通过
a
T
\mathbf{a}^{T}
aT把拼接后的向量映射到一个实数上,最后除以所有节点进行上述操作的总和,接着,我们用这个注意力系数乘以共享参数矩阵再乘以上一层该节点的隐藏状态,变得到了这一层该节点的隐藏状态。
综上,GAT弥补了GCN所产生的缺点
框架
MoNet
(
f
?
g
)
=
∑
j
=
1
J
g
j
D
j
(
v
)
f
(
1
)
D
j
(
v
)
f
=
∑
u
∈
N
v
w
j
(
u
(
v
,
u
)
)
f
(
u
)
(
2
)
\begin{aligned} (f \star g) &=\sum_{j=1}^{J} g_{j} D_{j}(v) f &(1) \\ D_{j}(v) f &=\sum_{u \in \mathscr{N}_{v}} w_{j}(\mathbf{u}(v, u)) f(u) &(2) \end{aligned}
(f?g)Dj?(v)f?=j=1∑J?gj?Dj?(v)f=u∈Nv?∑?wj?(u(v,u))f(u)?(1)(2)?
其实无论时上述所说的谱域卷积还是空间域卷积,我们的本质都是在空间域上进行卷积。我们所有的卷积操作本质上都可以转换成上述的操作对于**(1)式**,其中
g
g
g是卷积核,
D
j
(
v
)
f
D_{j}(v)f
Dj?(v)f是定义在节点上的的函数,用于聚合。对于**(2)式**
u
(
v
,
u
)
\mathbf{u}(v, u)
u(v,u)是一种伪坐标,
w
j
w_j
wj?是根据伪坐标的一种权重函数
|