101

DiffDock 论文精读:扩散模型如何做盲对接

DiffDock 把对接重新表述为扩散生成问题。这篇讲清它的方法设计、评估争议与实际可用性。

DiffDock(Corso 等,2023)提出了一个与传统对接完全不同的思路:不搜索、不打分,而是用扩散模型直接「生成」结合姿势。它是深度学习对接方法中影响最大的一个,也是争议最多的一个。

核心思想:在什么空间上扩散

# 传统对接:
#   在配体的位置/取向/扭转角空间中搜索,
#   用打分函数评价每个候选
#
# DiffDock:
#   把姿势生成看作从噪声逐步去噪的过程
#
# 关键设计:不在原子坐标上扩散,
#          而在「配体姿势的自由度」上扩散
#
#   平移:3 维(R³ 空间)
#   旋转:3 维(SO(3) 群)
#   扭转:k 维(可旋转键,每个是一个圆 —— SO(2))
#
#   → 整体是一个乘积流形:R³ × SO(3) × SO(2)^k
#
# 为什么这样设计:
#   1) 自动保持配体的键长键角合理
#      (因为不改变这些内部自由度)
#   2) 维度远低于全原子坐标
#      → 扩散过程更容易学
#   3) 与对接问题的物理结构一致
#
# 这个「在正确的流形上做扩散」的设计
# 是论文最有价值的贡献

两个模型:生成 + 置信度

模型 作用 输出
扩散模型(score model) 从噪声生成候选姿势 N 个姿势(默认 10~40)
置信度模型(confidence model) 对候选姿势排序 每个姿势的置信度分数

置信度模型是独立训练的分类器:判断「这个姿势的 RMSD 是否 < 2 Å」。它取代了传统的打分函数——但它预测的是「像不像训练数据中的正确姿势」,而非结合强度。这个区别常被误解。

论文报告的结果

  • 盲对接(不给口袋位置)上大幅领先:在 PDBBind 测试集上,DiffDock 的 top-1 RMSD < 2 Å 成功率约 38%,远高于传统对接方法在盲对接设置下的表现(通常 < 20%);
  • 速度快:GPU 上每个复合物数秒到十几秒;
  • 可给出多个候选:top-5 的成功率显著高于 top-1,说明正确姿势常在候选集中。

后续评估揭示的问题

# 问题一:物理有效性差
#   PoseBusters 论文(2023)系统检查发现:
#   DiffDock 生成的姿势中,相当比例存在
#     - 与蛋白的空间冲突
#     - 键长键角异常
#     - 立体化学错误
#     - 配体部分伸出蛋白外
#
#   → 「RMSD < 2 Å」的成功率在加上物理有效性检查后
#      显著下降
#
#   原因:模型没有显式的物理约束,
#         只是在学习数据分布

# 问题二:泛化能力存疑
#   在与训练集蛋白序列相似度低的新靶点上,
#   成功率明显下降
#   → 模型可能相当程度上在「记忆」训练集中的
#      蛋白-配体结合模式

# 问题三:评估设置的可比性
#   与传统对接比较时,传统方法用的是盲对接设置
#   (不给口袋位置)——这对传统方法非常不利
#   实际使用中,口袋位置几乎总是已知的
#   在「给定口袋」的设置下,差距大幅缩小

# 应对:
#   1) 必须用 PoseBusters 检查(见 096)
#   2) 用 smina --minimize 修正物理不合理的姿势(见 100)
#   3) 在自家靶点上验证,不采信公开基准成绩

实际使用建议

# 安装(推荐用官方 conda 环境)
git clone https://github.com/gcorso/DiffDock.git
cd DiffDock
conda env create -f environment.yml
conda activate diffdock

# 运行
python -m inference \
  --protein_path receptor.pdb \
  --ligand_description "CC(=O)Nc1ccc(O)cc1" \
  --out_dir results/ \
  --samples_per_complex 40 \
  --inference_steps 20

# 关键参数:
#   samples_per_complex  生成多少候选(越多越可能包含正确姿势)
#   inference_steps      去噪步数(影响质量与速度)
#
# 输出:rank1.sdf, rank2.sdf, ... 按置信度排序
#      文件名中含置信度分数

# 必做的后处理流程:
#   1) PoseBusters 检查所有姿势 → 剔除物理不合理的
#   2) smina --minimize 优化保留的姿势
#   3) smina --score_only 得到经验打分作为第二判据
#   4) 相互作用核对(见 109)
#   5) 与 Vina/GNINA 结果比较一致性(见 096)
#
# 只用 rank1 而不做这些检查,是最常见的误用

它适合什么场景

场景 适用性
口袋位置未知 最适合——这是它的原生优势
探索可能的结合位点 适合,作为假设生成
与传统方法交叉验证 推荐——原理不同,一致性有意义
口袋已知的常规对接 优势不明显,Vina/GNINA 更成熟
大规模虚拟筛选 不适合——无可靠的亲和力信号
先导优化的细微排序 不适合

方法学上的启示

  • 选对流形比堆网络更重要:在 R³ × SO(3) × SO(2)^k 上扩散,而非全原子坐标,是论文成功的关键;
  • 生成 + 排序的两阶段范式被后续很多工作沿用;
  • 缺少物理约束是深度学习方法的共同短板:这催生了后续在损失函数中加入物理项、或在推理时做物理精修的一系列工作;
  • 基准的可比性问题:DiffDock 引发的讨论推动了 PoseBusters 等更严格评估标准的建立(见 241《DUD-E》)。

关键要点

  • 核心贡献是在 R³ × SO(3) × SO(2)^k 流形上做扩散,而非全原子坐标;
  • 置信度分数不是亲和力,它预测「姿势像不像正确的」;
  • 相当比例的姿势通不过物理有效性检查——必须用 PoseBusters + 局部优化后处理;
  • 它的原生优势是盲对接;口袋已知时相对传统方法优势不明显。

延伸资源