308 lines
12 KiB
Markdown
308 lines
12 KiB
Markdown
# 动态图神经网络
|
||
|
||
## 如何对GAT的权重($W$)和注意力参数($a$)进行增量更新(邻居偶尔变化)
|
||
|
||
#### 1. 核心思想
|
||
|
||
- **局部更新**:邻居变化的节点及其直接邻域的权重和注意力参数需要调整,其他部分冻结。
|
||
- **梯度隔离**:反向传播时,仅计算受影响节点的梯度,避免全局参数震荡。
|
||
|
||
---
|
||
|
||
#### 2. 数学实现步骤
|
||
|
||
#### **(1) 识别受影响的节点**
|
||
|
||
设邻居变化后的新邻接矩阵为 $\tilde{A}$,原邻接矩阵为 $A$,受影响节点集合 $\mathcal{V}_{\text{affected}}$ 包括:
|
||
|
||
- 新增或删除边的两端节点(直接受影响)。
|
||
- 这些节点的1-hop邻居(间接受影响,根据GAT层数决定)。
|
||
|
||
#### **(2) 损失函数局部化**
|
||
|
||
仅对 $\mathcal{V}_{\text{affected}}$ 中的节点计算损失:
|
||
$$
|
||
\mathcal{L}_{\text{incremental}} = \sum_{i \in \mathcal{V}_{\text{affected}}} \ell(y_i, \hat{y}_i)
|
||
$$
|
||
其中 $\ell$ 为交叉熵损失,$y_i$ 为标签,$\hat{y}_i$ 为模型输出。
|
||
|
||
#### **(3) 梯度计算与参数更新**
|
||
|
||
- **梯度掩码**:
|
||
反向传播时,非受影响节点的梯度强制置零:
|
||
$$
|
||
\nabla_{W,a} \mathcal{L}_{\text{incremental}} = \left\{
|
||
\begin{array}{ll}
|
||
\nabla_{W,a} \ell(y_i, \hat{y}_i) & \text{if } i \in \mathcal{V}_{\text{affected}} \\
|
||
0 & \text{otherwise}
|
||
\end{array} \right.
|
||
$$
|
||
|
||
- **参数更新**:
|
||
使用优化器(如Adam)仅更新有梯度的参数:
|
||
$$
|
||
W \leftarrow W - \eta \nabla_W \mathcal{L}_{\text{incremental}}, \quad a \leftarrow a - \eta \nabla_a \mathcal{L}_{\text{incremental}}
|
||
$$
|
||
其中 $\eta$ 为较小的学习率(防止过拟合)。
|
||
|
||
#### **(4) 注意力权重的动态适应**
|
||
|
||
GAT的注意力机制会自动适应新邻居:
|
||
$$
|
||
\alpha_{ij} = \text{softmax}\left(\text{LeakyReLU}\left(a^T [W h_i \| W h_j]\right)\right)
|
||
$$
|
||
由于 $W$ 和 $a$ 已局部更新,新邻居 $j \in \tilde{\mathcal{N}}(i)$ 的权重 $\alpha_{ij}$ 会重新计算。
|
||
|
||
#### 3. 适用场景
|
||
|
||
- **低频变化**:如社交网络每天新增少量边、论文引用网络月度更新。
|
||
- **局部变化**:每次变化仅影响图中少量节点(<10%)。
|
||
|
||
若邻居**高频变化**(如秒级更新),需改用动态GNN(如TGAT)或时间序列建模。
|
||
|
||
|
||
|
||
## EvolveGCN
|
||
|
||
### EvolveGCN-H
|
||
|
||
#### **1. EvolveGCN-H核心思想**
|
||
|
||
EvolveGCN-H 通过 **GRU(门控循环单元)** 动态更新 GCN 每一层的权重矩阵 $W_t^{(l)}$,将权重矩阵视为 GRU 的 **隐藏状态**,并利用当前时间步的 **节点嵌入(特征)** 作为输入来驱动演化。
|
||
**关键特点**:
|
||
|
||
- **输入依赖**:利用节点嵌入 $H_t^{(l)}$ 指导权重更新。
|
||
- **时序建模**:通过 GRU 隐式捕捉参数演化的长期依赖。
|
||
|
||
---
|
||
|
||
#### **2. 动态更新流程(以第 $l$ 层为例)**
|
||
|
||
**输入**:
|
||
|
||
1. 当前节点嵌入矩阵 $H_t^{(l)} \in \mathbb{R}^{n \times d}$:
|
||
2. 上一时间步的权重矩阵 $W_{t-1}^{(l)} \in \mathbb{R}^{d \times d'}$:
|
||
3. 邻接矩阵 $A_t \in \mathbb{R}^{n \times n}$:
|
||
|
||
**输出**:
|
||
|
||
1. 更新后的权重矩阵 $W_t^{(l)} \in \mathbb{R}^{d \times d'}$。
|
||
2. 下一层节点嵌入 $H_t^{(l+1)} \in \mathbb{R}^{n \times d'}$。
|
||
|
||
---
|
||
|
||
#### **3. 动态更新示意图**
|
||
|
||
```plaintext
|
||
Time Step t-1 Time Step t
|
||
+-------------------+ +-------------------+
|
||
| Weight Matrix | | Weight Matrix |
|
||
| W_{t-1}^{(l)} | --(GRU更新)--> | W_t^{(l)} |
|
||
+-------------------+ +-------------------+
|
||
^ ^
|
||
| |
|
||
+-------------------+ +-------------------+
|
||
| Node Embeddings | | Node Embeddings |
|
||
| H_t^{(l)} | --(GCN计算)--> | H_t^{(l+1)} |
|
||
+-------------------+ +-------------------+
|
||
^ ^
|
||
| |
|
||
+-------------------+ +-------------------+
|
||
| 邻接矩阵 A_t | | 邻接矩阵 A_{t+1} |
|
||
| (显式输入) | | (下一时间步输入) |
|
||
+-------------------+ +-------------------+
|
||
```
|
||
|
||
$$
|
||
\begin{align*}
|
||
W_t^{(l)} &<= H_t^{(l)} + W_{t-1}^{(l)} \\
|
||
H_t^{(l+1)} &<= A_t + H_t^{(l)} + W_t^{(l)}
|
||
\end{align*}
|
||
$$
|
||
|
||
#### **4. 具体步骤分解**
|
||
|
||
##### **步骤 1:节点嵌入聚合(Summarize)**
|
||
|
||
由于 GRU 的输入需与隐藏状态 $W_{t-1}^{(l)}$ 的列维度匹配(即 $d'$),需将 $H_t^{(l)}$ 从 $n \times d$ 压缩为 $d' \times d$ :
|
||
$$
|
||
Z_t = \text{Summarize}(H_t^{(l)}, d')
|
||
$$
|
||
|
||
|
||
**实现方式**(论文方案):
|
||
|
||
1. 计算得分:
|
||
$$
|
||
y_t = H_t^{(l)} p / \|p\| \quad (p \in \mathbb{R}^d \text{为可学习参数})
|
||
$$
|
||
学一个“打分器”参数 $p$,$H_t^{(l)} p$相当于对每个节点的嵌入向量和 $p$做点积,得到一个分数。比如在社交网络中,$p$ 可能代表“活跃度”,得分高的用户更活跃。
|
||
|
||
2. 选取 Top-$d'$ 个节点(按 $y_t$ 排序),加权求和:
|
||
$$
|
||
Z_t = [H_t^{(l)} \circ \tanh(y_t)]_{\text{top-}d'} \quad (\circ \text{为逐元素乘})
|
||
$$
|
||
|
||
- 输出 $Z_t \in \mathbb{R}^{d' \times d}$。
|
||
|
||
**举个例子**
|
||
|
||
假设:
|
||
- 有3个节点($n=3$),嵌入维度 $d=2$,选Top-2个节点($d'=2$)。
|
||
- 节点嵌入:
|
||
$$ H_t^{(l)} = \begin{bmatrix} 1 & 0.5 \\ 0.3 & 2 \\ -1 & 1 \end{bmatrix}, \quad p = [1, 0] $$
|
||
($p$ 只关注嵌入的第一维,比如“用户发帖数量”)
|
||
|
||
1. **计算分数**:
|
||
$$ y_t = H_t^{(l)} p = [1 \cdot 1 + 0.5 \cdot 0, \ 0.3 \cdot 1 + 2 \cdot 0, \ -1 \cdot 1 + 1 \cdot 0] = [1, 0.3, -1] $$
|
||
Top-2节点是第1、第2个节点(分数1和0.3)。
|
||
|
||
2. **加权聚合**:
|
||
$$ Z_t = \begin{bmatrix} [1, 0.5] \circ \tanh(1) \\ [0.3, 2] \circ \tanh(0.3) \end{bmatrix} = \begin{bmatrix} 0.76 & 0.38 \\ 0.09 & 0.58 \end{bmatrix} $$
|
||
(假设 $\tanh(1) \approx 0.76$, $\tanh(0.3) \approx 0.29$)
|
||
|
||
3. **输出**:$Z_t$ 是 $2 \times 2$ 矩阵,可以直接喂给GRU。
|
||
|
||
|
||
|
||
##### **步骤 2:GRU 更新权重矩阵**
|
||
|
||
$$
|
||
W_t^{(l)} = \text{GRU}(Z_t^T, W_{t-1}^{(l)})
|
||
$$
|
||
|
||
标准GRU,输入隐藏输出都是向量,这里都是矩阵!
|
||
|
||
当前时间步的输入:$Z_t^T$
|
||
|
||
上一时间步的隐藏状态:$W_{t-1}^{(l)}$
|
||
|
||
更新隐藏状态: $W_t^{(l)}$
|
||
|
||
| **标准GRU** | **论文中的矩阵GRU** | **作用** |
|
||
| ------------------------ | ------------------- | ------------------------------------------------------------ |
|
||
| $W_{xz}$ (输入→更新门) | $W_Z$ | 将当前输入 $Z_t^T$ 映射到更新门。 |
|
||
| $W_{hz}$ (隐藏→更新门) | $U_Z$ | 将上一隐藏状态 $W_{t-1}^{(l)}$ 映射到更新门。 |
|
||
| $b_z$ (更新门偏置) | $B_Z$ | 更新门的偏置项。 |
|
||
| $W_{xh}$ (输入→候选状态) | $W_H$ | 将当前输入 $Z_t^T$ 映射到候选状态。 |
|
||
| $W_{hh}$ (隐藏→候选状态) | $U_H$ | 将调制后的隐藏状态 $(R_t \circ W_{t-1}^{(l)})$ 映射到候选状态。 |
|
||
| $b_h$ (候选状态偏置) | $B_H$ | 候选状态的偏置项。 |
|
||
|
||
**GRU 的矩阵形式计算**:
|
||
|
||
1. **重置门** $R_t$:控制历史信息的遗忘程度
|
||
$$
|
||
R_t = \sigma(Z_t^T W_Z + W_{t-1}^{(l)} U_Z + B_Z)
|
||
$$
|
||
|
||
2. **更新门** $Z_t$:控制新旧状态混合比例
|
||
$$
|
||
U_t = \sigma(Z_t^T W_U + W_{t-1}^{(l)} U_U + B_U)
|
||
$$
|
||
|
||
3. **候选状态** $\widetilde{W}_t$:
|
||
$$
|
||
\widetilde{W}_t = \tanh(Z_t^T W_H + (R_t \circ W_{t-1}^{(l)}) U_H + B_H)
|
||
$$
|
||
|
||
4. **最终权重更新**:
|
||
$$
|
||
W_t^{(l)} = (1 - U_t) \circ W_{t-1}^{(l)} + U_t \circ \widetilde{W}_t
|
||
$$
|
||
|
||
- 输出 $W_t^{(l)} \in \mathbb{R}^{d \times d'}$。
|
||
|
||
|
||
|
||
##### **步骤 3:GCN 生成下一层嵌入**
|
||
|
||
使用更新的 $W_t^{(l)}$ 执行标准 GCN 操作:
|
||
$$
|
||
H_t^{(l+1)} = \sigma\left(\widehat{A}_t H_t^{(l)} W_t^{(l)}\right)
|
||
$$
|
||
|
||
- $\widehat{A}_t$ 为归一化邻接矩阵(含自环)。
|
||
|
||
---
|
||
|
||
#### **5. 关键设计细节**
|
||
|
||
1. **权重共享**:
|
||
- 所有时间步共享同一 GRU 的参数($W_*, U_*, B_*$),确保模型尺寸不随时间增长。
|
||
2. **层独立性**:
|
||
- 每一层 GCN 的权重矩阵独立演化(不同层有各自的 GRU)。
|
||
3. **特征与结构的协同**:
|
||
- 节点嵌入 $H_t^{(l)}$ 既包含特征信息,也隐含历史结构信息(通过多层 GCN 传播),因此 GRU 能间接感知结构变化。
|
||
|
||
#### 6. 所需提前训练的权重
|
||
|
||
| **参数类型** | **符号** | **维度** | **作用** |
|
||
| ---------------- | --------------- | --------------------------- | ----------------------------- |
|
||
| GCN 初始权重 | $W_0^{(l)}$ | $\mathbb{R}^{d \times d'}$ | 初始时刻各层 GCN 的初始参数 |
|
||
| GRU 输入变换矩阵 | $W_Z, W_R, W_H$ | $\mathbb{R}^{d \times d'}$ | 将输入 $Z_t^T$ 映射到门控 |
|
||
| GRU 隐藏变换矩阵 | $U_Z, U_R, U_H$ | $\mathbb{R}^{d' \times d'}$ | 将 $W_{t-1}^{(l)}$ 映射到门控 |
|
||
| GRU 偏置项 | $B_Z, B_R, B_H$ | $\mathbb{R}^{d'}$ | 门控和候选状态的偏置 |
|
||
| Summarize 参数 | $p$ | $\mathbb{R}^d$ | 动态选择重要节点 |
|
||
| 任务相关参数 | 例如 MLP 权重 | 任务相关 | 链接预测、节点分类等输出层 |
|
||
|
||
|
||
|
||
### **EvolveGCN-O**
|
||
|
||
#### **1. 核心思想**
|
||
|
||
EvolveGCN-O 通过 **LSTM** 直接演化 GCN 的权重矩阵 $W_t^{(l)}$,将权重矩阵视为 **LSTM的输出**(下一时间步的输入),**不依赖节点嵌入**。
|
||
**关键特点**:
|
||
|
||
- **结构驱动**:仅通过历史权重 $W_{t-1}^{(l)}$ 预测当前权重,完全基于图结构的动态变化。
|
||
- **轻量化**:无需处理节点嵌入,计算效率更高。
|
||
|
||
---
|
||
|
||
#### **2. 动态更新流程(第$l$层)**
|
||
|
||
**输入**:
|
||
|
||
1. 上一时间步权重 $W_{t-1}^{(l)} \in \mathbb{R}^{d \times d'}$
|
||
2. 邻接矩阵 $A_t \in \mathbb{R}^{n \times n}$(仅用于GCN计算)
|
||
|
||
**输出**:
|
||
|
||
1. 更新后权重 $W_t^{(l)} \in \mathbb{R}^{d \times d'}$
|
||
2. 下一层节点嵌入 $H_t^{(l+1)} \in \mathbb{R}^{n \times d'}$
|
||
|
||
#### 3.具体步骤分解
|
||
|
||
##### **步骤1:LSTM更新权重矩阵**
|
||
|
||
**矩阵版LSTM计算**:
|
||
|
||
1. 遗忘门:
|
||
$F_t = \sigma(W_F W_{t-1}^{(l)} + U_F C_{t-1} + B_F)$
|
||
2. 输入门:
|
||
$I_t = \sigma(W_I W_{t-1}^{(l)} + U_I C_{t-1} + B_I)$
|
||
3. 候选状态:
|
||
$\widetilde{C}_t = \tanh(W_C W_{t-1}^{(l)} + U_C C_{t-1} + B_C)$
|
||
4. 细胞状态更新:
|
||
$C_t = F_t \circ C_{t-1} + I_t \circ \widetilde{C}_t$
|
||
5. 输出门:
|
||
$O_t = \sigma(W_O W_{t-1}^{(l)} + U_O C_{t-1} + B_O)$
|
||
6. 最终权重输出:
|
||
$W_t^{(l)} = O_t \circ \tanh(C_t)$
|
||
|
||
##### **步骤2:GCN生成下一层嵌入**
|
||
|
||
$H_t^{(l+1)} = \sigma(\widehat{A}_t H_t^{(l)} W_t^{(l)})$
|
||
|
||
#### **4. 与EvolveGCN-H对比**
|
||
|
||
| **特性** | **EvolveGCN-H** | **EvolveGCN-O** |
|
||
| -------------- | -------------------------- | ---------------------------- |
|
||
| **RNN类型** | GRU | LSTM |
|
||
| **演化依据** | 节点嵌入+历史权重 | 仅历史权重 |
|
||
| **计算复杂度** | 高(需Summarize) | 低 |
|
||
| **适用场景** | 特征动态性强(如社交网络) | 结构变化主导(如路由器拓扑) |
|
||
|
||
|
||
|
||
## TGAT |