第1章:分子表示与特征概述

说到分子特征编码,我得先跟你聊聊最基础的问题:分子到底该怎么“告诉”计算机?这可不是个简单事。分子是三维的、动态的、充满电子的复杂实体,但计算机只认数字和符号。你想想看,怎么能把一个分子塞进Transformer模型里?

做这个课程之前,我在制药公司干了几年分子建模。那时候处理的数据集动不动上百万个分子,每种表示方法都有坑。有的表示法信息全但计算慢,有的快但丢关键结构。今天这一章,我把常见的几种分子表示法掰开揉碎了讲清楚。

核心知识点速览:学习本章后,你将掌握SMILES、InChI、分子图三种主流表示法的底层逻辑、适用场景和踩坑经验,为后续Transformer编码打好基础。

1.1 SMILES:最流行的线性表示法

SMILES全称Simplified Molecular Input Line Entry System。说白了,就是把分子结构“压扁”成一行字符串。比如乙醇(酒精)的SMILES是:

CCO

够简单吧?C代表碳,O代表氧,后面的数字表示分支或环。比如苯环的SMILES是:

c1ccccc1

小写的c代表芳香碳,数字1是环的“成对标签”。

优点:

  • 字符串格式,天然适合RNN、Transformer等序列模型
  • 存储紧凑,一个分子几十个字符搞定
  • 可读性好,化学家一眼能看懂大致结构

缺点:

  • 同一分子有多种表示——比如乙醇可以写成CCO、OCC,甚至带括号的变体。这会导致模型认为它们是不同分子!
  • 缺乏三维构象信息,立体化学处理复杂
  • 对大型分子(如多肽)字符串会很长,计算效率下降

我的避坑经验:曾经有个项目,用SMILES训练分子属性预测模型,训练集上效果不错,但验证集表现差很多。查了一周才发现是数据预处理时没有做SMILES标准化(统一用RDKit的Canonical SMILES)。从那以后,我凡是做SMILES任务,第一件事就是调RDKit的Chem.MolToSmiles(mol)做规范化。

1.2 InChI:国际标准化表示

InChI(International Chemical Identifier)是IUPAC主导开发的标准化标识符。它不像SMILES那样追求简洁,而是把分子的结构信息分层编码。比如水的InChI是:

InChI=1S/H2O/h1H2

这串字符里:

  • 1S 表示版本号
  • H2O 是分子式
  • h1H2 描述氢原子连接

InChI还有个“兄弟”叫InChIKey,是把长InChI哈希成固定长度的字符串(27字符)。比如水的InChIKey是:

XLYOFNOQVPJJNP-UHFFFAOYSA-N

优点:

  • 唯一的表示——一个分子只有一种标准InChI,彻底解决SMILES多表示问题
  • 分层结构,可以按需忽略或保留某些信息(比如立体化学、同位素)
  • 数据库查询的首选,PubChem、ChEBI等都用它做主键

缺点:

  • 字符串可读性极差,人类几乎无法直接从InChI猜出分子结构
  • 编码长度比SMILES长很多,对大分子数据集存储不友好
  • 生成和解析需要RDKit等工具,比SMILES慢一个数量级

注意:千万不要直接用InChI字符串作为Transformer的输入序列。原因很简单:它包含太多斜杠、括号、数字的复杂格式,词汇表会爆炸。我见过有人这么干,模型根本学不收敛。正确的做法是先特征化(比如转成哈希指纹或子结构计数)。

1.3 分子图:最贴近化学直觉的表示法

分子图是把原子看作节点(Node),化学键看作边(Edge)。比如水的分子图就是:一个氧节点连着两个氢节点,每条边表示一个单键。

这种表示法非常自然,因为化学家本来就是靠画“结构式”来理解分子的。每个原子可以用它的元素种类、孤对电子数、杂化状态等作为节点特征;每条边可以用键级(单键、双键、三键)、芳香性等作为边特征。

优点:

  • 天然保留拓扑结构,适合GNN、图Transformer等模型
  • 可以灵活加入原子级和键级特征,信息丰富
  • 能处理三维构象(在节点中加入坐标信息)

缺点:

  • 图结构不固定,节点和边的数量因分子而异,给批量计算带来麻烦(需要padding或batching策略)
  • 存储结构比字符串复杂,需要额外的邻接矩阵或边列表
  • 构建图的计算成本比解析SMILES高

我的经验:用分子图做Transformer编码时,我习惯先用RDKit生成MolGraph,然后预先计算所有分子的最大原子数和最大键数,统一padding到该尺寸。这样批量计算时效率高很多。

1.4 三种表示法对比

表示法 数据结构 信息完整性 计算效率 唯一性 模型适配
SMILES 字符串 中等(缺三维) 高 低(需标准化) 序列模型
InChI 字符串 高(含立体化学) 中 高 序列模型(需特征化)
分子图 图(节点+边) 高(可扩展) 低(构建慢) 高(按定义构建) 图模型

1.5 从表示到特征:为什么需要编码?

不管是SMILES字符串还是分子图,都不能直接喂给Transformer吃。Transformer吃的是数字向量。所以我们需要一个“翻译”步骤,把分子结构化表示转为数值特征向量。

常用的特征化方法包括:

  • One-hot编码:把每个原子或子结构映射成稀疏向量
  • 分子指纹:如摩根指纹(Morgan Fingerprint),把分子结构哈希成固定长度的0/1向量
  • 原子属性向量:给每个原子分配一个特征向量,包含元素种类、价电子数、电荷等
  • 预训练嵌入:用大量无标签分子学出来的向量表示,类似NLP中的Word2Vec

我个人偏好先用分子指纹做快速实验,然后逐步过渡到原子级特征向量。这样能快速验证任务可行性,再精细化模型设计。

下面这张图展示了分子从原始结构到Transformer输入的完整流程:

分子表示与特征化流程 分子结构 (原子、键、构象) SMILES CCO / c1ccccc1 InChI InChI=1S/H2O/h1H2 分子图 节点+边+属性 字符串编码 Token嵌入/指纹 哈希编码 InChIKey/层 图特征向量 原子/键属性 Transformer编码器

从这张图可以看出,不管我们选哪种分子表示法,最终都要经过 特征化(Featureization) 这一关,才能进入Transformer的世界。这恰恰是本书后面要重点讲的内容。

1.6 怎么选?我给的建议

你可能会问:这么多表示法,我到底该选哪个?我给出的选择策略是这样的:

  1. 先看任务类型:如果做分子生成(如药物分子设计),SMILES直接做序列生成最简单;如果做性质预测(如毒性、溶解度),分子图+GNN效果好;如果做跨库匹配(如数据库去重),InChI是唯一标准。
  2. 考虑数据规模:几百万分子的超大数据集,优先用SMILES(生成快、存储小);几千分子的中小规模,用分子图更精细。
  3. 不要一条路走到黑:我经常做多表示法融合实验——用SMILES的序列语义和分子图的结构信息一起训练。很多任务上效果比单一表示法好5%~15%。

一个血泪教训:有个药物筛选项目,我用SMILES直接训练Transformer,验证集AUC到了0.92,心花怒放。结果放到新库测试,掉到0.65。后来发现问题:训练集的SMILES全部是规范化的,但测试集上有些分子带有立体化学标记(@符号),模型没见过。所以做跨库迁移时,务必统一表示规范和特征化流程。