想象你是米其林三星餐厅的主厨,后厨有一整柜配方卡:每张卡记载一道菜——选料、用量、火候。你的梦想是发明从未有过的新菜,但 10 万张卡片不可能手工翻阅。这时来了一位数学极好的帮厨,他提出一个主意:把每道菜浓缩成三个风味坐标——酸甜度、油脂感、香料强度。于是 10 万道菜变成了厨房墙上的一张“风味地图”:相似的菜挨在一起。想创新?在地图上挑个空白点,帮厨就能端出一盘“似曾相识却从未存在”的新菜。这位帮厨,就是变分自编码器(VAE)。在药物发现里,“菜”是分子,“配方卡”是 SMILES 字符串,“风味地图”叫潜在空间。本文将跟随这位帮厨从入门到进阶,看 VAE 如何学会发明新分子,并走向逆合成设计。

岗位关联

对 AI 从业者而言,VAE 是分子生成领域的基石模型:掌握它,等于拿到了药物研发、材料设计等高价值场景的入场券,能把“生成新分子”从玄学变成可优化、可验证的工程问题。

目录
  1. 可视化演示
  2. VAE 基本原理:抓住风味参数
  3. 分子表征方式:SMILES 配方卡
  4. 编码解码架构:品菜师与掌勺的接力
  5. 潜在空间特性:会流动的风味地图
  6. 分子生成应用:研发新菜的两种姿势
  7. 模型评估指标:给新菜打分
  8. 挑战与展望:从生成到逆合成
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

演示变分自编码器(VAE)在分子设计中的编码-解码架构、潜在空间分子采样与重参数化、以及生成分子的性能评估指标。

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

VAE编码-解码架构 编码器将SMILES分子串映射为潜在空间的均值与方差分布 重参数化技巧z=μ+σε实现端到端可微采样 解码器从潜在向量重构SMILES分子结构 L=ELBO=E[log p(x|z)]−KL(q(z|x)||p(z)) VAE通过ELBO联合优化重构与正则化

VAE 基本原理:抓住风味参数

帮厨记菜谱时从不逐字抄写,他品一口就写下一个五维向量:“酸甜 3、油脂 4、香辛 1……”。这种“丢细节、留精髓”的记法,正是 VAE 编码器的哲学:把高维输入压缩成低维潜在变量 z。但在 VAE 之前,前辈自编码器(AE)已经会做压缩——它的问题是不会“创新”。

AE 把菜编码成固定向量再解码还原,由于没有约束,潜在空间是一团散沙,两个相邻点之间可能什么都对不上。你想插值出一盘新菜,得到的却是乱码。VAE 的进阶在于:它要求编码器输出的不是一个点,而是一个概率分布,且这个分布要朝标准高斯先验靠拢。

具体地,编码器 $q_\phi(z|x)$ 输出均值 $\mu$ 和方差 $\sigma^2$;从该高斯中采样得到 $z$;解码器 $p_\theta(x|z)$ 从 $z$ 还原输入。训练目标是最小化负 ELBO(证据下界):

要让神经网络靠梯度下降训练,还有一个拦路虎:采样 $z$ 这个随机动作无法求导。帮厨的解法叫“重参数化技巧”——把随机性从网络中剥离出来:

至此,帮厨学会了“记菜”:压缩不再是粗糙的一锤子买卖,而是一套带不确定性的概率描述。下一步,得让厨房里的菜能被写成卡片——也就是分子的 SMILES 语言。

