md_files/科研/图神经网络.md

309 lines
11 KiB
Markdown
Raw Normal View History

2025-03-19 18:16:24 +08:00
# 图神经网络
2025-03-18 12:46:59 +08:00
图表示学习的本质是把节点映射成低维连续稠密的向量。这些向量通常被称为 **嵌入Embedding**,它们能够捕捉节点在图中的结构信息和属性信息,从而用于下游任务(如节点分类、链接预测、图分类等)。
- **低维**:将高维的原始数据(如邻接矩阵或节点特征)压缩为低维向量,减少计算和存储开销。
- **连续**:将离散的节点或图结构映射为连续的向量空间,便于数学运算和捕捉相似性。
- **稠密**:将稀疏的原始数据转换为稠密的向量,每个维度都包含有意义的信息。
2025-03-19 18:16:24 +08:00
## 对图数据进行深度学习的“朴素做法”
2025-03-18 12:46:59 +08:00
把图的邻接矩阵和节点特征“直接拼接”成固定维度的输入,然后将其送入一个深度神经网络(全连接层)进行学习。
2025-03-19 18:16:24 +08:00
![image-20250316142412685](D:/folder/study/md_files/output/554d273e-c4e3-4ac2-8573-01debad92434.png)
2025-03-18 12:46:59 +08:00
这种做法面临重大问题,导致其**并不可行**
1. **$O(|V|^2)$ 参数量** ,参数量庞大
2. **无法适应不同大小的图** ,需要固定输入维度
3. **对节点顺序敏感** ,节点编号顺序一变,输入就完全变样,但其实图的拓扑并没变(仅节点编号/排列方式不同)。
```
A —— B
| |
D —— C
```
*矩阵 1*(顺序 $[A,B,C,D]$
$$
M_1 =
\begin{pmatrix}
0 & 1 & 0 & 1\\
1 & 0 & 1 & 0\\
0 & 1 & 0 & 1\\
1 & 0 & 1 & 0
\end{pmatrix}.
$$
*矩阵 2*(顺序 $[C,A,D,B]$
$$
M_2 =
\begin{pmatrix}
0 & 0 & 1 & 1 \\
0 & 0 & 1 & 1 \\
1 & 1 & 0 & 0 \\
1 & 1 & 0 & 0
\end{pmatrix}.
$$
两个矩阵完全不同,但**它们对应的图是相同的**(只不过节点的顺序改了)。
2025-03-19 18:16:24 +08:00
## 计算图
2025-03-18 12:46:59 +08:00
在**图神经网络**里,通常每个节点$v$ 都有一个**局部计算图**,用来表示该节点在聚合信息时所需的所有邻居(及邻居的邻居……)的依赖关系。
- 直观理解
- 以节点 $v$ 为根;
- 1-hop 邻居在第一层2-hop 邻居在第二层……
- 逐层展开直到一定深度(例如 k 层)。
- 这样形成一棵“邻域树”或“展开图”,其中每个节点都需要从其子节点(邻居)获取特征进行聚合。
2025-03-19 18:16:24 +08:00
![image-20250316152729679](D:/folder/study/md_files/output/ec45b68d-2da4-4ea3-b0d4-8b7bad443935.png)
![image-20250316152836156](D:/folder/study/md_files/output/f6e59abc-2373-47d4-8691-36c2e0b0f3ef.png)
2025-03-18 12:46:59 +08:00
2025-03-19 18:16:24 +08:00
### 例子
2025-03-18 12:46:59 +08:00
在图神经网络中,每一层的计算通常包括以下步骤:
1. **聚合Aggregation**:将邻居节点的特征聚合起来(如求和、均值、最大值等)。
2. **变换Transformation**:将聚合后的特征通过一个神经网络(如 MLP进行非线性变换。
```
A
|
B
/ \
C D
```
假设每个节点的特征是一个二维向量:
- 节点 $ A $ 的特征:$ h_A = [1.0, 0.5] $
- 节点 $ B $ 的特征:$ h_B = [0.8, 1.2] $
- 节点 $ C $ 的特征:$ h_C = [0.3, 0.7] $
- 节点 $ D $ 的特征:$ h_D = [1.5, 0.9] $
**第 1 层更新:$A^{(0)} \to A^{(1)}$**
2025-03-19 18:16:24 +08:00
1. 节点 $A$ 的 1-hop 邻居:只有 $B$。
2025-03-18 12:46:59 +08:00
2025-03-19 18:16:24 +08:00
2. 聚合(示例:自+邻居取平均):
2025-03-18 12:46:59 +08:00
$$
2025-03-19 18:16:24 +08:00
z_A^{(1)} = \frac{A^{(0)} + B^{(0)}}{2} = \frac{[1.0,\,0.5] + [0.8,\,1.2]}{2} = \frac{[1.8,\,1.7]}{2} = [0.9,\,0.85].
2025-03-18 12:46:59 +08:00
$$
2025-03-19 18:16:24 +08:00
3. MLP 变换用一个MLP映射 $z_A^{(1)}$ 到 2 维输出:
2025-03-18 12:46:59 +08:00
$$
A^{(1)} \;=\; \mathrm{MLP_1}\bigl(z_A^{(1)}\bigr).
$$
2025-03-19 18:16:24 +08:00
- (数值略,可想象 $\mathrm{MLP}([0.9,0.85]) \approx [1.0,0.6]$ 之类。)
2025-03-18 12:46:59 +08:00
**结果**$A^{(1)}$ 包含了 **A** 的初始特征 + **B** 的初始特征信息。
---
**第 2 层更新:$A^{(1)} \to A^{(2)}$**
2025-03-19 18:16:24 +08:00
为了让 **A** 获得 **2-hop** 范围($C, D$)的信息,需要先让 $B$ 在第 1 层就吸收了 $C, D$ 的特征,从而 **$B^{(1)}$** 蕴含 $C, D$ 信息。然后 **A** 在第 2 层再从 **$B^{(1)}$** 聚合。
2025-03-18 12:46:59 +08:00
1. **节点 B 在第 1 层**(简要说明)
- 邻居:$\{A,C,D\}$
2025-03-19 18:16:24 +08:00
- 聚合:$z_B^{(1)} = \frac{B^{(0)} + A^{(0)} + C^{(0)} + D^{(0)}}{4} = \frac{[0.8,\,1.2] + [1.0,\,0.5] + [0.3,\,0.7] + [1.5,\,0.9]}{4} = \frac{[3.6,\,3.3]}{4} = [0.9,\,0.825].$
2025-03-18 12:46:59 +08:00
- MLP 变换:$B^{(1)} = \mathrm{MLP}\bigl(z_B^{(1)}\bigr)$。
2025-03-19 18:16:24 +08:00
- 此时 **$B^{(1)}$** 已经包含了 $C, D$ 的信息。
2025-03-18 12:46:59 +08:00
2. **节点 $A$ 的第 2 层聚合**
2025-03-19 18:16:24 +08:00
- 邻居:$B$,但此时要用 **$B^{(1)}$**(它已吸收 C、D
2025-03-18 12:46:59 +08:00
2025-03-19 18:16:24 +08:00
- 聚合:
2025-03-18 12:46:59 +08:00
$$
z_A^{(2)} = A^{(1)} + B^{(1)}.
$$
2025-03-19 18:16:24 +08:00
- MLP 变换:
2025-03-18 12:46:59 +08:00
$$
A^{(2)} = \mathrm{MLP_2}\bigl(z_A^{(2)}\bigr).
$$
2025-03-19 18:16:24 +08:00
**结果**$A^{(2)}$ 就包含了 **2-hop** 范围的信息,因为 **$B^{(1)}$** 中有 $C, D$ 的贡献。
2025-03-18 12:46:59 +08:00
2025-03-19 18:16:24 +08:00
**GNN 的层数**就是**节点聚合邻居信息的迭代次数**(也是计算图的层数)。
2025-03-18 12:46:59 +08:00
2025-03-19 18:16:24 +08:00
同一层里,**所有节点共享一组参数**(同一个 MLP 或全连接神经网络)
2025-03-18 12:46:59 +08:00
2025-03-19 18:16:24 +08:00
### **矩阵运算**
$\tilde D^{-1}\,\tilde A\,\tilde D^{-1}H$
$H'=\tilde D^{-1}\,\tilde A\,H$
A
|
B
/ \
C D
**1.构造矩阵**
含自环邻接矩阵 $\tilde A=A+I$
$$
\tilde A =
\begin{bmatrix}
1 & 1 & 0 & 0\\
1 & 1 & 1 & 1\\
0 & 1 & 1 & 0\\
0 & 1 & 0 & 1
\end{bmatrix}
$$
度矩阵 $\tilde D$(对角=自身+邻居数量)
$$
\tilde D = \mathrm{diag}(2,\,4,\,2,\,2)
$$
特征矩阵 $H$(每行为一个节点的特征向量)
$$
H =
\begin{bmatrix}
1.0 & 0.5\\
0.8 & 1.2\\
0.3 & 0.7\\
1.5 & 0.9
\end{bmatrix}
$$
**2.计算**
求和: $\tilde A\,H$
$$
\tilde A H =
\begin{bmatrix}
1.8 & 1.7\\
3.6 & 3.3\\
1.1 & 1.9\\
2.3 & 2.1
\end{bmatrix}
$$
平均: $\tilde D^{-1}(\tilde A H)$
$$
\tilde D^{-1}\tilde A H =
\begin{bmatrix}
0.90 & 0.85\\
0.90 & 0.825\\
0.55 & 0.95\\
1.15 & 1.05
\end{bmatrix}
$$
## GCN
在 GNN 里归一化normalization的核心目的就是 **平衡不同节点在信息传播messagepassing中的影响力**避免「高连通度节点highdegree nodes」主导了所有邻居的特征聚合。
$H' = \tilde D^{-1}\,\tilde A\,\tilde D^{-1}H$
- 对节点 $i$ 来说:
$$
H'_i = \frac1{d_i}\sum_{j\in \mathcal N(i)}\frac1{d_j}\,H_j
$$
- **先用源节点 $j$ 的度 $d_j$ 缩小它的特征贡献**,再用目标节点 $i$ 的度 $d_i$ 归一化总和。
### **GCN中实际的公式**
$$
H^{(l+1)} = \sigma\Big(\tilde{D}^{-1/2}\tilde{A}\tilde{D}^{-1/2}H^{(l)}W^{(l)}\Big)
$$
其中:
- $H^{(l)}$ 是第 $l$ 层的输入特征(对第 $0$ 层来说就是节点的初始特征),
- $W^{(l)}$ 是第 $l$ 层的可训练权重矩阵,相当于一个简单的线性变换(类似于 MLP 中的全连接层),
- $\sigma(\cdot)$ 是非线性激活函数(例如 ReLU
- $\tilde{A}$ 是包含自连接的邻接矩阵,
- $\tilde{D}$ 是 $\tilde{A}$ 的度矩阵。
**$\tilde{D}^{-1/2}\tilde{A}\tilde{D}^{-1/2}$的优势**
**1.对称归一化**$\tilde D^{-\frac{1}{2}}\,\tilde A\,\tilde D^{-\frac{1}{2}}$ 是一个对称矩阵,这意味着信息在节点之间的传播是双向一致的。这种对称性特别适合无向图,因为无向图的邻接矩阵 $\tilde A$ 本身就是对称的。
**2.适度抑制高连通度节点**:对称平方根归一化通过 $\tilde D^{-\frac{1}{2}}$ 对源节点和目标节点同时进行归一化,能够适度抑制高连通度节点的特征贡献,而不会过度削弱其影响力。
**3.谱半径控制**:对称平方根归一化后的传播矩阵 $\tilde D^{-\frac{1}{2}}\,\tilde A\,\tilde D^{-\frac{1}{2}}$ 的谱半径(最大特征值)被控制在 $[0, 1]$ 范围内,这有助于保证模型的数值稳定性。
**4.归一化拉普拉斯矩阵**:对称平方根归一化的传播矩阵 $\tilde D^{-\frac{1}{2}}\,\tilde A\,\tilde D^{-\frac{1}{2}}$ 与归一化拉普拉斯矩阵 $L = I - \tilde D^{-\frac{1}{2}}\,\tilde A\,\tilde D^{-\frac{1}{2}}$ 有直接联系。归一化拉普拉斯矩阵在图信号处理中具有重要的理论意义,能够更好地描述图的频谱特性。
**优化**
$$
h_v^{(k+1)} = \sigma \Big(
\mathbf{W}_{\text{self}}^{(k)} \cdot h_v^{(k)}
\;+\;
\mathbf{W}_{\text{neigh}}^{(k)} \cdot \mathrm{MEAN}_{u\in N(v)}\bigl(h_u^{(k)}\bigr)
\Big),
$$
### 直推式学习与归纳式学习
**直推式学习Transductive Learning**
模型直接在固定的训练图上学习节点的表示或标签,结果只能应用于这张图中的节点,无法直接推广到新的、未见过的节点或图。
例如DeepWalk ,它通过对固定图的随机游走生成节点序列来学习节点嵌入,因此只能得到训练图中已有节点的表示,一旦遇到新节点,需要重新训练或进行特殊处理。
**注意**GCN是直推式的因为它依赖于整个图的归一化邻接矩阵进行卷积操作需要在固定图上训练。GraphSAGE 是归纳式学习方法。它通过在每一层随机采样固定数量的邻居,当有新节点加入时,你可以构造一个包含新节点及其局部邻居的子图,然后重新计算该局部子图的 $\tilde{A}$ 和 $\tilde{D}$ 矩阵。这样就不需要对整个图做全局归一化
**归纳式学习Inductive Learning**
模型学习的是一个映射函数或规则,可以将这种规则推广到未见过的**新节点**或**新图**上。这种方法能够处理动态变化的图结构或新的数据。
例如:图神经网络的变体都是归纳式的,因为它们在聚合邻居信息时学习一个共享的函数,该函数能够应用于任意新节点。
**泛化到新节点**在许多推荐系统中如果有新用户加入新节点我们需要给他们做个性化推荐这就要求系统能够在不重新训练整个模型的情况下为新用户生成表示Embedding并且完成推荐预测。
**泛化到新图:** 分子图预测。我们会用一批训练分子(每个分子是一张图)来训练一个 GNN 模型,让它学会如何根据图结构与原子特征来预测分子的某些性质(如毒性、溶解度、活性等)。训练完成后,让它在新的分子上做预测。
### GNN的优点
**参数共享**
- 浅层嵌入(如Deepwalk)为每个节点单独学习一个向量,参数量随节点数线性增长。
- GNN 使用统一的消息传递/聚合函数,所有节点共享同一套模型参数,大幅减少参数量。
**归纳式学习**
- 浅层方法通常无法直接处理训练时未见过的新节点。
- GNN 能通过邻居特征和结构来生成新节点的表示,实现对新节点/新图的泛化。
**利用节点特征**
- 浅层方法多半只基于连接关系(图结构)。
- GNN 可以直接整合节点的属性(文本、图像特征等),生成更具语义信息的嵌入。
**更强的表达能力**
- GNN 通过多层聚合邻居信息,可学习到更丰富的高阶结构和特征交互,往往在多种任务上表现更优。
2025-03-18 12:46:59 +08:00