假设你是一家“分子积木工作室”的老板,药剂公司送来委托:请设计一个全新分子,要能抑制某个靶点、还要容易合成。传统做法是化学家手工在图纸上改结构,像师傅把每一块砖的位置都亲手标出来,改一版要好几周,多数改法一化验就作废。工作室里来了三支队伍:第一队先拆装——把见过的分子拆成标准积木包,再像拼积木一样拼出新分子(JT-VAE);第二队是逐笔画家——不打包,从第一个原子起一笔一笔画完整座城堡(GraphAF);第三队是雕塑家——搬来一块乱石(噪声),一锤一锤凿出分子骨架(扩散模型)。本文就用这三位师傅的故事,讲清三种图神经网络分子生成方法的工作机制、有效性率与性质导向能力,以及它们如何服务于逆合成,帮你在 AI 制药领域建立一张从入门到进阶的地图。

岗位关联

掌握分子生成三种范式的原理与取舍,是进入 AI 制药的核心能力:无论做算法研究还是工程落地,你都能判断该用哪个模型、怎么用。

目录
  1. 可视化演示
  2. 分子生成概述
  3. JT-VAE架构
  4. JT-VAE流程
  5. GraphAF自回归
  6. 扩散模型生成
  7. 方法对比评估
  8. 逆合成应用
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。

本节配有交互动效(进入视口后自动加载,约 3KB)。

系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T

分子生成概述

想象你是一家“分子积木工作室”的老板,药剂公司送来委托:请设计一个全新分子,要求能抑制某个靶点,还要容易合成。传统做法是化学家手工在图纸上改结构,就像师傅把每一块砖的位置都亲手标出来,改一版要几周,大部分改法一化验就是废品。工作室决定引入三支 AI 队伍,让模型学习“怎么写新图纸”。

分子本质上是一张图——原子是节点,化学键是边。所谓分子生成,就是让神经网络学会给这张图发明新画法:输入一堆已知分子,模型就能吐出一批全新的、化学上合理的图。这张图的定义,就是所有生成任务的图纸语言,也是后面每一位师傅手里的标尺。

业界沉淀出三条主流路线:第一条“拆装式”(JT-VAE),先把分子拆成官能团子结构,再以子结构为单位编码与重组;第二条“逐笔式”(GraphAF),从第一个原子开始,自回归地一笔笔添加原子和键;第三条“雕刻式”(扩散模型),从随机噪声出发,逐步去噪还原出分子骨架。它们的目标都写在同一个公式里——让模型学到的分子分布尽量接近真实数据分布。

就像积木工作室必须先写明“砖块规格”一样,分子图的定义是所有生成方法的共同语言。理解了这张图纸,后面三位师傅的手法差异就一目了然了。

G=(V,E),vi∈A,eij∈{0,1}K\mathcal{G}=(V,E),\quad v_i\in\mathcal{A},\quad e_{ij}\in\{0,1\}^K
这张“图纸规格”定义了生成任务的输入输出:一张图由原子集合 V 和化学键集合 E 构成。
  1. 节点与边分子被抽象成一张图,V 是原子集合,E 是原子对的化学键集合。
    V={v1,v2,…,vn},E⊆{(vi,vj)}V=\{v_1,v_2,\dots,v_n\},\quad E\subseteq\{(v_i,v_j)\}
  2. 原子类型每个节点携带一种原子类型,比如碳 C、氧 O、氮 N,它们组成字母表 A。
    vi∈A,A={C,N,O,… }v_i\in\mathcal{A},\quad \mathcal{A}=\{\mathrm{C},\mathrm{N},\mathrm{O},\dots\}
  3. 化学键类型每条边用 K 维独热向量表示键的种类(单键、双键、芳香键等)。
    eij∈{0,1}Ke_{ij}\in\{0,1\}^K

JT-VAE架构

第一支队伍是“拆装大师”。他们从不一粒砖一粒砖地硬拼,而是先把仓库里所有城堡拆成标准积木包:门窗包、塔楼包、围墙包。设计新城堡时,只需要选包、连包,而不是从零摆砖。这一招让他们的设计速度快得惊人。

JT-VAE(Junction Tree VAE,接合树变分自编码器)正是这位大师。它先对分子做树分解:把分子切成若干化学上合理的子结构(如苯环、羰基、氨基),子结构作为树的节点,子结构之间的连接作为树的边。于是分子变成一棵“接合树”加每个节点内部的原子细节,编码量大幅下降。

