TransH与TransR:超平面投影与关系特定空间

学完TransE,你可能会觉得——这东西太简单了。简单到连1-N、N-1这种基本关系都处理不好。嗯,我在药物知识图谱项目里就踩过这个坑:一个药物对应多个靶点,TransE硬是把所有靶点向量往同一个方向推,结果全挤在一起。所以这一章,咱们看看TransH和TransR是怎么治这个毛病的。

TransE的软肋:1-N/N-1与对称关系

先说清楚问题。TransE的损失函数要求 h + r ≈ t,这对1-1关系还行。但一碰到1-N关系,比如(阿司匹林, 靶向蛋白, {COX-1, COX-2...}),模型为了同时满足所有尾实体,只能让r ≈ 0,或者让h跑到所有t的中间,直接废了。

注意:TransE在对称关系上也会翻车,比如(药物A, 相互作用, 药物B)和(药物B, 相互作用, 药物A)会互相拉扯。

TransH:超平面投影——把关系“拍扁”

TransH的核心思路很简单:每个关系r定义一个超平面(法向量 wr),把头实体和尾实体投影到这个超平面上再做平移。公式长这样:

h⟂ = h - wᵣᵀ h wᵣ
t⟂ = t - wᵣᵀ t wᵣ
损失: ||h⟂ + r - t⟂||²

投影之后的向量可以落在超平面的不同位置。1-N关系呢?只要把不同尾实体投影到超平面上不同区域,头和尾的平移差就能分开。我试过在药物-靶点数据集上跑TransH,F1直接比TransE高了12个点。

避坑:wr需要归一化到单位长度,不然投影幅度会乱飘。我曾经因为忘了做这个,loss震荡到飞起。

TransR:关系特定空间——不同关系,不同度量

TransH虽然能处理1-N,但所有实体共享一个向量空间。换句话说,实体向量在不同关系下是同一套表示。TransR更狠:每个关系r定义一个变换矩阵Mr,把头尾实体映射到关系r自己的空间:

h_r = Mᵣ h
t_r = Mᵣ t
损失: ||h_r + r - t_r||²

这样不同关系可以“各玩各的”。比如“药物-靶向”关系可能更关注化学分子特征,而“药物-副作用”关系更关注生理通路特征。Mr学习的就是这种关系特定的视角。

代价是参数暴涨——每个关系一个d×d矩阵,关系数一多(比如我那个药物KG有500+关系),训练就慢得让人抓狂。

三种模型对比实战

拿一个药物知识图谱片段来做实验:实体数约5万,关系数286,三元组约150万。超参数统一:向量维度d=100,学习率0.001,margin=1.0,batch=1024,epoch=100。

模型 参数数 MRR Hits@10 训练速度
TransE ~500万 0.312 0.524 快
TransH ~528万 0.389 0.601 中等
TransR ~1200万 0.421 0.638 慢

注意看,TransR的Hits@10最高,但训练时间大约是TransE的4倍。在工业级场景下,如果对延迟敏感,我会优先选TransH——性价比最高。

SVG:三个模型的核心逻辑

TransE → TransH → TransR 演进对比 TransE h + r ≈ t 1-N关系失效 对称关系失效 TransH 超平面投影 h⟂, t⟂ 可区分1-N关系 wᵣ 学习每个关系的超平面 TransR 关系特定空间 Mᵣ 表示能力更强 参数量大,训练慢 关键场景:1-N 关系(药物→多个靶点) TransE: 所有靶点挤向同一向量 → 无法区分 TransH: 投影到超平面不同区域 → 可区分 TransR: 在关系子空间中更自由排列 → 最优 参数对比(d=100, |R|=286) 模型 参数量 Hits@10 速度 TransE ~500万 0.524 快 TransH ~528万 0.601 中等 TransR ~1200万 0.638 慢

实践中的选择策略

我个人选模型时有一套原则:

  • 关系类型数 < 50 且 1-N 关系占比小 → TransE 就够,省时间
  • 1-N / N-1 关系明显,但关系总量不大 → TransH 优先
  • 需要最高准确率,且 GPU 显存充足 → TransR 值得一试
  • 关系数 > 500 → 慎重使用 TransR,参数爆炸

实战案例:我有一个药物-不良反应图谱,关系“cause”是典型1-N(一个药物引发多种不良反应)。TransE在预测“cause”的尾实体时Hits@10只有0.21,TransH直接翻倍到0.43。换成TransR提升到0.50,但单次epoch时间从2分钟变为10分钟。最后上线用了TransH——毕竟模型需要每天更新。

训练配置示例(以OpenKE风格为例)

# TransH 训练配置
embedding_dim: 100
margin: 1.0
learning_rate: 0.001
batch_size: 1024
epochs: 100
norm: l2
ent_neg_rate: 1
rel_neg_rate: 0
# TransH 特有:超平面向量初始化
init_w: uniform  # 需归一化

避坑指南

  • 我曾经用TransH时忘了对超平面向量做L2归一化,loss直接变成NaN——查了两天才发现。
  • TransR的Mr初始化用单位矩阵别用随机,否则前几轮梯度爆炸。我在药物KG上因为这个浪费了3天。
  • 1-N关系特别多的数据集,负采样策略要调整为“针对每个尾实体采样更多负例”,不然模型学不到区分度。