L(θ,ϕ;x)=Eqϕ(z∣x)[log⁡pθ(x∣z)]−DKL(qϕ(z ∣ x) ∥ p(z))\displaystyle\mathcal{L}(\theta,\phi;x)=\mathbb{E}_{q_\phi(z|x)}\big[\log p_\theta(x|z)\big]-D_{\mathrm{KL}}\big(q_\phi(z\,|\,x)\,\|\,p(z)\big)
通俗说明:随机性全部来自外部噪声 $\varepsilon$,梯度可以安全地穿过 $\mu$、$\sigma$ 反向传播。
  1. 均值 $\mu$网络学出的风味坐标中心点,也就是最可能的位置。
  2. 标准差 $\sigma$坐标的“不确定半径”,越大表示该区域越模糊。
    σ>0\displaystyle \sigma>0
  3. 外部噪声 $\varepsilon$与网络参数无关的标准高斯噪声,是重参数化把“采样”变成“确定性变换加噪声”的关键。
    ε∼N(0,I)\displaystyle \varepsilon\sim\mathcal{N}(0,I)

分子表征方式:SMILES 配方卡

帮厨要记的“菜”长什么样?化学家早就发明了一套配方卡语言——SMILES。乙醇写 CCO,乙胺写 CCN,丙烷写 CCC;每张卡片是一串字符,从左往右读,字符代表原子,连接关系藏在排列顺序里。

SMILES 语法非常严格:分支用括号,环用数字标记,双键用 “=“。写错一个字符,化学家一看就知道”做不出来”。这给生成模型出了难题:网络输出的必须是合法字符串,不能是乱码。

预处理环节要做三件事:建立字符表(vocabular)、把变长字符串填充到固定长度、再用 one-hot 或嵌入向量把字符送进网络。分子字符串本质是序列,可以用概率链式法则建模:

配方卡就绪。帮厨的工作流变成:读卡(SMILES)→ 写坐标(z)→ 存地图(潜在空间)。但谁来读卡、谁来写字?答案是两个各司其职的厨师——编码器与解码器。

P(s)=P(c1) P(c2∣c1)⋯P(cT∣c<T)=∏t=1TP(ct ∣ c<t)\displaystyle P(s)=P(c_1)\,P(c_2|c_1)\cdots P(c_T|c_{<T})=\prod_{t=1}^{T}P(c_t\,|\,c_{<t})
通俗说明:整张配方卡出现的概率,等于逐字“续写”概率的乘积,解码器的任务就是把这些条件概率一个个学出来。
  1. 字符 $c_t$SMILES 序列第 $t$ 个字符,如 C、O、N、"(" 等,来自有限字符表。
    ct∈V\displaystyle c_t\in V
  2. 条件概率 $P(c_t\,|\,c_{<t})$看到前面已经写出的字符,再预测当前字符的概率——这就是解码器逐字“续写”的方式。
  3. 连乘 $\prod$整条配方卡出现的总概率等于每一步概率的乘积,训练目标就是让合法分子的总概率尽可能高。

编码解码架构:品菜师与掌勺的接力

编码器像品菜师:尝一口,写下坐标。它通常是一个 RNN/LSTM,把变长字符序列逐一读入,最后输出固定维度的 $\mu$ 和 $\sigma^2$。读得越仔细,坐标越准确。

解码器像掌勺大厨:拿到坐标 $z$,要知道“从什么字符开始、接下来怎么写”。它同样用 RNN,但在每一步都看到 $z$——相当于做菜时一直记得风味坐标,并在每一步用 softmax 从字符表里挑下一个字符。

训练时常采用 teacher forcing:解码时每一步喂入真实的前一个字符,让网络更快学会“续写”;推理时则用自己的预测自回归生成。这一过程可以写成:

一次完整的“读卡-记坐标-复现”训练后,厨房里最神奇的东西出现了——墙上那张风味地图(潜在空间)。这也是 VAE 成药的关键。