架构上,它有两套编码器加一个解码器。树编码器把接合树读成潜向量 z;图编码器把原始分子图也读成一个 z;解码器再根据 z 先重建接合树,再为每个树节点恢复原子排布。问题来了:同一分子,树视角和图视角得出的 z 必须口径一致,否则生成产物会“精神分裂”。于是作者给模型加了联合训练目标。

拆装大师省下的功夫是巨大的:生成单位从“原子”变成“积木包”,就像从数砖块升级到数门窗。这让他成为三条路线里潜空间插值最顺滑的选手,也为后面的性质导向生成埋下伏笔。

L=Eq(z∣x)[log⁡pθ(x∣z)]−KL(qT(z∣x) ∥ p(z))−KL(qG(z∣x) ∥ qT(z∣x))\displaystyle \mathcal{L}=\mathbb{E}_{q(z|x)}\big[\log p_\theta(x|z)\big]-\mathrm{KL}\big(q_T(z|x)\,\Vert\,p(z)\big)-\mathrm{KL}\big(q_G(z|x)\,\Vert\,q_T(z|x)\big)
这个损失函数是拆装大师的“三约法”:既要重建得像,又要潜码不飘,还要树图和潜码互相看齐。
  1. 重构项从潜码 z 还原分子的对数概率,这部分越大说明压缩后信息保留得越好。
    Eq(z∣x)[log⁡pθ(x∣z)]\mathbb{E}_{q(z|x)}\big[\log p_\theta(x|z)\big]
  2. 树先验对齐让树编码器给出的潜码分布向标准正态先验靠拢,方便生成时从先验采样。
    KL(qT(z∣x) ∥ p(z))\mathrm{KL}\big(q_T(z|x)\,\Vert\,p(z)\big)
  3. 图树一致让图编码器的分布与树编码器保持一致,保证“拆解视角”和“整图视角”不打架。
    KL(qG(z∣x) ∥ qT(z∣x))\mathrm{KL}\big(q_G(z|x)\,\Vert\,q_T(z|x)\big)

JT-VAE流程

拆装大师的工作台上有四道工序:备料、拆解、压缩、组装。备料是把训练集里所有分子过一遍筛子,把反复出现的子结构收进“积木包词典”;拆解是把每个分子递归切成挂在树上的积木包;压缩是把整棵树的包序列读成潜码;组装则是从潜码出发把分子拼回来。

备料与拆解对应词典构建和树分解。词典决定生成器的“词汇量”:包太少表达力不足,包太多又难学。拆解则要把“怎么切”学成概率模型,切法越接近化学直觉,重建越容易。JT-VAE 用约简模块从分子中提取这些子结构,保证切出来的包能覆盖训练集的大多数分子。

压缩与组装才是模型真正学习的重点。压缩时,树编码器把每个积木包的嵌入按树结构聚合,得到全局潜码 z;组装时,解码器从 z 出发,用循环网络一步步决定先放哪个包、包与包怎么连、包内原子键怎么补全。每一步都是一个分类问题:在整本词典里挑最合适的包。

这四道工序让拆装师能站在“半成品”上思考:他不需要凭空想象一整座城堡,只需在已有包旁边挑下一个包。这种局部性正是它高效又高有效性的秘密——毕竟,拼积木包永远比摆单砖更不容易散架。

p(aj∣z)=softmax(W GRU(hj−1, [z;ej−1]))p(a_j\mid z)=\mathrm{softmax}\big(W\,\mathrm{GRU}(h_{j-1},\,[z;e_{j-1}])\big)
解码器像“看图施工”:总图纸 z 在手,根据已经拼好的部分,从词典里挑下一个积木包。
  1. 循环生成GRU 记住已经生成的积木包顺序,输出当前步的隐藏状态。
    hj=GRU(hj−1, [z;ej−1])h_j=\mathrm{GRU}\big(h_{j-1},\,[z;e_{j-1}]\big)
  2. 拼接输入把全局图纸编号 z 和上一步选择的嵌入 e_{j-1} 拼在一起,让生成器同时看到“总设计图”和“当前进度”。
    [z;ej−1]∈Rdz+de[z;e_{j-1}]\in\mathbb{R}^{d_z+d_e}
  3. 软选择softmax 把得分变成整个词典上的概率分布,从中采样确定下一个积木包。
    aj∼softmax(W hj)a_j\sim\mathrm{softmax}\big(W\,h_j\big)

