链接预测里,边有双重身份:既可能是消息传递的输入,也可能是要预测的答案。先区分这两份数据,再训练编码器和解码器。

两种边列表各做什么

数据 作用 需要检查
消息传递边 构建节点表示 不包含当前评估的待预测正边及其反向副本
监督边 计算边分数与损失 与标签逐项对应,划分与负采样有记录

PyG 常用 edge_index 表示前者,edge_label_index 与 edge_label 表示后者。RandomLinkSplit 可以建立划分,但仍需按协议检查无向关系、反向边类型、训练监督边是否与传播边分离等选项。官方接口说明

固定输入图的评估可以始终只用训练边;另一些协议会在最终测试时允许使用已观察到的验证边。两者不能混报。无论选哪种,测试目标边都不能提前进入其编码输入;时间预测还需按当时可见的信息构图。

独立的无向边检查

这个示例只检查集合关系,不实现图模型,也不声称发现了真实世界中不存在的关系。

from itertools import combinations

def undirected(edge):
    u, v = edge
    if u == v:
        raise ValueError("self-pairs are excluded in this example")
    return tuple(sorted((u, v)))

train = {undirected(edge) for edge in [(0, 1), (1, 2)]}
validation = {undirected((2, 3))}
test = {undirected((0, 3))}
observed_positives = train | validation | test
message_edges = train.copy()
assert not (message_edges & validation)
assert not (message_edges & test)
assert undirected((3, 0)) in test

negative_candidates = set(combinations(range(4), 2)) - observed_positives
assert negative_candidates
assert not (negative_candidates & observed_positives)
print("held-out edge and reverse-edge checks passed")

这里用完整已知正边集合排除静态基准的假负样本,只用于构造该玩具评估集;不能把未来标签用于部署时的预测特征。在开放世界数据里,未观察到的边也不一定是真负例,需要说明标注和采样假设。

分数、概率和排名不要混淆

内积解码器输出实数分数,不天然处于 0 到 1;需要概率形式时才使用相应映射。使用带 Logits 的二元损失时,不要先手动重复施加 Sigmoid。

AUC、AP、MRR 或 Hits@K 回答不同的问题,比较时必须固定候选集合、负采样比例和过滤规则。尤其不能把 Hits@K 一律写成 Precision@K。训练中根据验证集选择方案,最终测试只用于报告,不根据每轮测试分数挑模型。

来源与核验边界

本篇结合疏锦行图神经网络专题《链接预测》讲义第 4—8 页,重新整理输入边、监督边和评估协议的区别。集合检查已运行;没有复现 Cora AUC,也没有训练推荐系统。视频尚未逐节核验,付费课件和代码包不公开。