ht=LSTM(ht−1, ct−1, z),P(ct ∣ c<t,z)=softmax(Wht)\displaystyle h_t=\mathrm{LSTM}\big(h_{t-1},\,c_{t-1},\,z\big),\qquad P(c_t\,|\,c_{<t},z)=\mathrm{softmax}\big(W h_t\big)
通俗说明:大厨每写一个字,都参考“已写内容”和“风味坐标”,再决定下一个字符。
  1. 隐藏状态 $h_t$解码器的“工作记忆”,记录到目前为止写了哪些字符。
    ht=LSTM(ht−1,ct−1,z)\displaystyle h_t=\mathrm{LSTM}\big(h_{t-1},c_{t-1},z\big)
  2. 条件 $z$潜在向量作为每步写作的条件,大厨始终记得风味坐标。
  3. Softmax 输出把得分变成字符概率分布,逐字挑出最可能的下一个字符。
    P(ct ∣ c<t,z)=softmax(Wht)\displaystyle P(c_t\,|\,c_{<t},z)=\mathrm{softmax}\big(W h_t\big)

潜在空间特性:会流动的风味地图

帮厨发现:风味地图是光滑的。乙醇和乙胺挨得很近,甲醇和羰基也彼此为邻。相似结构的分子在潜在空间自动聚成簇——这是 VAE 最迷人的性质之一。

为什么地图光滑?因为 KL 正则项把所有分子的编码都往标准高斯“拽”,让空间连续、有界、可插值。高斯分布之间的 KL 散度有解析式,清楚地说明它惩罚什么:

在地图上从 A 点直线走到 B 点,经过的每个点都对应一个分子,且中间分子的性质(如脂溶性 LogP、极性)大致渐变——这叫潜在空间插值。你在演示动画里看到的红点,正是这种插值。

有了地图,帮厨不再只“记菜”,开始“发明”。下一节看它如何利用地图批量产新菜、按客人口味定向优化。

DKL=12∑i=1d(μi2+σi2−1−log⁡σi2)\displaystyle D_{\mathrm{KL}}=\frac{1}{2}\sum_{i=1}^{d}\Big(\mu_i^2+\sigma_i^2-1-\log\sigma_i^2\Big)
通俗说明:这个公式检查每个潜在维度“偏离标准高斯”的账:位置太偏、方差太大或太小都要罚。
  1. $\mu_i^2$第 $i$ 维坐标偏离原点的平方,偏离越远惩罚越大。
    μi2\displaystyle \mu_i^2
  2. $\sigma_i^2$方差项,鼓励与先验方差 1 保持一致。
    σi2\displaystyle \sigma_i^2
  3. $-\log\sigma_i^2$对数惩罚项,防止方差坍缩到 0。
  4. 求和 $\sum_{i=1}^{d}$对 $d$ 维潜在空间的每一维求和,各维独立核算。

分子生成应用:研发新菜的两种姿势

最省事的办法是随机采样:从标准高斯 $\mathcal{N}(0,I)$ 里抽一个 $z$,交给解码器,就得到一个新分子配方。因为先验与训练分布一致,采样出的 $z$ 落在有效区域的概率可观,这就是 VAE 能“无中生有”的原因。

但要做出“更好”的药,纯随机不够。于是有了定向生成:先训练一个性质预测器 $J$(比如预测 LogP、活性、溶解度),然后在潜在空间对 $z$ 做梯度上升:

循环几十轮后,得到性质更优的类似物。这就是经典的“潜在空间优化”流程:把化学家的结构修饰变成了连续空间里的爬山。随机采样负责“广撒网”保证多样性,梯度上升负责“精雕琢”保证指向性。但新菜端上桌前,总得先通过试菜评分——这就引出了评估指标。

zt+1=zt+η ∇zt J(G(zt))\displaystyle z_{t+1}=z_t+\eta\,\nabla_{z_t}\,J\big(G(z_t)\big)
通俗说明:每步都问性质预测器“往哪个方向改分子性质会更好”,然后朝那个方向推一下坐标,再解码看看——就像沿着地图坡度爬山找“口味最佳”的坐标。
  1. 性质预测器 $J$输入分子输出目标性质,是潜在空间中的“等高线”。
  2. 解码器 $G$把潜在坐标还原成 SMILES 分子。
  3. 梯度 $\nabla_{z_t}J$性质对潜在坐标的梯度,指向“性质提升”的方向。
    ∇zt J(G(zt))\displaystyle \nabla_{z_t}\,J\big(G(z_t)\big)
  4. 学习率 $\eta$每次沿梯度方向走多远,太小收敛慢、太大容易跳出有效区域。