GraphAF自回归

第二支队伍是“逐笔画家”。他们不服打包理念:每座城堡都是独一无二的,我要从第一笔开始,一笔一笔把整座城堡画完。每一笔都参考已经画好的部分,绝不照搬标准包。这种“边画边想”的风格,在化学上意味着更高的表达自由。

GraphAF(Graph Autoregressive Flow,图自回归流)正是这种画法。它把生成一个 N 个原子的分子拆成 N 步:每步先放下一个新原子并决定其类型,再决定它与之前所有原子之间是否连键、连什么键。每一步的输出都建立在完整的已生成子图之上。

这种设计带来两个鲜明特点。一是极强的条件性:每一步都能利用全部已生成结构,局部细节丰富,生成的新颖结构多。二是代价:步数等于原子数加边数,分子一大,计算开销就明显上升,生成速度远不如“打包派”。

逐笔画家最擅长画“不重复”的作品——它不依赖固定包,所以新奇性往往更高。但它每一步都要停下来端详已画的部分,走得慢;分子变大时,“画错一笔后面都要改”的风险也随之上升。

log⁡p(G)=∑i=1nlog⁡p(vi∣G<i)+∑j∈N(i)log⁡p(eij∣G<i,vi)\displaystyle \log p(G)=\sum_{i=1}^{n}\log p(v_i\mid G_{<i})+\sum_{j\in\mathcal{N}(i)}\log p(e_{ij}\mid G_{<i},v_i)
逐笔画家的“总法则”:整幅画的概率等于每一笔(选原子、连键)概率的乘积,取对数后变成累加。
  1. 条件记号G_{<i} 表示前 i-1 步已生成的部分图,后续所有决策都以它为条件。
    G<i={(v1,e1),…,(vi−1,ei−1)}G_{<i}=\{(v_1,e_1),\dots,(v_{i-1},e_{i-1})\}
  2. 原子自回归逐个原子地生成类型,每步只看前面已经画好的部分。
    ∑i=1nlog⁡p(vi∣G<i)\sum_{i=1}^{n}\log p(v_i\mid G_{<i})
  3. 建边决策新原子到位后,还要决定它与每个已有邻居之间连什么键。
    ∑j∈N(i)log⁡p(eij∣G<i,vi)\sum_{j\in\mathcal{N}(i)}\log p(e_{ij}\mid G_{<i},v_i)

扩散模型生成

第三支队伍是“雕塑家”。他们入场时搬来一块棱角分明的乱石,说:城堡不是画出来的,是凿出来的。我们先把乱石慢慢凿成城堡,生成时就从一块新乱石开始,逐步去掉多余部分。这种“整体塑形”的思路,和逐笔画家的局部决策截然不同。

扩散模型的训练分正向与逆向。正向过程(加噪)把训练集里的分子图逐步加噪声,直到完全淹没成随机噪声;逆向过程(去噪)训练一个网络,学会把噪声一步步还原成分子。生成时只运行逆向过程——这就像雕刻家先学“如何把成品凿回乱石”,再倒放这个过程来创作。

对图数据,噪声加在原子特征与邻接矩阵上。由于分子是离散图,直接加连续高斯噪声容易产生“键数违背价态”的畸形图,所以研究者常用离散扩散(在特征分布上加噪声),或为去噪网络附加化学价约束。这也是扩散模型在分子领域落地时必须跨过的一道坎。

雕塑家最大的本钱是“全局观”:从噪声还原的过程天然考虑整张图的分布,不依赖任何生成顺序。但代价是迭代步数多、计算重;如果离散约束处理不好,有效性率会明显缩水——这是它和拆装大师最大的差距。

