扩散模型已经成为药物设计中三维生成任务的主流方法:结合姿势预测、蛋白结构生成、基于口袋的分子设计。它的共同优势是能表达「多解」,共同短板是缺乏物理约束。
基本机制
# 两个过程:
#
# 前向(加噪):
# x_0 → x_1 → ... → x_T
# 逐步加高斯噪声,最终变成纯噪声
# 【这个过程是固定的,不需要学习】
#
# 反向(去噪):
# x_T → x_{T-1} → ... → x_0
# 训练一个网络预测「每一步应该去掉多少噪声」
# 【这是要学习的部分】
#
# 生成时:
# 从随机噪声出发,反复应用去噪网络
# → 得到一个样本
#
# 【为什么适合分子问题】:
#
# 1) 【天然表达多解】
# 同一个口袋可能有多种合理的配体姿势
# 确定性模型会「平均」它们(见 102)
# 扩散模型可以采样出不同的解
#
# 2) 【训练稳定】
# 相比 GAN 稳定得多
#
# 3) 【易于条件生成】
# 在去噪网络中加入条件(口袋结构、目标性质)
# → 分类器引导、无分类器引导
#
# 4) 【可以在任意流形上定义】
# 不限于欧氏空间:
# SE(3)(刚体变换)—— RFdiffusion(见 151)
# R³ × SO(3) × SO(2)^k —— DiffDock(见 101)
# 离散空间 —— 分子图的扩散
三大应用与实际表现
| 应用 | 代表 | 实际表现 |
|---|---|---|
| 结合姿势预测 | DiffDock(见 101《DiffDock 论文精读》) | 盲对接强;物理有效性需后处理 |
| 蛋白骨架生成 | RFdiffusion(见 151《RFdiffusion 论文精读》) | 实用,已有实验验证案例 |
| 复合物结构预测 | AF3、Boltz(见 113《AlphaFold3 论文精读》、121《Boltz-2 技术报告精读》) | 当前最强 |
| 基于口袋的分子生成 | TargetDiff、DiffSBDD 等 | 生成的分子常不可合成 |
| 构象生成 | GeoDiff、torsional diffusion | 与 RDKit ETKDG 各有胜负 |
基于口袋的分子生成:期望与现实
# 想法很吸引人:
# 给定蛋白口袋,直接生成能结合的分子
# → 跳过「生成 + 对接筛选」两步
#
# 实际问题:
#
# 1) 【生成的分子常常不可合成】
# 模型学的是「什么样的分子出现在口袋里」,
# 完全不知道「这个分子怎么合成」
# → 生成大量含奇怪环系、
# 不稳定基团的分子
# → 【必须加可合成性过滤,通过率可能很低】
#
# 2) 【物理有效性问题】
# 键长键角异常、与蛋白冲突、手性错误
# → 用 PoseBusters 检查(见 096)
#
# 3) 【训练数据的局限】
# 可用的蛋白-配体复合物结构只有数万个
# → 相比分子生成模型的千万级训练数据,
# 数据量少得多
# → 【泛化到新口袋的能力有限】
#
# 4) 【评估困难】
# 生成的分子没有实验数据
# → 只能用对接分数评估
# → 而对接分数本身不可靠(见 095)
# → 【循环论证的风险】
#
# 5) 【实验验证案例仍很少】
# 公开发表的、经实验证实有活性的
# 「基于口袋生成」的分子案例不多
#
# 【务实的用法】:
# 把它当作【产生结构假设的工具】
# 生成 → 过滤(可合成性、警示、性质)
# → 对接验证 → 化学家审查 → 少量合成
# 而非「自动设计药物」
让扩散生成的结果可验证
# 【这是使用所有扩散模型的通用要求】
#
# 第 1 步:【多次采样看一致性】
# 同一输入采样 10~40 次
# → 结果高度一致 = 模型有信心
# → 结果分散 = 该体系不可靠
# 【这是最实用的可信度判据】
#
# 第 2 步:【物理有效性检查】
# PoseBusters(姿势)
# RDKit 有效性(分子)
# 键长键角、立体化学、空间冲突
#
# 第 3 步:【局部优化修正】
# 用 smina --minimize(见 100)
# 或力场最小化
# → 修正轻微的几何问题
#
# 第 4 步:【独立方法交叉验证】
# 姿势:与 Vina/GNINA 比较(见 346)
# 结构:与 AF2/其它模型比较
# 分子:用对接、药效团独立评估
#
# 第 5 步:【领域知识审查】
# 化学家/结构生物学家看一遍
# → 是否符合已知的 SAR 与结合模式
#
# 第 6 步:【实验验证】
#
# 【核心原则】:
# 扩散模型的输出是【假设】,不是【结论】
# 假设必须可验证,否则没有价值
import numpy as np
from rdkit.Chem import rdMolAlign
def sampling_consistency(poses, threshold=2.0):
"""多次采样的一致性评估"""
n = len(poses)
rmsds = []
for i in range(n):
for j in range(i + 1, n):
try:
rmsds.append(rdMolAlign.CalcRMS(poses[i], poses[j]))
except Exception:
continue
rmsds = np.array(rmsds)
agree = (rmsds < threshold).mean()
return {
"median_rmsd": float(np.median(rmsds)),
"agreement_fraction": float(agree),
"verdict": "高一致性" if agree > 0.7 else
"中等" if agree > 0.4 else "不可靠",
}
技术要点
- 在正确的流形上扩散:这是设计的关键。DiffDock 在姿势自由度上扩散而非原子坐标,RFdiffusion 在 SE(3) 上扩散——选对流形能自动保持化学合理性,且大幅降低学习难度;
- 等变性:三维扩散必须用等变架构(见 160《等变神经网络》),否则旋转输入会得到不同结果;
- 去噪步数的权衡:步数多质量好但慢;实践中 20~200 步;
- 条件引导的强度:无分类器引导的权重控制「多样性 vs 符合条件」的平衡;
- 自条件化:把上一步的预测作为输入,能显著提升质量(RFdiffusion 使用)。
与其它生成方法的定位
| 扩散模型 | 自回归 + RL | 遗传算法 | |
|---|---|---|---|
| 三维生成 | 天然支持 | 困难 | 困难 |
| 条件生成 | 强 | 通过奖励函数 | 通过打分 |
| 目标优化 | 较弱 | 强 | 强 |
| 可合成性 | 弱 | 可通过奖励约束 | 天然较好 |
| 速度 | 慢(多步) | 中 | 快 |
| 训练成本 | 高 | 中 | 无需训练 |
关键要点
- 在正确的流形上扩散(姿势自由度、SE(3))比在原子坐标上扩散更有效;
- 天然表达多解,避免了确定性模型「回归到均值」的问题;
- 共同短板是缺乏物理约束——基于口袋生成的分子常常不可合成;
- 多次采样的一致性是最实用的可信度判据;输出是假设不是结论。
延伸资源
- DiffDock:101《DiffDock 论文精读》;RFdiffusion:151《RFdiffusion 论文精读》;Boltz:120《Boltz-1 技术报告精读》、121《Boltz-2 技术报告精读》;
- 等变网络:160《等变神经网络》;分子生成模型:158《AI 分子生成模型》;姿势验证:096《Binding Pose》。