模型评估指标:给新菜打分

主厨给帮厨的新菜定了一组试菜标准:第一,菜谱语法要合法,不能出现“把盐放进制冷剂”这种乱写;对应到分子,就是有效比率——生成字符串能被化学工具解析且价态合法。

第二,菜必须“新”、必须“多样”:与已知菜谱重复的不算创新,全部雷同的菜单没有价值——对应新颖性(与训练集去重)和多样性(分子指纹间平均距离)指标。第三,菜要“对症”:面向特定靶点的候选还得测活性、毒性是否达标,这叫目标性质准确率。三者互相制约:一味求新颖可能牺牲可合成性,一味求有效可能退化成已知分子。

好的评分体系让帮厨知道该往哪儿改进。然而,再好的菜谱也可能败在“厨房做不出来”——于是我们来到最后的挑战与逆合成。

V=1N∑n=1N1[valid(G(zn))]\displaystyle V=\frac{1}{N}\sum_{n=1}^{N}\mathbb{1}\big[\mathrm{valid}\big(G(z_n)\big)\big]
通俗说明:从先验里抽 N 个 $z$,解码后统计其中合法分子的比例。
  1. 采样 $z_n$从标准高斯 $\mathcal{N}(0,I)$ 随机取 $N$ 个潜在坐标。
  2. 指示函数 $\mathbb{1}$分子语法/价态合法记 1,否则记 0。
    1[valid(⋅)]\displaystyle \mathbb{1}\big[\mathrm{valid}(\cdot)\big]
  3. 平均 $\frac{1}{N}\sum$$N$ 个样本里合法分子的比例,越高说明解码器越靠谱。

挑战与展望:从生成到逆合成

帮厨遇到三道坎:第一,化学数据稀缺昂贵,公开数据只有百万级分子,相对化学空间($10^{60}$ 量级)是沧海一粟,模型容易过拟合;第二,合法字符串不保证可合成、稳定、低毒;第三,性质最优的区域可能离已知分子很远,得到的分子无合成路线。

解法之一是把生成与逆合成闭环。逆合成分析是:给定目标分子,反推需要哪些原料和反应步骤。把 VAE 生成器接上逆合成打分器,优先保留“能拆解成便宜原料”的候选,形成“生成-验证-再生成”回路。这可以写成带约束的优化:

未来方向还包括多目标优化(活性、毒性、可合成性一起优化)、条件生成(按靶点或药效团约束采样)、扩散模型与 VAE 的融合。帮厨的故事讲完了:从记菜谱到发明新菜,从风味地图到逆合成验菜,VAE 在分子设计中的演进,本质上是把化学家的创造力变成了可计算、可优化、可验证的工程。你,也可以成为那位帮厨。

z∗=arg⁡max⁡z J(G(z))−λ⋅d(z,Ztrain)\displaystyle z^{*}=\arg\max_{z}\,J\big(G(z)\big)-\lambda\cdot d\big(z,\mathcal{Z}_{\mathrm{train}}\big)
通俗说明:不只是追求性质最好,还要让新的坐标别离已知分子区域太远,这样生成结果才更可靠、更可合成。
  1. $\arg\max_z$寻找使目标值最大的潜在坐标。
  2. 性质项 $J(G(z))$希望生成的分子目标性质好。
    J(G(z))\displaystyle J\big(G(z)\big)
  3. 距离惩罚 $d$$z$ 与已知分子区域的距离,离得太远要扣分。
    d(z,Ztrain)\displaystyle d\big(z,\mathcal{Z}_{\mathrm{train}}\big)
  4. 权衡系数 $\lambda$控制“性质提升”和“不离谱”之间的强度。

