1. 药物关系预测概述与 ComplEx 模型简介
各位同学,大家好。我是这门课的主讲。
今天咱们聊聊药物关系预测。说白了,就是判断两个药——或者一个药和一个蛋白,一个药和一个疾病——之间到底存不存在某种已知或未知的关联。比如这个药能不能治那个病,这个药和另一个药一起吃会不会出事。
这问题在制药行业特别现实。我当年参与一个靶点筛选项目,文献里说A药对B蛋白有抑制作用,但我怎么都复现不出来。后来才发现,那篇论文的数据集有偏差,模型过拟合了。嗯,从那以后我每次做关系预测,都会先问一句:你的训练数据到底靠不靠谱?
好,回到正题。药物关系预测的核心,是把药物、蛋白、疾病这些实体看成节点,它们之间的相互作用看成边。我们要做的事,就是补全这张巨大的知识图谱。
1.1 从知识图谱到关系预测
先画个简单的图,帮你理解整个流程。
你想想看,从原始数据到最终的预测结果,中间经历了实体识别、关系抽取、图谱构建,最后才是嵌入学习。我建议你把这张图打印出来贴在工位上,每次跑模型之前看一眼。
1.2 为什么选择 ComplEx
知识图谱嵌入的模型很多。有 TransE、DistMult、RotatE,为什么我们要学 ComplEx?
| 模型 | 空间 | 对称关系 | 反对称关系 | 组合关系 |
|---|---|---|---|---|
| TransE | 实数 | ✗ | ✓ | ✓ |
| DistMult | 实数 | ✓ | ✗ | ✗ |
| ComplEx | 复数 | ✓ | ✓ | ✓ |
| RotatE | 复数 | ✓ | ✓ | ✓ |
关键洞察:ComplEx 把实体和关系嵌入到复数空间。这样同一个模型就能自然地处理对称和反对称关系,不需要像 DistMult 那样额外加tricks。我在项目中遇到过很多情况,药物之间的相互作用既有对称的“结合”关系,也有反对称的“抑制”关系。用 ComplEx,一个模型全搞定。
1.3 ComplEx 核心思想
ComplEx 的得分函数很简单。给定头实体 h、关系 r、尾实体 t,得分就是:
score(h, r, t) = Re( ⟨ h, r, conj(t) ⟩ )
注意三个点:
- h、r、t 都是复数向量
- conj(t) 是尾向量的复共轭
- Re(·) 表示取实部
为什么要取共轭?因为这样能让模型区分 (h, r, t) 和 (t, r, h)。我强调一下——这是 ComplEx 能同时处理对称和反对称关系的数学关键。
1.4 模型训练目标
训练的时候,我们用的是负采样加多分类损失。逻辑上来说,就是让正样本得分尽量高,负样本得分尽量低。
loss = -log(σ(score_pos)) - Σ log(σ(-score_neg))
这里的 σ 是 sigmoid 函数。我建议你用二元交叉熵来实现,代码简洁,训练稳定。
我的小技巧:负样本数量别太大,5~10倍正样本就够了。我见过有人一上来就配 100 倍,结果训练不稳定。嗯,没必要。
1.5 药物关系预测的特殊性
你可能会问:这不就是个链接预测问题吗?有什么特殊的?
有两点:
- 数据稀疏性:已知的药物-靶点相互作用只是冰山一角。大多数三元组是缺失的,而不是不存在的。
- 关系多样性:不仅有“抑制”、“激活”,还有“副作用”、“代谢”、“转运”等。我处理过的一个知识图谱,光药物-蛋白关系就有 37 种。
避坑指南:千万不要把缺失的三元组当成负样本直接训练。我曾经这么干过,结果模型把所有未见过的预测都给了零分。正确做法是做一个封闭世界假设的修正,或者用局部封闭假设。我们后面第三章会详细讲。
1.6 本章小结
今天我们梳理了药物关系预测的基本问题,清楚了 ComplEx 为什么适合这个场景。概括一下:
- 知识图谱中的关系预测就是补全缺失的三元组
- ComplEx 用复数嵌入,同时捕捉对称和反对称关系
- 得分函数简单但有效:Re(⟨h, r, conj(t)⟩)
下节课我们开始搭环境,把 ComplEx 跑起来。但今天的内容你先消化掉——理解模型比会调包重要得多。