第二次作业 · TransE 知识图谱表示学习

任务说明

基于 OpenKE 实现或复现 TransE,在 FB15K237 数据集上完成训练与推理,并用链接预测指标评估模型。现存提交使用 OpenKE 官方模型、训练器、评测器与 C++ 数据后端,另写训练和测试入口。

查看实现与实验结果

从三元组到向量平移

TransE 把实体和关系嵌入到同一向量空间,并希望成立的三元组 (h,r,t)(h,r,t) 满足

h+r≈t.\mathbf h+\mathbf r\approx\mathbf t.

对应的能量函数为

f(h,r,t)=∥h+r−t∥p,f(h,r,t)=\lVert\mathbf h+\mathbf r-\mathbf t\rVert_p,

距离越小,三元组越可信。训练时用替换头实体或尾实体的方式构造负例,并用 margin ranking loss 拉开正负样本:

L=∑(h,r,t)∈S∑(h′,r,t′)∈S′max⁡(0,γ+f(h,r,t)−f(h′,r,t′)).\mathcal L= \sum_{(h,r,t)\in S} \sum_{(h',r,t')\in S'} \max\left(0,\gamma+f(h,r,t)-f(h',r,t')\right).

每步还会对实体向量做 L2L_2 归一化,避免仅靠无限放大向量尺度来改变距离。

数据集与实验设置

FB15K237 是 Freebase 子集,并移除了 FB15K 中大量可直接互推的逆关系。

项目数量
实体14,541
关系237
训练三元组272,115
验证三元组17,535
测试三元组20,466

本次实验沿用 OpenKE 的模型、训练器、评测器,以及负责负采样和链接预测的 C++ 后端。Python 脚本负责组装配置和启动训练、评测。

超参数本次运行值
嵌入维度200
距离范数L1L_1
Margin γ\gamma5.0
每个正例的实体负样本数25
每轮 batch 数100
负采样Bernoulli
已知三元组过滤开启
优化器SGD
学习率1.0
实际训练轮数250

依赖版本为 PyTorch 2.12.0、NumPy 2.4.6、scikit-learn 1.9.0 和 tqdm 4.68.2。

怎样准确复现这组结果

OpenKE 的数据加载和评测使用 C++ 后端,换机器或平台后应先重新编译:

python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

cd OpenKE/openke
bash make.sh
cd ../..

python train.py --train_times 250
python test.py

这里必须显式传入 --train_times 250。作业 README 把本次实验写成 250 轮,但 train.py 的参数默认值其实是 1000;训练日志确认结果表来自 250 轮。直接执行不带参数的 python train.py 会跑 1000 轮,不能严格复现下面这组数值。

链接预测怎样评测

对测试三元组 (h,r,t)(h,r,t),评测会分别遮住 hh 和 tt,用全部实体逐个替换,再按 TransE 分数排序。常用指标是:

  • MRR:正确实体排名倒数的平均值,越大越好;
  • MR:正确实体平均排名,越小越好;
  • Hit@KK:正确实体进入前 KK 名的比例,越大越好。

raw 会直接排列全部候选;filter 会去掉数据集中已经成立的其他三元组,避免把另一个正确答案误当作错误候选。因此通常以 filtered 指标作为主要结果,但同时保留 raw 指标便于完整复核。

TransE 实验结果

250 轮 CPU 训练耗时 3,021.1 秒,约 50 分钟;测试集链接预测约需数分钟。完整结果为:

设置预测方向MRRMRHit@10Hit@3Hit@1
Raw头实体0.0887562.680.20640.08610.0332
Raw尾实体0.2490163.780.43860.27340.1555
Raw平均0.1689363.230.32250.17980.0943
Filtered头实体0.1856313.260.35400.20850.1022
Filtered尾实体0.3825138.540.58850.43510.2744
Filtered平均0.2840225.900.47130.32180.1883

TransE 在 FB15K237 上完成链接预测后的终端结果

图:250 轮训练后,OpenKE 输出的 raw 与 filtered 链接预测结果。

这次运行中,预测尾实体明显优于预测头实体,例如 filtered Hit@10 分别为 0.5885 和 0.3540。这说明两个预测方向在该数据和模型下难度并不对称;关系的基数结构、候选歧义和 TransE 的表达能力都可能影响差异,不能仅凭这一张表把原因绝对归结为“数据大多是一对多”。

另一个边界是:这组结果只能证明当前 OpenKE 配置和 250 轮运行得到上述指标。它不等于完成了不同实现、随机种子或训练轮数之间的严格基准比较。

评论