AI 应用场景

先导化合物“大海捞针”——从头生成

阶段:模型训练完成后的随机采样与新结构生成阶段

解决的问题:传统高通量筛选依赖实体化合物库,数百万分子的合成与筛选成本极高,覆盖率却不足化学空间的万分之一。VAE 先把已知活性分子的分布学到潜在空间,再通过随机采样和邻近搜索产出百万级候选,随后做虚拟筛选,大幅缩小物理筛选范围。

具体案例:某药企针对激酶靶点,用 ZINC 数据库的 49 万分子训练 SMILES-VAE,在潜在空间采样 10 万个新分子,按 QED(类药性)和可合成性过滤后,得到多个新颖骨架的候选化合物进入后续对接验证。

分子性质定向优化——潜在空间爬山

阶段:推理阶段的潜在空间优化(性质预测器 + 梯度上升)

解决的问题:先导化合物往往溶解度差、代谢稳定性低。传统做法靠化学家凭经验替换基团,一轮实验动辄数月。VAE 方法在潜在空间训练性质预测器,对 $z$ 做梯度上升后解码,几小时内就能得到几十个“性质更优的类似物”。

具体案例:对某候选药物同时优化 logP 和血浆稳定性,迭代 20 轮后,获得活性保持且溶解度提升约 3 倍的类似物,后续合成验证命中率高。

生成与逆合成闭环——让新菜做得出来

阶段:生成后验证阶段,与逆合成模型组成闭环

解决的问题:VAE 生成的新分子若无法合成等于废纸。逆合成模型把目标产物逐步拆解成可购买的原料。将 VAE 生成器接上逆合成打分,优先保留“能拆解成便宜原料”的候选,可显著提高命中率。

具体案例:某团队在生成管线中加入一个基于 Transformer 的逆合成评估器,候选分子的可合成比例从 40% 提升到 78%,且合成步骤平均减少 2 步。

Python 演示