q(Gt∣Gt−1)=N(Gt;1−βt Gt−1,βtI)L=Et,ϵ[∥ϵ−ϵθ(Gt,t)∥2]\displaystyle \begin{aligned}q(\mathcal{G}_t\mid\mathcal{G}_{t-1})&=\mathcal{N}\big(\mathcal{G}_t;\sqrt{1-\beta_t}\,\mathcal{G}_{t-1},\beta_t I\big)\\\mathcal{L}&=\mathbb{E}_{t,\epsilon}\big[\lVert\epsilon-\epsilon_\theta(\mathcal{G}_t,t)\rVert^2\big]\end{aligned}
前向是把分子一步步“弄乱”,逆向是让网络学会“把乱还原”,训练目标就是预测噪声。
  1. 前向加噪每一步保留一部分原信息、掺入 β_t 强度的噪声,逐步把分子推成随机图。
    Gt=1−βt Gt−1+βt ϵ,ϵ∼N(0,I)\mathcal{G}_t=\sqrt{1-\beta_t}\,\mathcal{G}_{t-1}+\sqrt{\beta_t}\,\epsilon,\quad \epsilon\sim\mathcal{N}(0,I)
  2. 去噪学习网络接收被污染的图和当前步数 t,输出对噪声向量的预测。
    ϵθ(Gt,t)≈ϵ\epsilon_\theta(\mathcal{G}_t,t)\approx\epsilon
  3. 均方误差真实噪声与预测噪声之差的平方求期望,这是整个训练过程的优化目标。
    Et,ϵ[∥ϵ−ϵθ(Gt,t)∥2]\mathbb{E}_{t,\epsilon}\big[\lVert\epsilon-\epsilon_\theta(\mathcal{G}_t,t)\rVert^2\big]

方法对比评估

三支队伍把作品摆上评审台。老板只看两个硬指标:第一,你交上来 100 个分子,有几个化学上成立?这叫有效性率。第二,成立的分子里,多少满足客户要的性质?这叫性质导向能力。两把尺子缺一不可。

有效性率是“像不像分子”,要求价键规则、连通性、稳定基团都说得通。参考经验:JT-VAE 在常见基准(如 ZINC)上有效性可接近 100%;GraphAF 约 93% 左右;扩散模型直接生成常偏低,但加上价态约束后也能到 90% 以上。请注意,这个数字是“门槛”,不是“奖杯”。

性质导向是“有没有用”。JT-VAE 的潜空间平滑,可沿性质梯度插值(比如优化 logP 脂水分配系数);GraphAF 能在每一步把性质预测器接入节点的选择;扩散模型则在去噪过程中用性质条件引导生成。三者都能做性质导向,机制却完全不同:一个改图纸,一个改笔法,一个改石头纹理。

把三支队伍放回积木工作室:拆装师最快、包质量最稳,适合大规模遍历候选空间;逐笔画家最细、作品最新奇但慢,适合探索陌生骨架;雕塑家格局大、全局观强,但费工费时。选谁,取决于任务要“量”还是要“新”。

validity=NvalidNgen,score=1N∑i=1Nf(Gi)\displaystyle \mathrm{validity}=\frac{N_{\text{valid}}}{N_{\text{gen}}},\qquad \mathrm{score}=\frac{1}{N}\sum_{i=1}^{N}f(G_i)
有效性率是“成品率”,性质评分是“平均客户满意度”,两者相乘才是真正有用的分子产量。
  1. 有效性率把生成的分子送去校验,化学上合法的个数 N_valid 除以生成总数 N_gen。
    validity=NvalidNgen\mathrm{validity}=\frac{N_{\text{valid}}}{N_{\text{gen}}}
  2. 性质评分对每个生成分子计算目标性质函数 f(如溶解度、药效打分),再对一批分子取平均。
    f(Gi)∈R,score=1N∑i=1Nf(Gi)f(G_i)\in\mathbb{R},\quad \mathrm{score}=\frac{1}{N}\sum_{i=1}^{N}f(G_i)
  3. 两指标互补有效性率管“像不像分子”、性质评分管“有没有用”,二者需要联合优化。
    max⁡θ (validity+λ⋅score)\max_{\theta}\ \big(\mathrm{validity}+\lambda\cdot\mathrm{score}\big)

逆合成应用

除了设计新城堡,工作室还接一类“拆城单”:客户拿着一座城堡问,能不能拆成市场上买得到的标准包,让我照着拼出来?这就是逆合成——制药行业最贵的单子之一,因为合成路线决定了一个候选药物能不能真正做出来。

分子生成模型天然是逆合成的底模。JT-VAE 的树分解本身就是“如何把目标分子切回积木包”的概率模型,训练好的分解器可以直接输出候选前体组合;GraphAF 与扩散模型作为生成器,也可以反过来为“目标分子→前体”的拆分方案打分排序。生成是“片段→分子”,逆合成是“分子→片段”,方向相反,却共享同一套图表示。

