MolMIM(NVIDIA,2022)的目标是学习一个适合做连续优化的分子隐空间——让「在隐空间中搜索」成为分子设计的有效手段。它在技术上有意思,但「能优化隐空间」与「能发现先导物」之间还有很长的距离。
核心问题:什么样的隐空间才好用
# 分子生成模型的隐空间常见问题:
#
# 1) 【空洞】
# 隐空间中大片区域解码不出有效分子
# → 优化时容易走进死区
#
# 2) 【不连续】
# 隐空间中相近的点解码出完全不同的分子
# → 梯度优化没有意义
#
# 3) 【不均匀】
# 某些区域分子密集,某些稀疏
# → 优化路径受隐空间几何扭曲影响
#
# 4) 【维度浪费】
# 很多维度没有编码有用信息
#
# 理想的隐空间应该:
# - 稠密:任意点都能解码出有效分子
# - 连续:相近的点解码出相似的分子
# - 有信息:不同方向对应不同的化学变化
# → 【这样才能用连续优化方法搜索】
#
# MolMIM 的方法:
# 用【互信息机器(MIM)】学习目标替代 VAE 的 ELBO
#
# VAE 的问题:
# KL 项会把后验推向先验,
# 导致「后验坍缩」——隐变量没编码信息
#
# MIM 的做法:
# 显式最大化输入与隐变量的【互信息】,
# 同时鼓励隐空间的紧凑性
# → 得到更稠密、信息更充分的隐空间
隐空间优化的做法
# 一旦有了好的隐空间,可以用【无梯度优化】搜索
#
# 常用方法:CMA-ES(协方差矩阵自适应进化策略)
#
# 流程:
# 1) 把起始分子编码到隐空间:z0 = encode(mol)
# 2) 在 z0 附近采样一批隐向量
# 3) 解码成分子,用打分函数评价
# 4) CMA-ES 根据分数更新采样分布
# 5) 重复直到收敛
import numpy as np
def latent_optimize(encode, decode, score_fn, start_smiles,
n_iter=50, population=32, sigma=1.0, seed=0):
"""隐空间优化的简化示意(实际建议用 cma 库)"""
rng = np.random.default_rng(seed)
z = encode([start_smiles])[0]
best = (score_fn(start_smiles), start_smiles)
mean = z.copy()
for it in range(n_iter):
# 采样一批候选
Z = mean + sigma * rng.standard_normal((population, len(mean)))
smiles = decode(Z)
scores = np.array([score_fn(s) if s else -np.inf for s in smiles])
# 选出最好的一半,更新均值(简化的 CMA-ES)
top = np.argsort(scores)[-population // 2:]
mean = Z[top].mean(axis=0)
sigma *= 0.98 # 逐步缩小搜索范围
i = int(np.argmax(scores))
if scores[i] > best[0]:
best = (scores[i], smiles[i])
return best
# 优势(相对 RL 方法,见 137):
# 1) 不需要训练,直接搜索 —— 快得多
# 2) 打分函数可以是【不可微的黑盒】
# (对接分数、合成路线评估都可以)
# 3) 起点可控 —— 从已有分子出发做局部优化
# 4) 【适合快速迭代】:改个目标就重跑,几分钟出结果
为什么「能优化」不等于「能发现先导物」
- 优化的是打分函数,不是真实活性。这是最根本的问题。隐空间优化会精确地找到「打分函数认为好」的分子——如果打分函数不准,找到的就是打分函数的对抗样本(见 137《REINVENT 论文精读》的讨论);
- 隐空间的覆盖范围有限:模型只能生成与训练数据分布相似的分子。真正新颖的骨架可能根本不在隐空间的可达范围内;
- 优化过程会离开有效区域:即使隐空间较稠密,长距离优化后仍可能到达解码质量差的区域——需要加入「与起点的距离约束」;
- 可合成性通常被忽略:隐空间中的连续变化不对应合成路线的连续变化;
- 多目标的权衡不会自动解决:优化器只会最大化你给的分数,不会理解药物设计中的权衡;
- 实际的先导物发现需要:可靠的活性预测 + 可合成性 + 多参数平衡 + 实验验证——隐空间优化只解决了「如何搜索」这一个环节。
正确的定位与使用方式
# 把隐空间优化当作【一个高效的搜索工具】,
# 而非「分子发现系统」
#
# 合理的使用场景:
#
# 1) 【先导优化的局部搜索】
# 起点:已有活性分子
# 约束:与起点的相似性(隐空间距离)
# 目标:改善某个性质
# → 【成功率最高的场景】
#
# 2) 【多目标权衡的探索】
# 快速生成一批帕累托前沿上的候选
# 供化学家挑选
#
# 3) 【快速试验不同的目标函数】
# 因为不需要重新训练,改目标的成本极低
# → 这是相对 RL 方法的最大优势
#
# 必须配套的措施:
#
# □ 与起点的相似性约束(防止漂移太远)
# □ 有效性检查(解码后用 RDKit 验证)
# □ 结构警示过滤(见 069)
# □ 可合成性评分(SA score / RAscore)
# □ 【QSAR 模型的适用域检查】(见 166)
# —— 优化会主动走向模型不确定的区域
# □ 化学家审阅
# □ 实验验证
#
# 【一个务实的工作流】:
# 隐空间优化生成 1000 个候选
# → 过滤后剩 100 个
# → 化学家看后选 20 个
# → 合成 5~10 个
# → 测活性
# 这才是完整的循环,而生成只是第一步
与其它生成方法的比较
| 方法 | 优化方式 | 特点 |
|---|---|---|
| 隐空间优化(MolMIM) | 连续空间搜索 | 快、可用黑盒打分、易换目标 |
| 强化学习(REINVENT,见 137《REINVENT 论文精读》) | 策略梯度 | 探索范围大,需要训练 |
| 遗传算法 | 分子图上的交叉变异 | 化学操作明确,可合成性较好 |
| 扩散模型(见 162《扩散模型在药物设计中》) | 去噪生成 | 可条件生成,可加三维约束 |
| 片段/规则枚举 | 组合枚举 | 完全可控,可合成性有保证 |
一个常被低估的方法是遗传算法:直接在分子图上做化学上有意义的操作(换取代基、换环、加片段),生成的分子天然更可合成,且不需要训练任何模型。在很多实际项目中,它的性价比高于深度生成模型。
关键要点
- 好的隐空间需要稠密、连续、有信息——VAE 的后验坍缩正是要解决的问题;
- 最大优势是不需要重新训练即可换目标,且能用不可微的黑盒打分函数;
- 优化的是打分函数而非真实活性——打分不准就会找到对抗样本;
- 隐空间的可达范围受训练分布限制,真正新颖的骨架可能根本不可达。
延伸资源
- MegaMolBART:148《MegaMolBART 模型解读》;REINVENT:137《REINVENT 论文精读》;分子生成模型:158《AI 分子生成模型》;
- 不确定性:166《不确定性估计》;GuacaMol:135《GuacaMol 论文精读》;骨架跃迁:352《Scaffold Hopping 实战》。