python79 行
import numpy as np  class CharVAE:    """极简字符VAE: SMILES配方卡 -> 风味坐标, 支持插值与生成"""     def __init__(self, alphabet, seq_len=10, latent_dim=4, lr=0.02):        chars = sorted(set(alphabet))        self.v = len(chars)        self.s = seq_len        self.d = latent_dim        self.lr = lr        self.c2i = {c: i for i, c in enumerate(chars)}        self.i2c = {i: c for i, c in enumerate(chars)}        # 编码器: 字符展平 -> 隐藏层 -> mu/logvar        self.we = np.random.randn(self.v * self.s, 32) * 0.1        self.be = np.zeros(32)        self.wm = np.random.randn(32, latent_dim) * 0.1        self.wv = np.random.randn(32, latent_dim) * 0.1        # 解码器: 潜在向量 -> 字符预测        self.wd = np.random.randn(latent_dim, self.v * self.s) * 0.1        self.bd = np.zeros(self.v * self.s)     def _onehot(self, smiles):        x = np.zeros((len(smiles), self.v * self.s))        for i, s in enumerate(smiles):            for j, c in enumerate(s[:self.s]):                x[i, j * self.v + self.c2i[c]] = 1.0        return x     def encode(self, smiles):        if isinstance(smiles, str):            smiles = [smiles]        h = np.tanh(self._onehot(smiles) @ self.we + self.be)        return h @ self.wm     def decode(self, z):        logits = z @ self.wd + self.bd        ids = logits.reshape(-1, self.s, self.v).argmax(axis=2)        return [''.join(self.i2c[t] for t in row).strip(' ') for row in ids]     def train_step(self, smiles):        x = self._onehot(smiles)        h = np.tanh(x @ self.we + self.be)        mu, logv = h @ self.wm, h @ self.wv        eps = np.random.randn(*mu.shape)        z = mu + np.exp(0.5 * logv) * eps        logits = z @ self.wd + self.bd        n = x.shape[0]        probs = np.exp(logits - logits.max(axis=1, keepdims=True))        probs /= probs.sum(axis=1, keepdims=True)        loss = -np.sum(x * np.log(probs + 1e-8)) / n        loss += 0.5 * np.sum(mu ** 2 + np.exp(logv) - 1 - logv) / n        # 反向传播: 重建梯度        dlogits = (probs - x) / n        dz = dlogits @ self.wd.T        self.wd -= self.lr * z.T @ dlogits        self.bd -= self.lr * dlogits.sum(axis=0)        # 反向传播: KL + 重参数化路径        dmu = dz + mu / n        dv = dz * 0.5 * np.exp(0.5 * logv) * eps        dv += 0.5 * (np.exp(logv) - 1) / n        dh = (dmu @ self.wm.T + dv @ self.wv.T) * (1 - h ** 2)        self.we -= self.lr * x.T @ dh        self.be -= self.lr * dh.sum(axis=0)        return loss  if __name__ == "__main__":    data = ["CCO", "CCN", "CCC", "CO", "CC", "CN", "C=O", "CCOC", "CCCl", "NCCO"]    model = CharVAE(alphabet="".join(data) + " ", seq_len=10)    smiles = [s.ljust(10) for s in data]    for epoch in range(200):        loss = model.train_step(smiles)        if epoch % 50 == 0:            print("epoch %d loss=%.4f" % (epoch, loss))    mid = model.encode("CCO") * 0.5 + model.encode("CCN") * 0.5    print("插值 CCO<->CCN:", model.decode(mid))    print("随机新品:", model.decode(np.random.randn(3, model.d)))
目的:演示一个极简的字符级 VAE,在若干 SMILES 分子上训练后,可以在潜在空间插值并随机生成新分子。真实场景会换成 RNN/Transformer,并在 ZINC 等大规模数据上训练,但核心的“编码-重参数化-解码-KL 正则”完全一致。
  1. x[i, j * self.v + self.c2i[c]] = 1.0把第 j 个字符在字符表中的位置置 1,得到 one-hot 向量。
  2. mu, logv = h @ self.wm, h @ self.wv编码器输出风味坐标的均值和方差对数。
  3. z = mu + np.exp(0.5 * logv) * eps重参数化:随机性来自外部噪声 eps,梯度可穿过 mu/logv 回传。
  4. loss += 0.5 * np.sum(mu ** 2 + np.exp(logv) - 1 - logv) / nKL 正则项,把坐标拉向标准高斯。
  5. dlogits = (probs - x) / nsoftmax 交叉熵的梯度,模型给自己“纠错”。
  6. ids = logits.reshape(-1, self.s, self.v).argmax(axis=2)每步取概率最大的字符,拼成 SMILES。
  7. model.decode(model.encode("CCO") * 0.5 + model.encode("CCN") * 0.5)潜在空间插值:两个分子坐标取平均后再解码。
  8. print("随机新品:", model.decode(np.random.randn(3, model.d)))从标准高斯采样三个 z,生成全新分子。

常见误区

误区初学者常以为 VAE 编码出的 $z$ 就像指纹一样唯一标识一个分子,可以直接拿来算分子相似度、做聚类。

正解$z$ 是概率分布的抽样结果,同一个分子每次编码会得到略有差异的坐标;它保存的是“重建所需信息 + 先验约束后的坐标”,并非严格指纹。做性质预测、相似性检索仍需额外建模验证。就像主厨记的口味坐标是几个主观维度,代替不了成分分析仪。

为何常见:AE 的输出看似确定,加上“连续表示”的说法,很容易让人把它理解成指纹。

误区只要模型生成的 SMILES 能通过语法解析,就认为它是可用的新药候选,直接进入下一步。