逆合成任务从目标分子出发,预测多个可购买前体片段及其组装顺序,构成一条合成路线。用生成模型做逆合成的优势在于:它不依赖人工模板库,能从数据里自动学到“哪些官能团适合切开”,从而覆盖更多新颖骨架。

逆合成让生成模型从“造梦师”升级为“拆解师”。当三支队伍都会拆城,药企就能从“随机试错”走向“按图索骥”——这正是分子生成与逆合成被放在同一章节的原因:一次学会拆装,双倍价值落地。

P(Gprec∣Gtarget)=∏k=1KP(Mk∣Gtarget,M<k)\displaystyle P(G_{\text{prec}}\mid G_{\text{target}})=\prod_{k=1}^{K}P(M_k\mid G_{\text{target}},M_{<k})
拆城单的“总公式”:给定目标分子,把拆出前体的整条路线看成逐片段决策的连乘。
  1. 条件建模模型输出的是“前体组合 G_prec”在给定目标分子下的条件概率。
    P(Gprec∣Gtarget)P(G_{\text{prec}}\mid G_{\text{target}})
  2. 逐片段分解像 JT-VAE 拆积木一样,每次切下一个片段 M_k,且每一步都参考已切下的部分。
    ∏k=1KP(Mk∣Gtarget,M<k)\prod_{k=1}^{K}P(M_k\mid G_{\text{target}},M_{<k})
  3. 前体集合最终的前体是一组可购买小分子片段的集合,它们能被拼回目标分子。
    Gprec={M1,M2,…,MK}G_{\text{prec}}=\{M_1,M_2,\dots,M_K\}

AI 应用场景

AI 药物先导物优化

阶段:分子生成与性质筛选

解决的问题:传统先导物优化靠化学家凭经验改造活性分子,再逐一合成测试,一轮要数月、成本极高。用 JT-VAE 把已知活性分子编码进潜空间,在多个活性分子之间插值或沿性质梯度上升,能批量产出候选类似物,再用性质预测器预筛,把湿实验规模缩小一到两个数量级。

具体案例:某药企对一款激酶抑制剂骨架用 JT-VAE 生成 5000 个类似物,先按 logP 与合成可及性过滤到 50 个,再进湿实验,命中率显著高于随机筛选——这正是“拆装大师”在真实管线里的拿手戏。

逆合成路线规划

阶段:路线规划与片段选择

解决的问题:逆合成分析长期依赖专家经验,一个复杂分子可能要拆整整一周。生成模型的分解器学到“哪些官能团适合切开”,对目标分子直接输出多个可行的前体组合,化学家只需在 Top-K 路线里验证少数几条。

具体案例:制药企业把 JT-VAE 分解器接到商用试剂库上,对候选分子自动生成 Top-K 合成路线,再交化学家评估成本与产率。原需数天的拆解工作被压缩到分钟级,且覆盖了人工容易遗漏的新颖切断点。

材料与催化剂筛选

阶段:属性导向生成与高通量预筛

解决的问题:新材料候选空间近乎无限,纯实验遍历不可行。GraphAF 或扩散模型以目标属性(如带隙、稳定性)为条件生成候选结构,配合 DFT 高精度验证,能显著缩小搜索空间。

具体案例:某研究组用条件扩散模型生成 10 万个小分子催化剂候选,按带隙与稳定性排序后,前 100 名进入高精度计算验证,最终筛选出的分子比传统数据库挖掘找到的候选活性更高。

Python 演示

python112 行
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()
目的:用玩具版 JT-VAE 展示分子生成核心链路——构建子结构词典、编码为潜码、潜空间插值、解码并验证有效性。
  1. for sub in mol.connected_subgraphs(max_size):把每个分子拆成候选“积木包”,类似 JT-VAE 的树分解枚举。
  2. counter[sub] = counter.get(sub, 0) + 1统计每个子结构出现次数,只有出现多次的包才收进词典。
  3. counts[vocab.index(sub)] += 1把分子投影到词典空间:每个包出现几次,就在向量对应位置加几。
  4. latent = [(a + b) / 2.0 for a, b in zip(lA, lB)]潜空间插值:两个分子的编码各取一半,得到“中间设计”。
  5. return Molecule(atoms, edges)从潜码重建分子图:选中的积木包还原成原子与边。
  6. 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 在编码前把分子分解成什么结构?

