分子图生成:基于图与字符串的分子设计

FreeGuideOnline 最新 2026-06-27

分子图生成:从图到字符串的分子设计之旅

分子生成是计算化学与药物发现的核心任务之一。无论是寻找新药候选分子,还是设计具有特定性质的功能材料,我们都需要一种能够高效探索化学空间的方法。本教程将从零开始,介绍分子图生成的基本概念与实践,带你理解如何将分子结构表示为图或字符串,并利用生成模型设计全新分子。


1. 分子的两种语言:图与字符串

在计算机中表示分子结构,最常用的方式有两种:分子图与线性字符串。

1.1 分子图表示

  • 节点:原子(如 C、N、O),通常包含原子类型、形式电荷、手性等特征。
  • :化学键(单键、双键、三键、芳香键),有时会包含键的立体化学信息。
  • 图整体:一个无向(或有向,若考虑反应)的带属性图。

分子图的最大优势在于它天然地保留了原子的连接关系与局部化学环境,是分子性质预测和生成式模型的理想输入。然而,图结构的生成属于组合问题,需要特殊的神经网络架构(如图神经网络、图变分自编码器)来处理。

1.2 分子字符串表示

将分子结构压缩为一串字符,最著名的标准是 SMILES(Simplified Molecular Input Line Entry System)。例如:

  • 乙醇:CCO
  • 苯:c1ccccc1
  • 阿司匹林:CC(=O)OC1=CC=CC=C1C(=O)O

字符串表示的优点在于可以直接使用自然语言处理(NLP)领域的模型(如 Transformer、RNN)来生成分子,无需复杂的图生成规则。但其缺点也很明显:一个分子可以有多个合法的 SMILES 表示(非唯一性),且微小的字符差异可能导致完全不同的结构。


2. 分子生成的基本范式

无论选择图还是字符串,分子生成任务都可形式化为:给定一个目标性质或结构约束,从化学空间中采样出合理的分子。主流方法分为以下几类:

2.1 基于图的生成模型

直接生成分子图,逐步添加节点(原子)和边(键),通常采用自回归方式。

  • 分子图生成过程:从一个空图或起始原子开始,每一步模型决策“在哪个位置添加什么原子”以及“添加哪种键”,直到输出结束符。
  • 常用架构:图神经网络(GNN)作为编码器,结合门控循环单元(GRU)或 Transformer 解码器。
  • 代表模型:MolGAN、GraphAF、GraphEBM 等。
  • 挑战:确保生成的图在化学上有效(化合价饱和、无高张力环等),常需引入化学规则约束或强化学习奖励。

2.2 基于字符串的生成模型

将分子生成视为序列生成任务,利用语言模型逐字符生成 SMILES 字符串。

  • 训练方式:在大规模分子库(如 ChEMBL、ZINC)上预训练字符级或词片段的语言模型。
  • 核心架构:LSTM、Transformer、GPT 类模型。
  • 代表性工作
    • SMILES LSTM:早期工作,直接生成 SMILES,再用属性预测器做微调。
    • SMILES Transformer:利用自注意力机制捕捉长程依赖,生成有效性大幅提升。
    • 结合强化学习:用奖励信号(如 QED 药物相似性、对接分数)引导生成目标性质分子。
  • 技巧:使用规范化 SMILESSELFIES(一种能保证100%有效性的分子字符串)来避免无效输出。

2.3 混合生成策略

结合图与字符串的优势,例如先用字符串生成骨干结构,再通过图细化局部子结构;或者在潜空间中使用图编码器,再用序列解码器生成 SMILES。这类方法兼顾了图的结构感知与序列生成的灵活性。


3. 动手实践:搭建你的第一个分子生成模型

下面我们以基于 SMILES 的字符级语言模型为例,使用 Python 和 PyTorch 快速构建一个生成器。这将是理解整个流程的最快路径。

3.1 数据准备:获取与预处理 SMILES

import pandas as pd
from rdkit import Chem

# 加载示例数据集(例如 ZINC 的切片)
df = pd.read_csv("zinc_subset.csv")  # 包含 'smiles' 列
smiles_list = df['smiles'].dropna().tolist()

