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的中间,直接废了。
TransH:超平面投影——把关系“拍扁”
TransH的核心思路很简单:每个关系r定义一个超平面(法向量 wr),把头实体和尾实体投影到这个超平面上再做平移。公式长这样:
h⟂ = h - wᵣᵀ h wᵣ
t⟂ = t - wᵣᵀ t wᵣ
损失: ||h⟂ + r - t⟂||²
投影之后的向量可以落在超平面的不同位置。1-N关系呢?只要把不同尾实体投影到超平面上不同区域,头和尾的平移差就能分开。我试过在药物-靶点数据集上跑TransH,F1直接比TransE高了12个点。
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:三个模型的核心逻辑
实践中的选择策略
我个人选模型时有一套原则:
- 关系类型数 < 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关系特别多的数据集,负采样策略要调整为“针对每个尾实体采样更多负例”,不然模型学不到区分度。