生成模型概览:GAN、VAE、Flow 与扩散模型

搞分子生成这行,绕不开四种主流模型——GAN、VAE、标准化流和扩散模型。它们各有各的脾气,也各有各的擅长领域。我个人习惯先理解它们的核心逻辑,再看怎么往分子图上套。今天咱们就把这四家拉出来,好好捋一捋。

1. GAN(生成对抗网络)— 对抗中学习

GAN 的思路很直白:让生成器和判别器互相“打架”。生成器负责伪造分子,判别器负责识别真假。打到最后,生成器能骗过判别器,就练成了。我在项目中遇到过的一个典型问题是训练不稳定——生成器和判别器很难同时收敛。尤其是分子结构这种离散数据,梯度容易消失。

我曾经踩过的坑:为图省事直接把 GAN 套在 SMILES 序列上,结果生成的全是化学上不合理的字符串。后来改用 WGAN-GP + 梯度惩罚,效果才勉强能看。所以如果你要玩分子 GAN,一定要加约束条件,比如结合合法的原子连接规则。

# GAN 训练循环(伪代码)
for epoch in range(epochs):
    # 更新判别器
    z = sample_noise(batch_size)
    fake_mols = generator(z)
    d_loss = -torch.mean(log(discriminator(real_mols))) \
             - torch.mean(log(1 - discriminator(fake_mols.detach())))
    d_loss.backward(); optimizer_d.step()

    # 更新生成器
    z = sample_noise(batch_size)
    fake_mols = generator(z)
    g_loss = -torch.mean(log(discriminator(fake_mols)))
    g_loss.backward(); optimizer_g.step()

2. VAE(变分自编码器)— 隐空间的连续舞者

VAE 的核心是“压缩再重建”。它把分子结构编码到一个连续的隐空间,然后从这个空间里采样再解码回去。我个人觉得 VAE 最优雅的地方在于:KL 散度强迫隐空间变得规整,这样采样出来的新向量大概率能解码成合理分子。

但要注意后验塌陷——当解码器过于强大时,编码器会“偷懒”,隐空间失去意义。我建议在分子 VAE 中适当加大 KL 项的权重,或者用 β-VAE 的变体。

组件作用常见坑
编码器将分子映射到 μ, σ输出方差太小导致 KL 失效
重参数化从 N(μ, σ²) 采样忘记 detach 或梯度不正确
解码器从隐变量重建分子序列越长重建越差
# VAE 损失函数(分子图版本)
recon_loss = reconstruction_loss(x, x_recon)  # 如交叉熵
kl_loss = -0.5 * torch.sum(1 + log_var - mu.pow(2) - log_var.exp())
loss = recon_loss + beta * kl_loss

3. Flow(标准化流)— 可逆的可追踪路径

标准化流是一系列可逆变换的链。它能把简单的先验分布(比如高斯)一步步“掰”成复杂的数据分布。最大的好处是:你不仅能采样,还能精确计算生成样本的似然值。我在做分子性质优化时特别偏爱它——因为可以用最大似然估计直接训练。

但代价也很明显:每次变换都得算雅可比行列式,计算量随着维度爆炸。分子图通常用邻接矩阵表示,维度动辄几百,用 Flow 前得考虑维度压缩。我建议先用自编码器降维,再在隐空间上套 Flow。

# 一个简单的仿射耦合层(RealNVP 风格)
def forward(self, x):
    x1, x2 = x.chunk(2, dim=-1)
    s, t = self.net(x1)
    y2 = x2 * torch.exp(s) + t
    return torch.cat([x1, y2], dim=-1)

4. 扩散模型 — 噪声中诞生

扩散模型这两年风头正劲。它的想法挺有意思:先慢慢给分子加噪声直到完全破坏,再学一个逆向过程从噪声里把分子“捞”回来。说白了就是做了一次“破坏-修复”游戏。我参与的项目里,用扩散模型生成的 3D 分子构象质量明显高于 GAN 和 VAE。

不过理解起来确实绕——正向是马尔可夫链加噪,反向是去噪网络预测噪声。采样步数通常要 1000 步,慢得让人抓狂。后来我用 DDIM 把步数压缩到 50 步,质量还能保持 90% 以上。

⚠ 注意:扩散模型采样速度是硬伤。如果你需要实时生成(比如交互式分子设计),建议用蒸馏或一致性模型加速。

5. 四大模型比较

下面这张表是我日常挑选模型的参考,你想想看哪个指标对你更重要。

指标GANVAEFlow扩散模型
生成质量中高(模式坍塌风险)中等高非常高
多样性低(易坍塌)高高高
训练稳定性差(平衡困难)好好好
似然计算无下界(ELBO)精确似然变分下界
采样速度快快快慢(需多步)
分子图适用性差(离散难处理)中等差(维度高)好(3D 优势明显)

6. 如何选择?

没有完美的模型,只有合适的场景。

  • 快速原型、需要大规模采样 => VAE(简单可靠)
  • 追求最高生成质量、不计较速度 => 扩散模型(比如生成高精度 3D 构象)
  • 需要精确的似然值来做性质优化 => Flow(但要做好维度压缩)
  • 想搞点新花样、任务简单 => GAN(配合离散优化技巧)

说白了,我自己的项目里用得最多的是 VAE + 扩散模型的组合——VAE 先负责快速探索隐空间,扩散模型再精修局部结构。我们来看看这四种模型的整体框架,一目了然。

四种生成模型框架对比 分子训练数据 GAN 生成器 + 判别器 VAE 编码 + 重参数 + 解码 Flow 可逆变换链 扩散模型 加噪 → 去噪 生成分子 图注:箭头表示数据流动方向;各模型内部简化了主要组件,实际实现各有变体。 例如 VAE 可替换为 β-VAE,扩散模型可改用得分匹配或流匹配。

记住:模型只是工具,你的分子领域知识才是决定因素。不管选哪个模型,都要重视分子表示、化学有效性约束和性质导向的损失函数。