# 过滤无效且长度合理的分子
def is_valid(smi):
    mol = Chem.MolFromSmiles(smi)
    return mol is not None and 10 <= len(smi) <= 100

clean_smiles = [s for s in smiles_list if is_valid(s)]

# 构建字符词汇表
chars = sorted(list(set(''.join(clean_smiles) + '<SOS> <EOS> <PAD>')))
char2idx = {ch: i for i, ch in enumerate(chars)}
idx2char = {i: ch for ch, i in char2idx.items()}
vocab_size = len(chars)

SELFIES 版本:安装 selfies 库,将 SMILES 转为 SELFIES,使用同样的字符级处理,生成有效性可达 100%。

3.2 模型定义:LSTM 生成器

import torch
import torch.nn as nn

class SMILESGenerator(nn.Module):
    def __init__(self, vocab_size, embed_dim=128, hidden_dim=256, num_layers=2):
        super().__init__()
        self.embed = nn.Embedding(vocab_size, embed_dim, padding_idx=char2idx['<PAD>'])
        self.lstm = nn.LSTM(embed_dim, hidden_dim, num_layers, batch_first=True)
        self.fc = nn.Linear(hidden_dim, vocab_size)
    
    def forward(self, x, hidden=None):
        x = self.embed(x)
        out, hidden = self.lstm(x, hidden)
        logits = self.fc(out)  # 输出每个位置的下一个字符概率
        return logits, hidden

3.3 训练循环(简化版)

  • 输入:起始符 <SOS> + SMILES(去掉结尾),目标:SMILES + <EOS>
  • 损失函数:交叉熵,忽略填充位。
  • 训练后即可用于采样:输入 <SOS>,模型预测下一个字符,直到生成 <EOS> 或达到最大长度。

3.4 采样与后处理

def sample(model, max_len=100, temperature=1.0):
    model.eval()
    with torch.no_grad():
        input_seq = torch.tensor([[char2idx['<SOS>']]])
        hidden = None
        generated = []
        for _ in range(max_len):
            logits, hidden = model(input_seq, hidden)
            logits = logits[0, -1] / temperature
            probs = torch.softmax(logits, dim=-1)
            next_idx = torch.multinomial(probs, 1).item()
            if next_idx == char2idx['<EOS>']:
                break
            generated.append(idx2char[next_idx])
            input_seq = torch.tensor([[next_idx]])
        return ''.join(generated)

若使用 SELFIES,解码后可直接用 selfies.decoder 转换回 SMILES。


4. 提升生成质量与目标导向

简单的字符模型生成的分子随机性高,可能不符合期望的性质。引入以下技术可大幅提升实用性:

  • 条件生成:将性质(如 logP、分子量)编码为条件向量,与字符嵌入拼接,学习性质到结构的映射。
  • 强化学习(RL):预训练一个性质预测器,用其输出作为奖励,通过策略梯度微调生成模型,使其偏向高奖励区域。
  • 分子优化:从已知活性分子出发,通过图编辑或字符串变异生成类似物,结合贝叶斯优化或遗传算法搜寻最优性质。

5. 评估生成分子的指标

指标 说明
有效性 (Validity) 生成 SMILES 能被 RDKit 成功解析的比率。
唯一性 (Uniqueness) 生成不重复分子的比例。
新颖性 (Novelty) 生成分子不在训练集中的比例。
目标性质命中率 满足期望性质区间(如 QED > 0.6)的分子比例。
内部多样性 生成集内分子的化学空间多样性。

6. 拓展阅读与工具推荐

  • RDKit:分子处理的工业标准库,支持 SMILES 解析、描述符计算、可视化。
  • GuacaMol:基准测试框架,包含分布学习、目标生成等任务。
  • SELFIES:论文《SELFIES: a robust representation of semantically constrained graphs》,彻底解决语法无效问题。
  • 深度生成模型:JT-VAE(连接树变分自编码器)、GraphINVENT、MoFlow 等代表图生成的前沿方法。

分子图生成正以极快的速度推动着药物发现的自动化。从简单的字符语言模型到复杂的图神经网络,每一种方法都在探索化学宇宙的边界。无论你是刚入门的学习者,还是希望将其应用于实际项目的开发者,理解这些核心表示和生成范式都将是通往分子设计未来的第一步。