单选题 · easy

  • A.原子线性序列
  • B.子结构接合树← 正确答案
  • C.化学键矩阵
  • D.三维空间坐标

答案:B。JT-VAE 先做树分解,把分子变成由子结构组成的接合树,编码器处理的是“积木包”而非原子序列。A 是 SMILES 类模型的做法,C、D 与 JT-VAE 的输入组织方式无关。

Q2. JT-VAE 的联合训练损失包含以下哪些部分?

多选题 · hard

  • A.树编码器重构项← 正确答案
  • B.图编码器重构项← 正确答案
  • C.树图一致性约束← 正确答案
  • D.原子三维坐标回归

答案:ABC。联合损失 = 树编码重构项 + 图编码重构项 + 树图一致性约束(KL/JS 散度让两个编码器分布对齐)。D 是三维坐标建模任务的内容,JT-VAE 基于图拓扑生成,不回归原子坐标。

Q3. GraphAF 生成分子时采取的核心策略是?

单选题 · easy

  • A.一次性输出整张图
  • B.逐原子自回归生成← 正确答案
  • C.从噪声整体去噪
  • D.随机拼接子结构包

答案:B。GraphAF 是自回归模型,每步只新增一个原子并决定它与已有原子的键。A 是单步式生成思路,C 是扩散模型,D 是 JT-VAE 的打包式思路。

Q4. 扩散模型生成分子时,去噪过程从什么状态开始?

单选题 · mid

  • A.空分子状态
  • B.随机噪声状态← 正确答案
  • C.种子分子状态
  • D.子结构词典状态

答案:B。扩散生成只运行逆向过程,起点是纯随机噪声,像雕塑家从乱石开始凿。A 是自回归起点,C 是条件优化场景的输入,D 属于 JT-VAE 的概念。

Q5. 衡量“生成分子是否化学合理”的首要指标是?

单选题 · easy

  • A.有效性率← 正确答案
  • B.生成速度
  • C.模型参数量
  • D.训练数据规模

答案:A。有效性率 = 合法分子数 / 生成总数,是“像不像分子”的第一道门槛。B、C、D 都是工程或算力指标,与化学合理性无关。

Q6. JT-VAE 潜空间插值的主要用途是?

单选题 · mid

  • A.加速模型训练
  • B.生成性质导向新分子← 正确答案
  • C.压缩子结构词典
  • D.消除编码噪声

答案:B。潜空间里分子按结构临近排列,两个活性分子取中点解码,可得到性质介于两者的新分子,是性质导向生成的常用手段。A、C、D 都不是插值的目标。

Q7. 逆合成与分子生成的关系是?

单选题 · mid

  • A.生成流程的逆方向← 正确答案
  • B.两者完全相同
  • C.两者完全无关
  • D.逆合成只用模板

答案:A。生成是“片段→分子”,逆合成是“分子→片段”,方向相反但共享同一套图表示与分解-组装结构。D 说“只用模板”忽略了生成模型自动学分解模式的新范式。

Q8. 关于 GraphAF 的下列说法,正确的有?

多选题 · mid

  • A.每一步只新增一个原子← 正确答案
  • B.每步还决定键的类型← 正确答案
  • C.生成不依赖已有部分
  • D.属于自回归生成模型← 正确答案

答案:ABD。GraphAF 每步新增一个原子并决定它与已有原子的边(A、B 正确);它的每一步都以已生成子图为条件,本质上就是自回归模型(D 正确)。C 与自回归定义矛盾。

Q9. 扩散模型训练时,网络主要学习预测什么?

单选题 · mid

  • A.分子的热力学能
  • B.被加入的噪声向量← 正确答案
  • C.原子的电荷分布
  • D.化学键的键长

答案:B。训练时人为加入已知噪声 ε,网络 ε_θ 学习从被污染图中预测它,损失是均方误差。A、C、D 是其它分子任务的目标,与去噪目标无关。

Q10. 评价分子生成模型能力时通常会综合哪些维度?

多选题 · hard

  • A.生成分子唯一性← 正确答案
  • B.生成分子新颖性← 正确答案
  • C.目标性质满足率← 正确答案
  • D.训练集分子总数

答案:ABC。好模型要同时看有效性率、唯一性(不重复)、新颖性(不同于训练集)和性质满足率(有用性)。D 是训练配置而非生成质量的评价维度,训练集多大与生成好坏无直接关系。