8.2 生成式分子设计:VAE、流与扩散 本节摘要:生成式模型不是从库里检索分子,而是学习化学分布本身,从分布中采样或按条件生成新分子。本节沿技术谱系走一遍——变分自编码器的连续潜空间、自回归 SMILES 模型、流模型、直达三维的扩散模型——并把重心放在比模型选型更重要的评估阶梯上:有效、唯一、新颖、可合成、性质达标,五道检查一个不能少。 AI 编目员进阶课。8.1 节让模型学会"读"分子,本节让它学会"写"分子。虚拟筛选的局限是天花板即库的边界——生成模型的全部意义在于越过这道边界:库里没有的骨架、性质组合落在数据稀疏区的分子、口袋形状古怪的共价弹头,都从分布里造出来。 生成的分子是骡子是马,得拉出来遛 技术谱系按"生成发生在哪个空间"分四代。
本节摘要:生成式模型不是从库里检索分子,而是学习化学分布本身,从分布中采样或按条件生成新分子。本节沿技术谱系走一遍——变分自编码器的连续潜空间、自回归 SMILES 模型、流模型、直达三维的扩散模型——并把重心放在比模型选型更重要的评估阶梯上:有效、唯一、新颖、可合成、性质达标,五道检查一个不能少。
AI 编目员进阶课。8.1 节让模型学会"读"分子,本节让它学会"写"分子。虚拟筛选的局限是天花板即库的边界——生成模型的全部意义在于越过这道边界:库里没有的骨架、性质组合落在数据稀疏区的分子、口袋形状古怪的共价弹头,都从分布里造出来。
技术谱系按"生成发生在哪个空间"分四代。变分自编码器(VAE)打头阵:编码器把 SMILES 压进连续潜空间,解码器把潜向量还原成 SMILES——两个关键馈赠是插值(两个分子在潜空间中间的点解码出来常常是两者的"中间化学")与优化(把性质预测模型接到潜空间上做梯度上升,找性质更优的坐标再解码)。经典工作证明了这条路通:潜空间里走出一步,分子量、logP 平滑滑动,优化出的新分子多数有效。代价是字符串层面的还原误差——解码出来的 SMILES 有相当比例语法非法。
自回归模型把生成当写作:逐字符预测下一个 SMILES 符号,训练目标是海量分子的"接龙"。语法合法性大幅改善(模型学会了括号配对与环闭合的节奏),但化学约束是隐式的,无效与重复仍是常客。流模型用可逆变换在数据分布与标准分布之间搭桥,精确似然是它的数学美德,分子领域的应用反而少——建模离散字符串不便,大家绕道而行。扩散模型把生成搬到三维:从纯噪声坐标出发逐步去噪,直接长出带坐标的分子构象——口袋条件生成(把蛋白口袋当条件)是它的招牌应用,生成的分子天生带构象,对接即用。这四代不是替换关系:字符串模型胜在轻便,三维模型胜在结构感知,选型看任务。
模型之外,评估阶梯才是这个领域的分水岭。五道检查从松到严:
| 检查 | 问题 | 常见及格线 |
|---|---|---|
| 有效 | 解码出的 SMILES 能否解析成合法分子 | 九成上下 |
| 唯一 | 去重后还剩多少(生成模式塌缩即翻车) | 九成上下 |
| 新颖 | 与训练集不重复的占比 | 视任务,七成以上常见 |
| 可合成 | 合成可达性分数、骨架复杂度 | SA 分数中位数低于六 |
| 性质达标 | 过 ADMET 闸门与性质条件的占比 | 任务定义,个位数到两成 |
前三道是模型体检,后两道是业务体检——只在有效率上卷的生成模型,最多算个化学字符串生成器。

背景。同事训练了一个条件生成模型,宣称"能造高活性类似物",交付了一千个针对某激酶的生成分子。你的任务是按评估阶梯验收,并给出能否进入下一轮的结论。
操作。五道检查的批量流水线:
from rdkit import Chem from rdkit.Chem import rdMolDescriptors as rd from rdkit.Chem import Descriptors from rdkit.Contrib.SA_Score import sascorer # 合成可达性打分 from rdkit import DataStructs from rdkit.Chem import AllChem generated = model_samples # 一千个生成的 SMILES train_fps = [AllChem.GetMorganGenerator().GetFingerprint( Chem.MolFromSmiles(s)) for s in train_smiles] valid, unique, novel, sa_ok, prop_ok = [], [], [], [], [] for smi in generated: mol = Chem.MolFromSmiles(smi) if mol is None: continue # 第一道:有效 valid.append(smi) canon = Chem.MolToSmiles(mol) if canon in unique: continue # 第二道:唯一 unique.append(canon) fp = AllChem.GetMorganGenerator().GetFingerprint(mol) if max(DataStructs.TanimotoSimilarity(fp, t) for t in train_fps) < 1.0: novel.append(canon) # 第三道:新颖 score = sascorer.calculateScore(mol) if score < 6.0: sa_ok.append(canon) # 第四道:可合成 if rd.CalcTPSA(mol) < 140 and rd.CalcExactMolWt(mol) < 500: prop_ok.append(canon) # 第五道:性质达标(示例条件) print(f"有效 {len(valid)}/1000") print(f"唯一 {len(unique)} 新颖 {len(novel)} 可合成 {len(sa_ok)} 达标 {len(prop_ok)}")
结果。典型成绩单:有效八百七十,唯一八百一十,新颖五百七十,SA 中位数四点二(可合成过关者约七成),过示例性质条件的一百四十上下——若再叠加 7.3 节的毒性模型与对接打分,最终能进入人工评审的大约四十个。
解读。三个验收判断。其一,漏斗逐级收窄是常态,四成折损到人工评审名单,生成模型就完成了它的任务——对比一下:百万库虚拟筛选到人工评审同样只剩几十个,生成管线用千级样本达到了同量级产出,这才是它的战绩口径。其二,新颖率要配上限解读:新颖不等于好,新颖率畸高(九成以上)常常意味着模型漂出了化学合理区,生成的是"新且怪";本例五成七的新颖配合 SA 过关,属健康区间。其三,唯一率防模式塌缩:若唯一率只有三成,说明模型学会了一个高分模式的复读机,后续再调采样温度或加多样性正则,否则降级使用。
变式。按业务再走三步:性质条件生成——把生成条件从"某个激酶"细化为"某口袋形态加低 hERG 风险",条件本身用 7.3 的模型定义;骨架跃迁定向——在潜空间里以活性分子为起点、远离毒性分子为方向做插值散步,产出"像药又不撞车"的中间形态;三维口袋条件生成——扩散模型直接对着口袋造构象,产物免对接直接进 FEP 精排(7.2 节变式),这是当前生成化学与结构生物学接口上最活跃的一条流水线。