1. 药物关系预测概述与 ComplEx 模型简介

各位同学,大家好。我是这门课的主讲。

今天咱们聊聊药物关系预测。说白了,就是判断两个药——或者一个药和一个蛋白,一个药和一个疾病——之间到底存不存在某种已知或未知的关联。比如这个药能不能治那个病,这个药和另一个药一起吃会不会出事。

这问题在制药行业特别现实。我当年参与一个靶点筛选项目,文献里说A药对B蛋白有抑制作用,但我怎么都复现不出来。后来才发现,那篇论文的数据集有偏差,模型过拟合了。嗯,从那以后我每次做关系预测,都会先问一句:你的训练数据到底靠不靠谱?

好,回到正题。药物关系预测的核心,是把药物、蛋白、疾病这些实体看成节点,它们之间的相互作用看成边。我们要做的事,就是补全这张巨大的知识图谱。

1.1 从知识图谱到关系预测

先画个简单的图,帮你理解整个流程。

药物关系预测核心流水线 实体 药物 / 蛋白 / 疾病 关系 抑制 / 激活 / 副作用 知识图谱 三元组 (h, r, t) 嵌入学习 ComplEx / TransE / RotatE 关系预测 得分函数 + 排序 说明 预测任务:补全缺失三元组 (?, r, t) 或 (h, r, ?)

你想想看,从原始数据到最终的预测结果,中间经历了实体识别、关系抽取、图谱构建,最后才是嵌入学习。我建议你把这张图打印出来贴在工位上,每次跑模型之前看一眼。

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 药物关系预测的特殊性

你可能会问:这不就是个链接预测问题吗?有什么特殊的?

有两点:

  1. 数据稀疏性:已知的药物-靶点相互作用只是冰山一角。大多数三元组是缺失的,而不是不存在的。
  2. 关系多样性:不仅有“抑制”、“激活”,还有“副作用”、“代谢”、“转运”等。我处理过的一个知识图谱,光药物-蛋白关系就有 37 种。

避坑指南:千万不要把缺失的三元组当成负样本直接训练。我曾经这么干过,结果模型把所有未见过的预测都给了零分。正确做法是做一个封闭世界假设的修正,或者用局部封闭假设。我们后面第三章会详细讲。

1.6 本章小结

今天我们梳理了药物关系预测的基本问题,清楚了 ComplEx 为什么适合这个场景。概括一下:

  • 知识图谱中的关系预测就是补全缺失的三元组
  • ComplEx 用复数嵌入,同时捕捉对称和反对称关系
  • 得分函数简单但有效:Re(⟨h, r, conj(t)⟩)

下节课我们开始搭环境,把 ComplEx 跑起来。但今天的内容你先消化掉——理解模型比会调包重要得多。