149

MolMIM 论文精读:隐空间优化为什么不等于发现先导物

MolMIM 用互信息机器学习一个适合优化的隐空间。这篇讲清隐空间优化的原理、优势与它不等于发现先导物的原因。

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 的后验坍缩正是要解决的问题;
  • 最大优势是不需要重新训练即可换目标,且能用不可微的黑盒打分函数;
  • 优化的是打分函数而非真实活性——打分不准就会找到对抗样本;
  • 隐空间的可达范围受训练分布限制,真正新颖的骨架可能根本不可达

延伸资源