生成模型概览: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. 四大模型比较
下面这张表是我日常挑选模型的参考,你想想看哪个指标对你更重要。
| 指标 | GAN | VAE | Flow | 扩散模型 |
|---|---|---|---|---|
| 生成质量 | 中高(模式坍塌风险) | 中等 | 高 | 非常高 |
| 多样性 | 低(易坍塌) | 高 | 高 | 高 |
| 训练稳定性 | 差(平衡困难) | 好 | 好 | 好 |
| 似然计算 | 无 | 下界(ELBO) | 精确似然 | 变分下界 |
| 采样速度 | 快 | 快 | 快 | 慢(需多步) |
| 分子图适用性 | 差(离散难处理) | 中等 | 差(维度高) | 好(3D 优势明显) |
6. 如何选择?
没有完美的模型,只有合适的场景。
- 快速原型、需要大规模采样 => VAE(简单可靠)
- 追求最高生成质量、不计较速度 => 扩散模型(比如生成高精度 3D 构象)
- 需要精确的似然值来做性质优化 => Flow(但要做好维度压缩)
- 想搞点新花样、任务简单 => GAN(配合离散优化技巧)
说白了,我自己的项目里用得最多的是 VAE + 扩散模型的组合——VAE 先负责快速探索隐空间,扩散模型再精修局部结构。我们来看看这四种模型的整体框架,一目了然。
记住:模型只是工具,你的分子领域知识才是决定因素。不管选哪个模型,都要重视分子表示、化学有效性约束和性质导向的损失函数。