正解语法合法只代表“能写成分子”,不代表可合成、稳定、低毒、有活性。真实管线还要做可合成性(SA)评分、ADMET 预测、分子对接打分。就像菜谱写得再漂亮,放不进烤箱也白搭。

为何常见:教程和论文都强调“有效比率”这个指标,让人误以为有效就是高价值。

误区训练时看到 KL 损失压到接近 0 会很开心,认为模型学得很“标准”。

正解KL 为 0 意味着后验坍缩到先验,编码器输出的 $z$ 与输入无关,解码器只会自回归“瞎猜”,生成结果与输入失去对应关系。需要在重建误差与 KL 之间取得平衡(如 $\beta$-VAE 调节权重)。就像主厨把所有菜都记成同一个口味,菜单就废了。

为何常见:“损失函数越小越好”是监督学习的惯性思维,忽略了 VAE 内部两项损失的对抗性平衡。

误区把两个分子的 $z$ 线性插值,认为中间每个点都是良好分子,且性质单调过渡。

正解只有训练充分、潜在空间足够平滑时插值才可靠。数据稀疏区域里,插值点可能落在无效区或性质突变区。实际应抽样多个插值点并逐一验证性质,而不是默认整条线都可用。就像地图上两点连直线,中间可能横跨悬崖。

为何常见:论文中展示的漂亮插值图(红点沿路径移动)让人以偏概全。

误区SMILES 长得像文本,直接在字符串里替换或增删字符(比如把 CCO 改成 CCN)就能得到新分子。

正解SMILES 有严格语法规则:括号要匹配、环闭合数字要成对、原子价态必须合法,随手改很容易得到无效字符串。VAE 的价值恰恰是把“修改”放到潜在空间连续进行,再由解码器约束在合法区域输出,从而避开这种“手工乱改”。

为何常见:SMILES 的可读文本形态让人误以为“文本编辑 = 分子编辑”。

面试题

Q1. VAE 相比传统自编码器(AE)最关键的改进是什么?

单选题 · easy

  • A.增加了更深的全连接网络层数
  • B.让潜在向量服从概率分布并可采样← 正确答案
  • C.使用卷积来替代全连接处理数据
  • D.完全舍弃了重建误差损失函数

答案:B。AE 学的是确定性压缩编码,潜在空间没有先验约束,无法“从空白处采样新样本”;VAE 让编码器输出概率分布(均值+方差),并引入标准高斯先验,因此能随机采样生成新分子。这就像 AE 只会照抄配方卡,而 VAE 学会在风味地图上选点创作。

Q2. SMILES 字符串 "CCO" 表示什么?

单选题 · easy

  • A.三个碳原子组成的丙烷
  • B.两个碳原子组成的乙烷
  • C.两个碳加一个氧组成乙醇← 正确答案
  • D.一个碳加两个氧组成碳酸

答案:C。SMILES 中 C 代表碳、O 代表氧,CCO 从左到右是“碳-碳-氧”,即乙醇(CH3CH2OH)。丙烷应写作 CCC,乙烷写作 CC,H2CO3 写作 C(=O)(O)O。把 SMILES 当配方卡逐字符读,就能避免混淆。

Q3. 重参数化技巧的核心思想是什么?

单选题 · mid

  • A.把随机噪声剥离到独立外部变量← 正确答案
  • B.用更小的网络来缩小模型参数
  • C.将高维的输入降维到低维空间
  • D.通过增加数据量来降低噪声

答案:A。重参数化把 $z=\mu+\sigma\odot\varepsilon$ 中的随机性全部归给外部噪声 $\varepsilon$,使 $\mu$ 和 $\sigma$ 变成确定性路径,梯度能正常回传。这就像帮厨把“掷骰子”的动作从菜谱里拿出来,改由外部骰子决定,厨师本人只需调整配方参数。

Q4. VAE 的损失函数由哪两部分构成?

单选题 · mid

  • A.交叉熵加上均方误差的损失
  • B.重建误差加上 KL 散度损失← 正确答案
  • C.对比损失加上三元组损失项
  • D.感知损失加上对抗训练的项

