假设你是一家“分子积木工作室”的老板,药剂公司送来委托:请设计一个全新分子,要能抑制某个靶点、还要容易合成。传统做法是化学家手工在图纸上改结构,像师傅把每一块砖的位置都亲手标出来,改一版要好几周,多数改法一化验就作废。工作室里来了三支队伍:第一队先拆装——把见过的分子拆成标准积木包,再像拼积木一样拼出新分子(JT-VAE);第二队是逐笔画家——不打包,从第一个原子起一笔一笔画完整座城堡(GraphAF);第三队是雕塑家——搬来一块乱石(噪声),一锤一锤凿出分子骨架(扩散模型)。本文就用这三位师傅的故事,讲清三种图神经网络分子生成方法的工作机制、有效性率与性质导向能力,以及它们如何服务于逆合成,帮你在 AI 制药领域建立一张从入门到进阶的地图。
掌握分子生成三种范式的原理与取舍,是进入 AI 制药的核心能力:无论做算法研究还是工程落地,你都能判断该用哪个模型、怎么用。
可视化演示
展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。
本节配有交互动效(进入视口后自动加载,约 3KB)。
系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T
分子生成概述
想象你是一家“分子积木工作室”的老板,药剂公司送来委托:请设计一个全新分子,要求能抑制某个靶点,还要容易合成。传统做法是化学家手工在图纸上改结构,就像师傅把每一块砖的位置都亲手标出来,改一版要几周,大部分改法一化验就是废品。工作室决定引入三支 AI 队伍,让模型学习“怎么写新图纸”。
分子本质上是一张图——原子是节点,化学键是边。所谓分子生成,就是让神经网络学会给这张图发明新画法:输入一堆已知分子,模型就能吐出一批全新的、化学上合理的图。这张图的定义,就是所有生成任务的图纸语言,也是后面每一位师傅手里的标尺。
业界沉淀出三条主流路线:第一条“拆装式”(JT-VAE),先把分子拆成官能团子结构,再以子结构为单位编码与重组;第二条“逐笔式”(GraphAF),从第一个原子开始,自回归地一笔笔添加原子和键;第三条“雕刻式”(扩散模型),从随机噪声出发,逐步去噪还原出分子骨架。它们的目标都写在同一个公式里——让模型学到的分子分布尽量接近真实数据分布。
就像积木工作室必须先写明“砖块规格”一样,分子图的定义是所有生成方法的共同语言。理解了这张图纸,后面三位师傅的手法差异就一目了然了。
- 节点与边分子被抽象成一张图,V 是原子集合,E 是原子对的化学键集合。
- 原子类型每个节点携带一种原子类型,比如碳 C、氧 O、氮 N,它们组成字母表 A。
- 化学键类型每条边用 K 维独热向量表示键的种类(单键、双键、芳香键等)。
JT-VAE架构
第一支队伍是“拆装大师”。他们从不一粒砖一粒砖地硬拼,而是先把仓库里所有城堡拆成标准积木包:门窗包、塔楼包、围墙包。设计新城堡时,只需要选包、连包,而不是从零摆砖。这一招让他们的设计速度快得惊人。
JT-VAE(Junction Tree VAE,接合树变分自编码器)正是这位大师。它先对分子做树分解:把分子切成若干化学上合理的子结构(如苯环、羰基、氨基),子结构作为树的节点,子结构之间的连接作为树的边。于是分子变成一棵“接合树”加每个节点内部的原子细节,编码量大幅下降。
架构上,它有两套编码器加一个解码器。树编码器把接合树读成潜向量 z;图编码器把原始分子图也读成一个 z;解码器再根据 z 先重建接合树,再为每个树节点恢复原子排布。问题来了:同一分子,树视角和图视角得出的 z 必须口径一致,否则生成产物会“精神分裂”。于是作者给模型加了联合训练目标。
拆装大师省下的功夫是巨大的:生成单位从“原子”变成“积木包”,就像从数砖块升级到数门窗。这让他成为三条路线里潜空间插值最顺滑的选手,也为后面的性质导向生成埋下伏笔。
- 重构项从潜码 z 还原分子的对数概率,这部分越大说明压缩后信息保留得越好。
- 树先验对齐让树编码器给出的潜码分布向标准正态先验靠拢,方便生成时从先验采样。
- 图树一致让图编码器的分布与树编码器保持一致,保证“拆解视角”和“整图视角”不打架。
JT-VAE流程
拆装大师的工作台上有四道工序:备料、拆解、压缩、组装。备料是把训练集里所有分子过一遍筛子,把反复出现的子结构收进“积木包词典”;拆解是把每个分子递归切成挂在树上的积木包;压缩是把整棵树的包序列读成潜码;组装则是从潜码出发把分子拼回来。
备料与拆解对应词典构建和树分解。词典决定生成器的“词汇量”:包太少表达力不足,包太多又难学。拆解则要把“怎么切”学成概率模型,切法越接近化学直觉,重建越容易。JT-VAE 用约简模块从分子中提取这些子结构,保证切出来的包能覆盖训练集的大多数分子。
压缩与组装才是模型真正学习的重点。压缩时,树编码器把每个积木包的嵌入按树结构聚合,得到全局潜码 z;组装时,解码器从 z 出发,用循环网络一步步决定先放哪个包、包与包怎么连、包内原子键怎么补全。每一步都是一个分类问题:在整本词典里挑最合适的包。
这四道工序让拆装师能站在“半成品”上思考:他不需要凭空想象一整座城堡,只需在已有包旁边挑下一个包。这种局部性正是它高效又高有效性的秘密——毕竟,拼积木包永远比摆单砖更不容易散架。
- 循环生成GRU 记住已经生成的积木包顺序,输出当前步的隐藏状态。
- 拼接输入把全局图纸编号 z 和上一步选择的嵌入 e_{j-1} 拼在一起,让生成器同时看到“总设计图”和“当前进度”。
- 软选择softmax 把得分变成整个词典上的概率分布,从中采样确定下一个积木包。
GraphAF自回归
第二支队伍是“逐笔画家”。他们不服打包理念:每座城堡都是独一无二的,我要从第一笔开始,一笔一笔把整座城堡画完。每一笔都参考已经画好的部分,绝不照搬标准包。这种“边画边想”的风格,在化学上意味着更高的表达自由。
GraphAF(Graph Autoregressive Flow,图自回归流)正是这种画法。它把生成一个 N 个原子的分子拆成 N 步:每步先放下一个新原子并决定其类型,再决定它与之前所有原子之间是否连键、连什么键。每一步的输出都建立在完整的已生成子图之上。
这种设计带来两个鲜明特点。一是极强的条件性:每一步都能利用全部已生成结构,局部细节丰富,生成的新颖结构多。二是代价:步数等于原子数加边数,分子一大,计算开销就明显上升,生成速度远不如“打包派”。
逐笔画家最擅长画“不重复”的作品——它不依赖固定包,所以新奇性往往更高。但它每一步都要停下来端详已画的部分,走得慢;分子变大时,“画错一笔后面都要改”的风险也随之上升。
- 条件记号G_{<i} 表示前 i-1 步已生成的部分图,后续所有决策都以它为条件。
- 原子自回归逐个原子地生成类型,每步只看前面已经画好的部分。
- 建边决策新原子到位后,还要决定它与每个已有邻居之间连什么键。
扩散模型生成
第三支队伍是“雕塑家”。他们入场时搬来一块棱角分明的乱石,说:城堡不是画出来的,是凿出来的。我们先把乱石慢慢凿成城堡,生成时就从一块新乱石开始,逐步去掉多余部分。这种“整体塑形”的思路,和逐笔画家的局部决策截然不同。
扩散模型的训练分正向与逆向。正向过程(加噪)把训练集里的分子图逐步加噪声,直到完全淹没成随机噪声;逆向过程(去噪)训练一个网络,学会把噪声一步步还原成分子。生成时只运行逆向过程——这就像雕刻家先学“如何把成品凿回乱石”,再倒放这个过程来创作。
对图数据,噪声加在原子特征与邻接矩阵上。由于分子是离散图,直接加连续高斯噪声容易产生“键数违背价态”的畸形图,所以研究者常用离散扩散(在特征分布上加噪声),或为去噪网络附加化学价约束。这也是扩散模型在分子领域落地时必须跨过的一道坎。
雕塑家最大的本钱是“全局观”:从噪声还原的过程天然考虑整张图的分布,不依赖任何生成顺序。但代价是迭代步数多、计算重;如果离散约束处理不好,有效性率会明显缩水——这是它和拆装大师最大的差距。
- 前向加噪每一步保留一部分原信息、掺入 β_t 强度的噪声,逐步把分子推成随机图。
- 去噪学习网络接收被污染的图和当前步数 t,输出对噪声向量的预测。
- 均方误差真实噪声与预测噪声之差的平方求期望,这是整个训练过程的优化目标。
方法对比评估
三支队伍把作品摆上评审台。老板只看两个硬指标:第一,你交上来 100 个分子,有几个化学上成立?这叫有效性率。第二,成立的分子里,多少满足客户要的性质?这叫性质导向能力。两把尺子缺一不可。
有效性率是“像不像分子”,要求价键规则、连通性、稳定基团都说得通。参考经验:JT-VAE 在常见基准(如 ZINC)上有效性可接近 100%;GraphAF 约 93% 左右;扩散模型直接生成常偏低,但加上价态约束后也能到 90% 以上。请注意,这个数字是“门槛”,不是“奖杯”。
性质导向是“有没有用”。JT-VAE 的潜空间平滑,可沿性质梯度插值(比如优化 logP 脂水分配系数);GraphAF 能在每一步把性质预测器接入节点的选择;扩散模型则在去噪过程中用性质条件引导生成。三者都能做性质导向,机制却完全不同:一个改图纸,一个改笔法,一个改石头纹理。
把三支队伍放回积木工作室:拆装师最快、包质量最稳,适合大规模遍历候选空间;逐笔画家最细、作品最新奇但慢,适合探索陌生骨架;雕塑家格局大、全局观强,但费工费时。选谁,取决于任务要“量”还是要“新”。
- 有效性率把生成的分子送去校验,化学上合法的个数 N_valid 除以生成总数 N_gen。
- 性质评分对每个生成分子计算目标性质函数 f(如溶解度、药效打分),再对一批分子取平均。
- 两指标互补有效性率管“像不像分子”、性质评分管“有没有用”,二者需要联合优化。
逆合成应用
除了设计新城堡,工作室还接一类“拆城单”:客户拿着一座城堡问,能不能拆成市场上买得到的标准包,让我照着拼出来?这就是逆合成——制药行业最贵的单子之一,因为合成路线决定了一个候选药物能不能真正做出来。
分子生成模型天然是逆合成的底模。JT-VAE 的树分解本身就是“如何把目标分子切回积木包”的概率模型,训练好的分解器可以直接输出候选前体组合;GraphAF 与扩散模型作为生成器,也可以反过来为“目标分子→前体”的拆分方案打分排序。生成是“片段→分子”,逆合成是“分子→片段”,方向相反,却共享同一套图表示。
逆合成任务从目标分子出发,预测多个可购买前体片段及其组装顺序,构成一条合成路线。用生成模型做逆合成的优势在于:它不依赖人工模板库,能从数据里自动学到“哪些官能团适合切开”,从而覆盖更多新颖骨架。
逆合成让生成模型从“造梦师”升级为“拆解师”。当三支队伍都会拆城,药企就能从“随机试错”走向“按图索骥”——这正是分子生成与逆合成被放在同一章节的原因:一次学会拆装,双倍价值落地。
- 条件建模模型输出的是“前体组合 G_prec”在给定目标分子下的条件概率。
- 逐片段分解像 JT-VAE 拆积木一样,每次切下一个片段 M_k,且每一步都参考已切下的部分。
- 前体集合最终的前体是一组可购买小分子片段的集合,它们能被拼回目标分子。
AI 应用场景
AI 药物先导物优化
阶段:分子生成与性质筛选
解决的问题:传统先导物优化靠化学家凭经验改造活性分子,再逐一合成测试,一轮要数月、成本极高。用 JT-VAE 把已知活性分子编码进潜空间,在多个活性分子之间插值或沿性质梯度上升,能批量产出候选类似物,再用性质预测器预筛,把湿实验规模缩小一到两个数量级。
具体案例:某药企对一款激酶抑制剂骨架用 JT-VAE 生成 5000 个类似物,先按 logP 与合成可及性过滤到 50 个,再进湿实验,命中率显著高于随机筛选——这正是“拆装大师”在真实管线里的拿手戏。
逆合成路线规划
阶段:路线规划与片段选择
解决的问题:逆合成分析长期依赖专家经验,一个复杂分子可能要拆整整一周。生成模型的分解器学到“哪些官能团适合切开”,对目标分子直接输出多个可行的前体组合,化学家只需在 Top-K 路线里验证少数几条。
具体案例:制药企业把 JT-VAE 分解器接到商用试剂库上,对候选分子自动生成 Top-K 合成路线,再交化学家评估成本与产率。原需数天的拆解工作被压缩到分钟级,且覆盖了人工容易遗漏的新颖切断点。
材料与催化剂筛选
阶段:属性导向生成与高通量预筛
解决的问题:新材料候选空间近乎无限,纯实验遍历不可行。GraphAF 或扩散模型以目标属性(如带隙、稳定性)为条件生成候选结构,配合 DFT 高精度验证,能显著缩小搜索空间。
具体案例:某研究组用条件扩散模型生成 10 万个小分子催化剂候选,按带隙与稳定性排序后,前 100 名进入高精度计算验证,最终筛选出的分子比传统数据库挖掘找到的候选活性更高。
Python 演示
import itertools class Molecule: """用原子类型与无向边表示的最小分子图。""" def __init__(self, atoms, edges): self.atoms = atoms self.edges = set(edges) self._neighbors = self._build() def _build(self): nb = {i: set() for i in range(len(self.atoms))} for i, j in self.edges: nb[i].add(j) nb[j].add(i) return nb def connected_subgraphs(self, max_size): """枚举所有大小不超过 max_size 的连通子图。""" subs = [] nodes = list(range(len(self.atoms))) for size in range(1, max_size + 1): for combo in itertools.combinations(nodes, size): if self._is_connected(combo): subs.append(frozenset(combo)) return subs def _is_connected(self, nodes): if not nodes: return False seen = {nodes[0]} stack = [nodes[0]] while stack: cur = stack.pop() for nb in self._neighbors[cur]: if nb in nodes and nb not in seen: seen.add(nb) stack.append(nb) return len(seen) == len(nodes) def build_vocab(molecules, max_size=3): """统计训练集中的子结构,出现多次的收进'积木包词典'。""" counter = {} for mol in molecules: for sub in mol.connected_subgraphs(max_size): counter[sub] = counter.get(sub, 0) + 1 return [sub for sub, cnt in sorted(counter.items(), key=lambda x: -x[1]) if cnt >= 2] def encode(mol, vocab): """把分子编码成子结构计数向量,作为简化潜码。""" counts = [0] * len(vocab) for sub in mol.connected_subgraphs(3): if sub in vocab: counts[vocab.index(sub)] += 1 return counts def decode(latent, vocab, mol_size): """从潜码还原分子:选中的子结构贡献原子与边。""" selected = [vocab[i] for i, c in enumerate(latent) if c > 0] atoms = ["C"] * mol_size edges = set() for sub in selected: for i, j in itertools.combinations(sorted(sub), 2): if i < mol_size and j < mol_size: edges.add((i, j)) return Molecule(atoms, edges) def validity(mol): """有效性判定:分子图必须连通。""" if not mol.atoms: return False seen = {0} stack = [0] while stack: cur = stack.pop() for nb in mol._neighbors[cur]: if nb not in seen: seen.add(nb) stack.append(nb) return len(seen) == len(mol.atoms) def main(): # 人工构造的训练分子:丙烷、丙醇、丁烷、甲胺的骨架示意 mols = [ Molecule(["C", "C", "C"], [(0, 1), (1, 2)]), Molecule(["C", "C", "O"], [(0, 1), (1, 2)]), Molecule(["C", "C", "C", "C"], [(0, 1), (1, 2), (2, 3)]), Molecule(["C", "N", "C"], [(0, 1), (1, 2)]), ] vocab = build_vocab(mols, max_size=3) print("子结构词典大小:", len(vocab)) for sub in vocab[:5]: print("积木包:", sorted(sub)) # 生成:在 A 与 B 的潜码之间插值,产出新分子 A, B = mols[0], mols[1] lA, lB = encode(A, vocab), encode(B, vocab) latent = [(a + b) / 2.0 for a, b in zip(lA, lB)] new_mol = decode(latent, vocab, mol_size=3) print("新分子是否有效:", validity(new_mol)) print("新分子原子:", new_mol.atoms) print("新分子边:", sorted(new_mol.edges)) if __name__ == "__main__": main()
for sub in mol.connected_subgraphs(max_size):把每个分子拆成候选“积木包”,类似 JT-VAE 的树分解枚举。counter[sub] = counter.get(sub, 0) + 1统计每个子结构出现次数,只有出现多次的包才收进词典。counts[vocab.index(sub)] += 1把分子投影到词典空间:每个包出现几次,就在向量对应位置加几。latent = [(a + b) / 2.0 for a, b in zip(lA, lB)]潜空间插值:两个分子的编码各取一半,得到“中间设计”。return Molecule(atoms, edges)从潜码重建分子图:选中的积木包还原成原子与边。return len(seen) == len(mol.atoms)有效性判定:从 0 号原子出发能连通所有原子才算有效分子。
常见误区
误区JT-VAE 名字里有"VAE",我以为是像处理文本一样,把分子里的原子一个一个送进编码器,输出一个向量。
正解JT-VAE 的编码单位是“子结构包”而非原子。它先把分子树分解成一棵接合树,树编码器按树节点处理每个积木包,再额外用图编码器对齐整体视角。就像拆装大师数的是门窗包,不是每一粒砖。逐原子处理是 GraphAF 或 SMILES 类模型的做法,两者完全不同。
为何常见:常见 VAE 教程都用图像或序列举例,容易让人误以为分子的编码也是“展平成一串”。
误区GraphAF 也是一步一步输出的,跟用 RNN 一个字符一个字符写 SMILES 字符串应该差不多。
正解SMILES 是人工设计的字符串语法,与化学结构隔着“解析”这一层;GraphAF 直接在图上操作,每步输出的语义是“放一个新原子 + 连哪些键”,不依赖字符串的线性顺序,也不会受制于随意指定的书写顺序。
为何常见:两者表面都是序列化生成,容易被误认为同一类方法,其实一个是“写字符串”,一个是“画图”。
误区扩散模型不是做图像的吗?天天看到 AI 画图,它怎么能生成分子这种离散图结构呢?
正解扩散模型的作用对象是任意张量数据。对分子图,噪声可以加在原子特征与邻接矩阵上,离散扩散则直接在特征分布上做扰动。分子骨架就是被“雕刻”出来的:正向学怎么把图弄乱,逆向学怎么把乱图还原成分子。
为何常见:媒体大量报道图像生成,让扩散模型被误认为是视觉专用范式。
误区论文里 JT-VAE 有效性接近 100%,那我把模型扔进药企管线,生成的分子应该都能进实验室。
正解有效性率只是“像不像分子”的第一道门槛。药企真正关心“生成 1000 个分子,多少个能合成、活性达标、毒性低”——这对应性质满足率、逆合成可行性、新颖性与唯一性。一个有效性 99% 但 90% 都重复或同质化的模型,在工业界价值很低。
为何常见:论文把有效性率放在指标表第一位,读者容易把它当成“最重要的指标”,而不是“最基础的指标”。
误区VAE 的潜空间是连续的,那我在两个好分子之间取中点,解码出来的一定也是好分子。
正解潜空间只在训练数据附近保持“化学合理”。离数据流形太远的点,解码出来可能是乱七八糟的“废包”。所以工业实践中要做插值筛选、性质梯度上升、或在隐空间加正则约束,而不是盲目取中点。
为何常见:数学上连续 ≠ 化学上合理,VAE 的“流形假设”被不恰当地外推到整个空间。
面试题
Q1. JT-VAE 在编码前把分子分解成什么结构?
- A.原子线性序列
- B.子结构接合树← 正确答案
- C.化学键矩阵
- D.三维空间坐标
答案:B。JT-VAE 先做树分解,把分子变成由子结构组成的接合树,编码器处理的是“积木包”而非原子序列。A 是 SMILES 类模型的做法,C、D 与 JT-VAE 的输入组织方式无关。
Q2. JT-VAE 的联合训练损失包含以下哪些部分?
- A.树编码器重构项← 正确答案
- B.图编码器重构项← 正确答案
- C.树图一致性约束← 正确答案
- D.原子三维坐标回归
答案:ABC。联合损失 = 树编码重构项 + 图编码重构项 + 树图一致性约束(KL/JS 散度让两个编码器分布对齐)。D 是三维坐标建模任务的内容,JT-VAE 基于图拓扑生成,不回归原子坐标。
Q3. GraphAF 生成分子时采取的核心策略是?
- A.一次性输出整张图
- B.逐原子自回归生成← 正确答案
- C.从噪声整体去噪
- D.随机拼接子结构包
答案:B。GraphAF 是自回归模型,每步只新增一个原子并决定它与已有原子的键。A 是单步式生成思路,C 是扩散模型,D 是 JT-VAE 的打包式思路。
Q4. 扩散模型生成分子时,去噪过程从什么状态开始?
- A.空分子状态
- B.随机噪声状态← 正确答案
- C.种子分子状态
- D.子结构词典状态
答案:B。扩散生成只运行逆向过程,起点是纯随机噪声,像雕塑家从乱石开始凿。A 是自回归起点,C 是条件优化场景的输入,D 属于 JT-VAE 的概念。
Q5. 衡量“生成分子是否化学合理”的首要指标是?
- A.有效性率← 正确答案
- B.生成速度
- C.模型参数量
- D.训练数据规模
答案:A。有效性率 = 合法分子数 / 生成总数,是“像不像分子”的第一道门槛。B、C、D 都是工程或算力指标,与化学合理性无关。
Q6. JT-VAE 潜空间插值的主要用途是?
- A.加速模型训练
- B.生成性质导向新分子← 正确答案
- C.压缩子结构词典
- D.消除编码噪声
答案:B。潜空间里分子按结构临近排列,两个活性分子取中点解码,可得到性质介于两者的新分子,是性质导向生成的常用手段。A、C、D 都不是插值的目标。
Q7. 逆合成与分子生成的关系是?
- A.生成流程的逆方向← 正确答案
- B.两者完全相同
- C.两者完全无关
- D.逆合成只用模板
答案:A。生成是“片段→分子”,逆合成是“分子→片段”,方向相反但共享同一套图表示与分解-组装结构。D 说“只用模板”忽略了生成模型自动学分解模式的新范式。
Q8. 关于 GraphAF 的下列说法,正确的有?
- A.每一步只新增一个原子← 正确答案
- B.每步还决定键的类型← 正确答案
- C.生成不依赖已有部分
- D.属于自回归生成模型← 正确答案
答案:ABD。GraphAF 每步新增一个原子并决定它与已有原子的边(A、B 正确);它的每一步都以已生成子图为条件,本质上就是自回归模型(D 正确)。C 与自回归定义矛盾。
Q9. 扩散模型训练时,网络主要学习预测什么?
- A.分子的热力学能
- B.被加入的噪声向量← 正确答案
- C.原子的电荷分布
- D.化学键的键长
答案:B。训练时人为加入已知噪声 ε,网络 ε_θ 学习从被污染图中预测它,损失是均方误差。A、C、D 是其它分子任务的目标,与去噪目标无关。
Q10. 评价分子生成模型能力时通常会综合哪些维度?
- A.生成分子唯一性← 正确答案
- B.生成分子新颖性← 正确答案
- C.目标性质满足率← 正确答案
- D.训练集分子总数
答案:ABC。好模型要同时看有效性率、唯一性(不重复)、新颖性(不同于训练集)和性质满足率(有用性)。D 是训练配置而非生成质量的评价维度,训练集多大与生成好坏无直接关系。