分子如何被计算机理解,直接决定了深度学习模型在化学任务上的上限。一个分子既可以用图来描述,节点是原子、边是化学键,也可以用SMILES这种一维字符串来表达,例如乙醇可以写成CCO。这两种表示方式对应了两类截然不同的建模思路:图神经网络GNN直接在分子图上做消息传递,而SMILES序列则交给循环神经网络或Transformer处理。本文将从多个维度对比这两种表示方式,帮助读者理解它们各自的优势与局限。

分子图与图神经网络的建模原理
从化学本质上看,分子天然就是一张图。原子携带原子序数、电负性、手性等属性,化学键携带键级、共轭性、立体信息等属性。图神经网络的核心思想是消息传递:每一轮迭代中,每个原子收集邻居原子传来的信息并更新自己的向量表示。经过若干轮传递后,原子的向量中就融合了局部化学环境的信息,最后通过读出函数把所有原子向量汇聚成整个分子的表示,用于性质预测或生成。
一个典型的消息传递层可以用PyTorch Geometric这样实现:
import torch
import torch.nn.functional as F
from torch_geometric.nn import GCNConv, global_mean_pool
class MolecularGNN(torch.nn.Module):
def __init__(self, num_atom_features, hidden_dim=64):
super().__init__()
self.conv1 = GCNConv(num_atom_features, hidden_dim)
self.conv2 = GCNConv(hidden_dim, hidden_dim)
self.conv3 = GCNConv(hidden_dim, hidden_dim)
self.fc = torch.nn.Linear(hidden_dim, 1)
def forward(self, data):
x, edge_index, batch = data.x, data.edge_index, data.batch
# 三轮消息传递,逐层扩大感受野
x = F.relu(self.conv1(x, edge_index))
x = F.relu(self.conv2(x, edge_index))
x = F.relu(self.conv3(x, edge_index))
# 池化得到分子级表示
x = global_mean_pool(x, batch)
return self.fc(x)这种建模方式最大的好处是与化学结构高度对齐。模型不依赖原子在字符串中的书写顺序,两个拓扑结构相同的分子无论SMILES如何书写,得到的图是一致的,这从根本上避免了序列建模中的顺序敏感问题。此外,边的特征不会被丢弃,双键和单键在图中是明确区分的,而在SMILES字符串里这些信息靠语法符号隐式表达。
SMILES字符串与序列模型的应用
SMILES用一行文本描述分子结构,苯环可以写作c1ccccc1。这种表示的最大优势在于它是标准的字符串,可以直接复用自然语言处理领域成熟的技术栈。早期工作使用LSTM对SMILES建模进行分子生成,近年来随着Transformer的兴起,基于SMILES的预训练化学大模型层出不穷,这些模型在海量未标注分子上训练,再迁移到下游任务,往往能取得不错的性质预测效果。
下面是一个把SMILES转为模型输入的简化流程:
from rdkit import Chem
def smiles_to_ids(smiles, vocab):
mol = Chem.MolFromSmiles(smiles)
if mol is None:
raise ValueError("无效的SMILES字符串")
# 按原子逐一拆分token,构建输入序列
tokens = [atom.GetSymbol() for atom in mol.GetAtoms()]
ids = [vocab.get(t, vocab["<unk>"]) for t in tokens]
return ids
vocab = {"<unk>": 0, "C": 1, "O": 2, "N": 3, "c": 4}
print(smiles_to_ids("CCO", vocab)) # 输出 [1, 1, 2]不过SMILES也有明显短板。同一个分子存在多种合法写法,即非唯一性问题,如果训练数据没有做规范化,模型需要浪费容量去学习这些无意义的变体。更严重的是,序列模型自回归生成时可能产出语法无效的SMILES,对应的分子根本不存在。常用的缓解手段包括随机化SMILES做数据增强、使用SELFIES这种保证语法有效性的替代表示等。
如何选择表示方式以及混合建模思路
选择哪种表示,首先看任务类型。如果是分子性质预测,尤其是溶解度、毒性、HOMO-LUMO间隙这类与局部化学环境强相关的任务,图神经网络通常是更稳妥的起点,图结构带来的归纳偏置使模型在小数据集上更容易泛化。如果是分子生成或者需要利用大规模预训练模型的场景,SMILES序列模型则更有优势,因为生成文本比逐原子生成图要简单直接得多。
其次看数据规模和工程条件。图神经网络的实现涉及批处理图、动态邻接结构,工程复杂度略高,但PyTorch Geometric和DGL已经把这些问题封装得很好。SMILES路线可以直接套用HuggingFace生态,训练和部署成本更低,也更容易与现有的文本模型基础设施整合。
实践中,两种表示并非互斥,混合建模往往效果更好。一种常见做法是用SMILES随机化作为数据增强,训练图神经网络;另一种做法是同时输入分子图和SMILES,让一个共享预测头的多分支模型融合两种视图的特征,图分支捕获拓扑结构,序列分支捕获更全局的统计模式。此外,3D图表示也在兴起,加入原子坐标和距离信息后,等变图网络在结合能预测等任务上显著超越纯2D方法。
# 融合图表示与SMILES表示的简单示意
class HybridModel(torch.nn.Module):
def __init__(self, gnn, seq_encoder, hidden_dim):
super().__init__()
self.gnn = gnn # 图分支
self.seq_encoder = seq_encoder # 序列分支
self.head = torch.nn.Linear(hidden_dim * 2, 1)
def forward(self, mol_graph, smiles_ids):
g_feat = self.gnn(mol_graph) # 分子图特征
s_feat = self.seq_encoder(smiles_ids) # SMILES特征
fused = torch.cat([g_feat, s_feat], dim=-1)
return self.head(fused)总结来说,图神经网络保留了分子的结构本质,适合性质预测和结构感知任务;SMILES借力序列建模与大模型生态,适合生成任务和大规模预训练。理解两者的底层逻辑和适用边界,再根据具体任务灵活组合,才能真正把分子表示的价值发挥出来。