1. 分子生成与损失函数概述
说实话,分子生成这个方向这几年火得不行。你想想看,传统药物研发动辄十年、耗资数十亿美元,而分子生成模型能从零开始设计全新的候选分子,把周期压缩到几个月。我个人觉得,这个领域最核心的密码就藏在损失函数里。模型学得好不好,生成的分子的质量高不高,说到底都取决于你如何设计那个驱动模型更新的信号。这一章,我们先搭好知识框架。
1.1 分子生成任务到底在做什么?
分子生成,说白了就是让模型学会「创造」新分子。不是从现有的分子库里挑一个,而是从无到有地生成满足特定性质的全新结构。举个例子,你给模型一个目标——「生成一个对某靶点有活性、毒性低、且容易合成的分子」,模型需要输出对应的化学结构。
分子可以用多种方式表示:
- SMILES 字符串——像写化学式一样用字符序列表示分子,
CCO就是乙醇。 - 分子图——原子是节点,化学键是边,天然适合 GNN。
- 3D 坐标——包含原子的三维空间位置,用于构象生成。
生成任务的目标通常包括:有效性(生成的分子符合化学价键规则)、新颖性(不在训练集里)、目标性质达标(比如 LogP、溶解度、生物活性)。这些目标最终都要通过损失函数来量化、来约束。
1.2 主流的四类生成模型
目前分子生成领域有四种主流模型,各有各的脾气。我在项目中把这几类都用过一遍,踩过坑也尝过甜头。
| 模型 | 核心机制 | 主要损失函数 | 生成质量 | 多样性 | 训练难度 |
|---|---|---|---|---|---|
| VAE | 编码器将分子映射到隐空间,解码器从隐向量重构分子 | ELBO(重构损失 + KL 散度) | 中等 | 高 | 低 |
| GAN | 生成器与判别器博弈,生成器试图骗过判别器 | 对抗损失 + 可能加辅助损失 | 高 | 中等 | 高 |
| Diffusion | 前向加噪,反向去噪,一步步从噪声恢复分子结构 | 扩散损失(去噪匹配的 MSE) | 很高 | 高 | 中等 |
| Flow | 用一系列可逆变换将简单分布映射到分子数据分布 | 对数似然(负对数似然最小化) | 高 | 高 | 高 |
VAE 是我最早接触的模型。我记得刚开始做分子生成时,用的就是 VAE。它简单稳定,但生成的分子的多样性往往不够。问题出在 KL 散度那个项——它强制隐空间接近标准正态分布,有时候会「压扁」了隐空间的表达能力。
GAN 能生成质量很高的分子,但训练过程像走钢丝。我在项目中遇到过 GAN 训练不稳定的情况,生成器 loss 突然崩掉,输出一堆无效的 SMILES。后来加了梯度惩罚和辅助分类损失才稳住。
Diffusion 是最近的大热门。我建议你从它入手,因为它的损失函数最直观——就是让模型学会预测每一步加的噪声。你想想看,这么简单的目标函数,却能在分子生成上取得顶尖效果,很有意思。
Flow 的优势在于精确的对数似然计算,分子表示的信息损失最小。缺点是模型结构设计受限,必须用可逆层。
1.3 损失函数——驱动模型学习的引擎
损失函数到底是什么角色?说白了,它就是模型学习方向的「指南针」。模型看到一堆分子数据,但不知道什么样的分子是「好」的。损失函数告诉它:你生成的分子和真实分子差距有多大,你的隐空间分布是否合理,你的分子是否满足目标性质。
在分子生成中,损失函数需要同时平衡多个目标:
- 重构保真度——生成分子要和真实分子在结构上相似。
- 隐空间规整性——隐空间要连续、可插值,不能有空洞。
- 性质约束——生成的分子要在特定性质上达标。
- 化学有效性——生成的分子必须符合化学规则(比如化合价、环的稳定性)。
下面是一个最经典的 VAE 损失函数实现,你可以感受一下损失函数的组成:
import torch
import torch.nn.functional as F
def vae_elbo_loss(x, x_recon, mu, log_var):
"""VAE 的 ELBO 损失:重构损失 + KL 散度"""
recon_loss = F.mse_loss(x_recon, x, reduction='sum')
kl_loss = -0.5 * torch.sum(1 + log_var - mu.pow(2) - log_var.exp())
return recon_loss + kl_loss
你看,这行代码虽然短,但背后是整个 VAE 的理论推导。重构损失保证生成的分子的结构准确,KL 散度保证隐空间规整。后面讲到 Diffusion 和 Flow 时你会发现,它们的损失函数形式不同,但底层逻辑是一样的——用数学量来度量「生成分布」与「真实分布」的差距。
1.4 知识框架总览
下面这张图把本章的核心脉络串在一起。分子生成任务是顶部的大目标,四种模型是中间的「引擎」,损失函数是底部的「方向盘」。整个课程就是围绕这个框架一层层展开的。
这张图会一直贯穿整个课程。后续每一章讲具体的损失函数设计时,你都可以回到这张图来定位:我们现在是在改造哪个模型的哪个损失项?它如何影响分子生成任务的目标?
嗯,这一章就到这里。框架搭好了,后面就是一步步往里面填细节的过程。损失函数设计这条路,每一步都有门道,我们慢慢走。