English version is preserved below.
ScoreSample-SEAL 是一个面向链路预测与候选关系预测任务的图神经网络项目。项目基于 SEAL 框架,将节点对匹配问题建模为二分类形式的链路预测任务,并通过“重要性评分采样”改进原始 SEAL 的子图提取过程,从而减少无关邻居节点带来的噪声和计算开销。
该方法适用于推荐召回、关系推荐、候选边预测等场景,尤其关注稀疏图中候选节点对的局部结构建模。
- 基于 SEAL 框架,将候选边预测转换为封闭子图分类任务。
- 使用 DRNL(Double-Radius Node Labeling)对节点进行结构标注,编码节点到两个目标节点的距离关系。
- 引入 ScoreGNN 作为节点重要性评分模块,用于评估候选邻居对目标节点对
(x, y)的贡献。 - 采用自适应子图采样策略:保留高分节点,引入少量随机节点,并对过小子图进行动态扩展。
- 使用 PyTorch Geometric 完成数据切分、负采样、子图抽取、结构标注、模型训练、评估与可视化全流程。
- 在 Cora、CiteSeer、PubMed、GitHub、USAir、C.elegans 六个公开图数据集上进行实验验证。
原始 SEAL 会为每条候选边 (x, y) 提取 n-hop 封闭子图,然后使用 DGCNN 对子图进行分类。该方法效果较好,但固定半径的子图提取容易引入与目标边关系不大的节点,尤其在局部邻域快速扩张的图中会增加噪声和计算成本。
ScoreSample-SEAL 对子图构建阶段进行了改进:
-
对目标节点
x和y提取初始 n-hop 封闭子图。 -
如果子图节点数较少,则将半径扩展为
num_hops + gamma。 -
如果子图较大,则使用预训练的 ScoreGNN 对候选邻居节点
v进行重要性评分:s_v = (s_{v,x} + s_{v,y}) / 2其中
s_{v,x}和s_{v,y}分别表示候选节点v与两个目标节点之间的预测关系分数。 -
保留重要性分数排名前
alpha%的节点。 -
从剩余候选节点中随机采样
beta%,用于保留一定结构多样性。 -
重建压缩后的子图,移除目标边,执行 DRNL 标注,并输入 DGCNN 进行最终链路预测。
flowchart LR
A["输入图"] --> B["训练 / 验证 / 测试边划分"]
B --> C["训练 ScoreGNN"]
C --> D["候选邻居重要性评分"]
B --> E["n-hop 封闭子图"]
D --> F["Top alpha% + Random beta% 采样"]
E --> F
F --> G["DRNL 结构标注"]
G --> H["DGCNN + SortPooling"]
H --> I["链路存在概率"]
DRNL 节点结构标注:
SEAL 与 ScoreSample-SEAL 框架对比:
model/score_gnn.py 实现了多种 GNN 编码器:
ScoreGCNScoreGATScoreSAGEScoreGIN
默认预测头为 HadamardMLPPredictor。它对两个节点 embedding 做 Hadamard 乘积,然后通过 MLP 输出节点对关系分数。
默认配置:
| 参数 | 取值 |
|---|---|
| 隐藏维度 | 256 |
| 输出维度 | 128 |
| GNN 层数 | 3 |
| Dropout | 0.5 |
| 学习率 | 0.01 |
| 训练轮数 | 200 |
最终分类器沿用 SEAL/DGCNN 思路:
- DRNL 标注目标节点与子图中的其他节点。
- GCN 层学习子图节点表示。
- SortPooling 将不同规模的子图转为固定长度表示。
- 1D 卷积与 MLP 输出最终二分类 logit。
默认配置:
| 参数 | 取值 |
|---|---|
| 隐藏维度 | 32 |
| GNN 层数 | 3 |
SortPooling 比例 k |
0.6 |
| 学习率 | 0.0001 |
| 训练轮数 | 50 |
默认采样参数:
| 参数 | 含义 | 默认值 |
|---|---|---|
k_min |
子图规模阈值 | 60 |
num_hops |
初始封闭子图半径 | 2 或 3,依数据集而定 |
alpha |
重要性最高节点保留比例 | 40 |
beta |
剩余节点随机采样比例 | 20 |
gamma |
小子图额外扩展跳数 | 2 |
score_fn |
节点重要性评分函数 | gnn |
代码中也实现了 Adamic-Adar 和 Personalized PageRank 两种评分方式,用于消融实验。
| 路径 | 说明 |
|---|---|
config.py |
数据集、模型、采样器和训练参数配置 |
out_manager.py |
输出目录、配置保存和日志管理工具 |
data_preprocess.ipynb |
数据加载、训练/验证/测试划分与负采样 |
score_gnn.ipynb |
训练 ScoreGNN 重要性评分模型 |
score_sample.ipynb |
基于重要性分数的子图采样与 DRNL 标注 |
ss_seal.ipynb |
ScoreSample-SEAL 主训练与评估流程 |
seal.ipynb |
原始 SEAL 基线实现 |
visualization.ipynb |
AUC/AP 曲线和实验结果可视化 |
model/score_gnn.py |
ScoreGNN 编码器和链路预测头 |
model/ssseal.py |
SEAL 风格的 GNN 分类模块 |
model/scoregnn.pth |
已保存的 ScoreGNN 权重 |
data/ |
原始、预处理和划分后的图数据 |
out/ |
训练日志、配置文件和中间输出 |
result/ |
各数据集最终实验日志 |
项目以 Jupyter Notebook 为主要运行形式,核心依赖如下:
python >= 3.10
torch
torch-geometric
numpy
scipy
scikit-learn
networkx
tqdm
psutil
jupyter
matplotlib
安装示例:
pip install torch torch-geometric numpy scipy scikit-learn networkx tqdm psutil jupyter matplotlib如果使用 GPU,请根据本地 CUDA 版本安装对应版本的 torch 和 torch-geometric。
当前项目以 notebook 组织,建议按以下顺序运行。
修改 config.py:
class Config:
version: str = "Cora"
dataset: str = "Cora"支持的数据集:
Cora, CiteSeer, PubMed, GitHub, USAir, Celegans
运行:
data_preprocess.ipynb
生成如下数据划分文件:
data/<dataset>/split/train_data.pt
data/<dataset>/split/val_data.pt
data/<dataset>/split/test_data.pt
实验中的数据划分比例为:
| 数据划分 | 比例 |
|---|---|
| 训练集 | 85% |
| 验证集 | 5% |
| 测试集 | 10% |
正负样本比例为 1:1。
运行:
score_gnn.ipynb
该 notebook 会训练重要性评分模型,并保存权重:
model/scoregnn.pth
运行:
score_sample.ipynb
生成采样后的子图数据:
data/<dataset>/split/ssseal_train_data_k<k_min>_h<num_hops>_<version>.pt
data/<dataset>/split/ssseal_val_data_k<k_min>_h<num_hops>_<version>.pt
data/<dataset>/split/ssseal_test_data_k<k_min>_h<num_hops>_<version>.pt
对于较大数据集,notebook 会先按 batch 保存正负样本子图,再进行合并,以降低单次内存压力。
运行:
ss_seal.ipynb
训练过程中会输出:
Train_AUC, Train_AP, Val_AUC, Val_AP, Test_AUC, Test_AP
原始 SEAL 基线:
seal.ipynb
实验结果可视化:
visualization.ipynb
| 数据集 | 节点数 | 边数 | 平均度 | 特征维度 |
|---|---|---|---|---|
| USAir | 332 | 2,126 | 12.81 | N/A |
| C.elegans | 297 | 2,148 | 14.46 | N/A |
| Cora | 2,708 | 5,429 | 4.00 | 1,433 |
| CiteSeer | 3,327 | 4,732 | 2.84 | 3,703 |
| PubMed | 19,717 | 44,338 | 4.50 | 500 |
| GitHub | 4,965 | 18,547 | 7.47 | N/A |
评价指标:
- AUC:ROC 曲线下面积。
- AP:平均精度。
- Time:平均每轮训练耗时。
| 数据集 | GCN | SEAL | ScoreSample-SEAL |
|---|---|---|---|
| Cora | 86.68 +/- 1.57 | 91.30 +/- 0.85 | 93.98 +/- 0.35 |
| CiteSeer | 86.01 +/- 1.72 | 85.61 +/- 1.55 | 91.10 +/- 0.65 |
| PubMed | 92.34 +/- 0.58 | 96.93 +/- 0.39 | 96.44 +/- 0.38 |
| GitHub | 88.63 +/- 1.21 | 91.27 +/- 0.54 | 91.57 +/- 0.35 |
| USAir | 95.28 +/- 0.76 | 96.99 +/- 0.31 | 97.46 +/- 0.12 |
| C.elegans | 90.72 +/- 1.32 | 89.50 +/- 0.63 | 89.87 +/- 0.44 |
| 数据集 | GCN | SEAL | ScoreSample-SEAL |
|---|---|---|---|
| Cora | 85.62 +/- 1.18 | 92.83 +/- 0.78 | 94.53 +/- 0.22 |
| CiteSeer | 86.61 +/- 0.93 | 88.62 +/- 1.02 | 93.07 +/- 0.88 |
| PubMed | 92.16 +/- 1.21 | 96.93 +/- 0.53 | 96.54 +/- 0.61 |
| GitHub | 90.20 +/- 0.72 | 92.80 +/- 0.85 | 92.39 +/- 0.49 |
| USAir | 95.78 +/- 0.86 | 97.45 +/- 0.32 | 97.64 +/- 0.38 |
| C.elegans | 88.77 +/- 1.37 | 89.28 +/- 0.69 | 89.47 +/- 1.06 |
| 数据集 | SEAL | ScoreSample-SEAL |
|---|---|---|
| Cora | 12.00 +/- 1.03 | 11.92 +/- 2.10 |
| CiteSeer | 9.80 +/- 1.11 | 8.79 +/- 1.54 |
| PubMed | 64.17 +/- 6.82 | 251.29 +/- 14.34 |
| GitHub | 87.48 +/- 7.74 | 311.23 +/- 13.13 |
| USAir | 2.92 +/- 0.48 | 3.11 +/- 0.42 |
| C.elegans | 2.96 +/- 0.39 | 2.87 +/- 0.52 |
实验结果表明,ScoreSample-SEAL 在 Cora、CiteSeer、GitHub、USAir 等数据集上取得了更高的 AUC 或 AP,尤其在稀疏图场景中提升明显。但在 PubMed、GitHub 等较大图上,重要性评分与动态采样会带来额外计算开销。
| 模型 | AUC | AP |
|---|---|---|
| Variant 1:用 GNN 重要性分数替代 DRNL | 80.44 +/- 1.92 | 81.98 +/- 1.74 |
Variant 2:保留 DRNL,固定 k 和 n |
92.09 +/- 0.61 | 93.23 +/- 0.42 |
Variant 3:固定 k,动态扩展 hop |
90.50 +/- 0.78 | 91.91 +/- 0.69 |
| Variant 4:Adamic-Adar 重要性评分 | 89.36 +/- 1.13 | 91.01 +/- 1.09 |
| Variant 5:Personalized PageRank 重要性评分 | 93.20 +/- 0.49 | 94.04 +/- 0.37 |
| ScoreSample-SEAL | 93.98 +/- 0.35 | 94.53 +/- 0.22 |
消融实验说明,DRNL 结构标注对 SEAL 类方法仍然非常关键;在保留 DRNL 的基础上,使用 GNN 学习得到的重要性评分优于手工启发式评分。
- 对大规模图,动态评分和采样会显著增加计算成本。
alpha、beta、gamma、k_min、num_hops等超参数需要手动调节。- 当前动态采样策略仍然是规则驱动的,灵活性有限。
- DRNL 是固定结构编码,对复杂结构模式的适应能力有限。
- 优化大图上的批量子图评分与采样效率。
- 引入自动化超参数搜索。
- 探索更灵活的节点重要性评估机制。
- 改进 DRNL 之外的结构标注方式。
- 将当前 notebook 工作流重构为可复用的命令行脚本。

