图学习 [1]
图学习的主要任务
- 节点预测。节点预测任务是指利用图结构中已有的节点和边信息,通过机器学习算法对图中新添加的节点进行分类或回归预测的任务。
- 链路预测。链路预测任务是指利用图结构中已有的节点和边信息,通过机器学习算法预测未来可能存在的边或连接关系的任务。链路预测任务通常是二分类任务,模型预测节点之间是否有连接。
- 图嵌入。图嵌入(Graph Embedding)是指将一个图或一个节点映射为低维向量的过程,即将图结构中的节点和边映射到一个连续的向量空间中。这个过程可以看作是将图结构中的离散信息转化为连续的特征向量,使得可以应用于其他机器学习任务,例如分类、聚类、链路预测等。
图神经网络
基本概念
什么是GNN?GNN是对保持图对称性(排列不变性)的图的所有属性(节点、边、全局上下文)的可优化转换。对称信息指的是把这个顶点进行另外一个排序后,整个结果是不会变的。
GNN层:对顶点向量、边向量和全局向量分别构造一个多层感知机(MLP),输入的大小和输出的大小是相同的,这三个MLP就组成了一个GNN的层,输入是一个图,输出也是一个图,并且连接性不变。满足了上文中对GNN的第一个要求,只对属性进行变换,并不改变图的结构。
但是,如果顶点中没有信息,信息储存在边中,我们就需要一种收集边信息的方法,将其用作顶点预测。如下图,该池化方法是将与该顶点相连接的边的信息与全局信息求和,用得到的信息做顶点预测。
同理也可以将此方法用作其他情况,比如用顶点信息池化来预测边,用顶点信息池化来预测全局属性等等。
我们可以将最简单的GNN模型总结成如下的结构:
一张图输入,经过GNN层(实质上就是三个分别对应点、边和全局的MLP),输出一个属性已经变换但是连接性不变的图,在经过全连接层,得到输出。
没有用到图之间的连接性,点、边、全局都是分别用单独的多层感知机进行特征提取的,仅仅在池化的时候用到了其他的信息。
图的各部分之间传递信息
- 对于图中的每个节点,收集所有相邻节点嵌入(或消息)。
- 通过聚合函数(如sum)聚合所有消息。
- 所有合并的消息都通过一个更新函数传递,通常是一个学习过的神经网络。
点与点之间的消息传递:通过将消息传递GNN层堆叠在一起,节点最终可以合并来自整个图的信息:在三层之后,节点具有距离它三步之遥的节点的信息。
边与点之间的信息传递:先把与边连接的顶点信息池化,传递到边上,边通过更新后,再把与顶点相连接的边信息池化传递给顶点,再通过MLP进行更新。如果顶点和边向量的长度不一样,需要先通过投影到相同维度,在做传递。
加入全局信息:U是全局信息,它可以和图中的任何信息相连接。在汇聚顶点信息到边的时候,也会把U一起汇聚,把边信息传递给顶点的时候,也会把U一起传递;然后更新边和顶点后,将边和顶点的信息一起汇聚给U,之后做MLP更新。
GNN中的采样和batch
GNN有很多层,就算每一次只做1近邻,到最后一层中的一个节点可能包含有整个图的信息。在神经网络中计算梯度的时候,我们需要将整个梯度给保存下来,如果对最后一个顶点计算梯度的时候,我们需要保存整个图的中间结果,如果图很大,这可能会导致我们是无法承受的。所以我们也需要做小批量梯度,就是每次从图中随机采集一个小图,然后在这个小图上面做汇聚,计算梯度的时候只需要保存小图上面的结果就足够了。
由于每个节点的相邻节点是不同的,怎样才能把小样本做成小批量?这样我们就能对一个大的矩阵做运算,实现并行。
经典图学习模型
图卷积神经网络(GCN)
核心公式(层与层之间的传播方式):
H
(
l
+
1
)
=
σ
(
D
~
−
1
2
A
~
D
~
−
1
2
H
(
l
)
W
(
l
)
)
.
H^{(l+1)}=\sigma\Big(\tilde{D}^{-\frac{1}{2}}\tilde{A}\tilde{D}^{-\frac{1}{2}}H^{(l)}W^{(l)}\Big).
H(l+1)=σ(D~−21A~D~−21H(l)W(l)).
假设有N个节点,每个节点有D维的特征,那么节点的特征可以组成一个N
×
\times
×D维的矩阵X,各个节点的关系也可以形成一个N
×
\times
×N维的矩阵A(邻接矩阵)。这两个矩阵就是模型的输入。
- A波浪是矩阵A加单位矩阵。
- D波浪是A波浪的度矩阵。
- H是每一层的特征,对于输入层,H就是X
假设构造了一个两层的GCN,激活函数采用Relu和Softmax,则传播公式为:
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)=\mathrm{softmax}\Big(\hat{A}\mathrm{ReLU}\Big(\hat{A}XW^{(0)}\Big)W^{(1)}\Big).
Z=f(X,A)=softmax(A^ReLU(A^XW(0))W(1)).
再针对带标签的节点计算交叉熵损失函数,就可以用来分类了。由于即使只有很少的节点有标签也能训练,作者称之为半监督分类。
为什么公式是这个样子?
- 最初实际上是A ⋅ \cdot ⋅X,这样能够将当前节点的相邻节点的特征附加到当前节点特征上。
- 但是由于A的对角线全是0,如果这样乘的话,将会之关注相邻节点,完全摒除了自身节点的特征。因此公式变为了(A+I) ⋅ \cdot ⋅X。
- 但是又会有一个问题,有的节点的邻居节点少,有的节点的邻居节点多,而特征又是相加的,如果不进行标准化将会改变特征原本的分布。因此要对A做一个标准化处理,就是让A的每一行加起来为1,乘一个 D − 1 D^{-1} D−1。为了保证乘过之后仍然是对称的,则将其拆开,就变成了 D − 1 2 A D − 1 2 D^{-\frac{1}{2}}AD^{-\frac{1}{2}} D−21AD−21.
- 再使用激活函数激活,就变成了现在的样子。
GraphSAGE模型
将GCN扩展到归纳无监督学习的任务。利用节点特征(例如,文本属性、节点概要信息、节点度)来学习一个将不可见节点泛化的嵌入函数。
目的不是为每个节点学习一个嵌入向量,而是训练一组聚合器函数,每个聚合器函数从一个给定节点的不同跳数或搜索深度聚合信息。同时设计了一个无监督的损失函数,允许GraphSAGE在没有特定任务监督情况下进行训练。
节点嵌入生成(Embedding Generation)
假设已经该算法假设模型已经过训练,参数是固定的。特别地,我们假设我们已经学习了K个聚合器函数的参数,记为 A G G R E G A T E k , ∀ k ∈ { 1 , . . . , K } ) {\mathrm{AGGREGATE}}_{k},\forall k\in\{1,...,K\}) AGGREGATEk,∀k∈{1,...,K}),同时有一组权重矩阵: W k ~ , ∀ k ∈ { 1 , . . . , K } \mathbf{W}^{\tilde{k}},\forall k\in\{1,...,K\} Wk~,∀k∈{1,...,K}
算法流程:
解释:
1:将每个节点的初始化特征赋给
h
v
0
h_{v}^{0}
hv0,表示第0层的结果。
2: 表示每个节点的邻域的大小,或者说每个节点搜寻相邻节点的深度,再或者说每个节点想要聚合特征的节点范围的大小。
3: 遍历图中的每个节点,每一层的聚合更新,都要更新整个图的所有节点。
4: 将当前节点的所有邻居节点的特征进行聚合,得到
h
N
(
v
)
k
h^{k}_{N(v)}
hN(v)k。
5: 由于上一步得到的结果只是融合了邻居节点的特征,缺少最重要的自身的特征,因此将自身的特征和上一步的特征进行一个拼接,然后乘一个权重,一方面是变换维度,另一方面也可以提升模型表达能力,最后再进行激活。
7: 算是一个归一化。
学习GraphSAGE的参数
- 随机采样。在每个节点的邻域集合中采样固定个数的邻居节点进行聚合。
- 无监督学习。基于图形的loss函数鼓励附近的节点有相似的表示,同时强制不同节点的表示是高度不同的。(感觉并不是很合理)
聚合器
- 平均聚合器: h v k ← σ ( W ⋅ M E N ( { h v k − 1 } ∪ { h u k − 1 , ∀ u ∈ N ( v ) } ) . \mathbf{h}_v^k\leftarrow\sigma(\mathbf{W}\cdot\mathrm{MEN}(\{\mathbf{h}_v^{k-1}\}\cup\{\mathbf{h}_u^{k-1},\forall u\in\mathcal{N}(v)\}). hvk←σ(W⋅MEN({hvk−1}∪{huk−1,∀u∈N(v)}).
- LSTM聚合器:将lstm应用于节点邻居的随机排列,可以使lstm适应于无序集合进行操作。
- 池化聚合器: A G G R G A T E k p o o l = max ( { σ ( W p o o l h u i k + b ) , ∀ u i ∈ N ( v ) } ) \mathrm{AGGRGATE}_k^{\mathrm{pool}}=\max(\{\sigma\left(\mathbf{W}_{\mathrm{pool}}\mathbf{h}_{u_i}^k+\mathbf{b}\right),\forall u_i\in\mathcal{N}(v)\}) AGGRGATEkpool=max({σ(Wpoolhuik+b),∀ui∈N(v)}),max是逐元的max算子
思考:GraphSAGE相较于GCN,提升了可扩展性,注重于训练聚合器而不是为节点训练一个embedding,而且可以分批训练,提升收敛速度。
图注意力网络
优势:
- 操作高效,因为它跨节点-邻居对是可并行的。
- 可以应用于具有不同度的图节点。
- 可应用于归纳(inductive)学习问题。
Graph Attention Layer
输入:
h
=
{
h
⃗
1
,
h
⃗
2
,
…
,
h
⃗
N
}
,
h
⃗
i
∈
R
F
\mathbf{h}=\{\vec{h}_1,\vec{h}_2,\dots,\vec{h}_N\},\vec{h}_i\in\mathbb{R}^F
h={h1,h2,…,hN},hi∈RF,N为节点数量,F是节点特征的维度。图注意力层是为了产生一组新的特征:
h
′
=
{
h
⃗
1
′
,
h
⃗
2
′
,
…
,
h
⃗
N
′
}
,
h
⃗
i
′
∈
R
F
′
\mathbf{h}'=\{\vec{h}'_1,\vec{h}'_2,\ldots,\vec{h}'_N\},\vec{h}'_i\in\mathbb{R}^{F'}
h′={h1′,h2′,…,hN′},hi′∈RF′,为了能够获取更高维度的特征,首先加一个共享的权重矩阵参数
W
∈
R
F
′
×
F
\mathbf{W}\in\mathbb{R}^{F'\times F}
W∈RF′×F,该权重参数应用与每个节点。然后对每个节点做自注意力a:
W
∈
R
F
′
×
F
\mathbf{W}\in\mathbb{R}^{F'\times F}
W∈RF′×F,计算注意力系数:
e
i
j
=
a
(
W
h
⃗
i
,
W
h
⃗
j
)
e_{ij}=a(\mathbf{W}\vec{h}_i,\mathbf{W}\vec{h}_j)
eij=a(Whi,Whj)
这个系数表示了节点j的特征对节点i的重要程度。通过使用mask attention将图结构的信息注入到其中。对于节点i,我们只计算该节点所有的邻居节点j的权重,并且对权重进行归一化:
α
i
j
=
s
o
f
t
m
a
x
j
(
e
i
j
)
=
exp
(
e
i
j
)
∑
k
∈
N
i
exp
(
e
i
k
)
.
\alpha_{ij}=\mathrm{softmax}_j(e_{ij})=\frac{\exp(e_{ij})}{\sum_{k\in\mathcal{N}_i}\exp(e_{ik})}.
αij=softmaxj(eij)=∑k∈Niexp(eik)exp(eij).
最后使用归一化的注意力系数来计算与它们相对应的特征的线性组合,以用作每个节点的最终输出特征(在潜在地计算之后)。
总公式:
h
⃗
i
′
=
σ
(
∑
j
∈
N
i
α
i
j
W
h
⃗
j
)
.
\vec{h}'_i=\sigma\left(\sum\limits_{j\in\mathcal{N}_i}\alpha_{ij}\mathbf{W}\vec{h}_j\right).
hi′=σ
j∈Ni∑αijWhj
.
发现采用多头注意力更好:
‖表示级联,个人认为应该是该层用了K个不同的参数矩阵W,K个不同的全连接层a,计算了K个不同的
h
i
‘
h_i^`
hi‘,然后加一块。进一步对此进行改进,不再每一次进行激活函数激活,而是最后加一起之后再激活一次:
h
⃗
i
′
=
σ
(
1
K
∑
k
=
1
K
∑
j
∈
N
i
α
i
j
k
W
k
h
⃗
j
)
\vec{h}'_i=\sigma\left(\frac{1}{K}\sum\limits_{k=1}^K\sum\limits_{j\in\mathcal{N}_i}\alpha_{ij}^k\mathbf{W}^k\vec{h}_j\right)
hi′=σ
K1k=1∑Kj∈Ni∑αijkWkhj
思考:普通的图卷积网络更像是一个卷积核内元素都为1的卷积运算,它没有考虑到不同的邻域节点对当前节点的重要程度。而图注意力网络,利用可训练的参数W和可训练的注意力网络a(实际上感觉就是一个全连接层,也是一个可训练的W)来模拟各个邻域节点对当前节点的重要程度,相当于真正实现了图像中的卷积神经网络中可训练的卷积核,因此在图学习的各个数据集上达到了新的高度,同时利用“多头注意力”,实际上更像是卷积神经网络中的多个卷积核,增加了特征提取的广度和深度,性能进一步得到提升。