答案:B。VAE 的 ELBO 由重建项(解码还原输入的对数概率)和 KL 正则项(编码分布与先验的距离)组成。前者保证分子还原得准,后者保证潜在空间规整、可采样。两者缺一不可,如同记菜既要记得准,又要让地图有序。

Q5. 下列关于潜在空间的描述,哪些是正确的?

多选题 · mid

  • A.相似的分子在空间中距离较近← 正确答案
  • B.空间中的点都是离散不连续
  • C.插值可以得到性质渐变的分子← 正确答案
  • D.潜在空间维度越高生成越好

答案:AC。由于 KL 正则把编码拉向连续高斯,相似结构分子会聚在一起且空间连续,插值路径上性质近似渐变。潜在空间并非离散点集,维度也不是越高越好——维度太高反而易过拟合或产生大量空白区。

Q6. “后验坍缩”指的是什么现象?

单选题 · hard

  • A.训练集过少导致的欠拟合问题
  • B.生成的分子全都相同缺乏多样性
  • C.解码器完全忽略潜在向量自回归← 正确答案
  • D.编码器的输出坍缩成单一高斯

答案:C。后验坍缩指 KL 项把 $q(z|x)$ 压到与先验几乎一致,编码器给出的 $z$ 不再携带输入信息,解码器干脆忽略 $z$、只靠自回归语言模型“瞎写”。此时损失看似很低,但生成结果与输入脱节,是 VAE 训练需要警惕的退化,而不是简单的欠拟合。

Q7. 评估分子生成模型常用的指标有哪些?

多选题 · hard

  • A.生成分子的有效比率← 正确答案
  • B.生成分子的新颖程度← 正确答案
  • C.生成分子的多样性← 正确答案
  • D.模型训练的时间开销

答案:ABC。有效比率衡量 SMILES 语法与价态合法性,新颖性衡量与训练集的差异,多样性衡量生成分子彼此的结构差异,三者共同刻画“生成质量”。训练时间属于工程成本而非生成质量指标,审稿人和药企都不会用它来评价模型产出的好坏。

Q8. 在潜在空间做性质定向优化常用的方法是?

单选题 · mid

  • A.用网格搜索枚举潜在空间组合
  • B.直接检索训练集中的最相似分子
  • C.对潜在向量做随机初始化采样
  • D.沿性质预测器梯度做上升更新← 正确答案

答案:D。常用做法是训练性质预测器 $J$,然后对 $z$ 做梯度上升 $z \leftarrow z + \eta\nabla J(G(z))$,迭代得到性质更优的潜在坐标再解码。随机采样没有指向性,网格搜索在高维空间不现实,检索训练集则无法产生新结构。

Q9. 关于 SMILES 上的 VAE 建模,下列说法正确的是?

多选题 · hard

  • A.SMILES 语法错误会导致分子无效← 正确答案
  • B.字符级循环网络常用于串联解码← 正确答案
  • C.每个字符都代表一个独立的分子
  • D.括号与环数字表达分子分支环← 正确答案

答案:ABD。SMILES 中括号表示分支、数字表示环闭合,语法错误会直接产生无效分子;字符级 RNN 逐字符生成是经典解码方式。单个字符只是原子或符号,不是完整分子,因此 C 错。

Q10. 逆合成分析主要解决什么问题?

单选题 · easy

  • A.从起始原料正向预测目标产物
  • B.计算分子与靶点间的结合亲和力
  • C.预测分子在人体内的代谢产物
  • D.从目标分子反推可能的合成路线← 正确答案

答案:D。逆合成是从目标产物出发,反向拆解出反应条件和可购买原料,回答“这分子怎么做出来”。正向预测产物、结合能计算、代谢预测都属于其他任务。这就像拿到成品菜后反推原料与步骤,确保帮厨发明的新菜真的能端上桌。