化学信息学中的机器学习:从性质预测到多目标分子设计
发布时间:2026/11/3 10:51:25 锦皓数字建站

简介这份PDF资料是Jon Paul Janet在AstraZeneca期间所作的《Machine Learning in Chemistry now and in the future》报告面向化学、药物研发与材料领域的科研人员及对交叉学科感兴趣的学习者帮助理解机器学习如何嵌入化学研究流程。内容以引言、案例研究、化学中的机器学习应用与结论四大板块展开涵盖CASP13/14蛋白折叠预测竞赛中AlphaFold的突破、多目标药物设计、分子结构预测、材料设计、反应预测与数据驱动实验设计等具体场景兼具方法脉络与工业实践视角。资源包共1个PDF文件约41.44MB页面以幻灯片形式组织目录清晰、图表与要点并重便于按章节快速检索与对照阅读。目前已有222人学习适合希望系统建立机器学习化学应用认知框架的读者作为入门与延伸参考。1. 从一场蛋白折叠竞赛说起这套方案要解决什么2018 年那场蛋白折叠预测竞赛里一个首次参赛的团队在无信息类别拿下了 43 项测试中的 25 项第二名只赢了 3 项两年后同一团队几乎清场竞赛联合创始人直接说“某种意义上问题已经解决了”。这件事对做化学信息学的人冲击很大——它说明只要结构表征和训练数据到位机器学习能在化学这种高度依赖经验的领域里做出可复现的预测。这份《Machine Learning in Chemistry now and in the future》方案要解决的就是把“化学问题怎么翻译成机器学习问题”讲清楚从化学空间的规模、性质预测的建模范式到多目标分子设计的落地流程。适合正在做化学信息学毕设、材料/药物方向课设或者要给实验室搭一套性质预测流水线的读者。2. 需求与技术选型为什么化学问题适合交给机器学习化学科学的核心命题是“结构决定性质与功能”这句话本身就是一句机器学习里的映射关系描述输入是分子结构输出是活性、毒性、稳定性、催化效率这些可测属性。传统路径要么做实验天、周级别要么做量子化学计算小时级别而训练好的模型推理只要秒级。方案的第一层需求就是把这条“实验—模拟—模型”的时间链条压下来让候选空间的粗筛从实验台前移到模型端。2.1 化学空间的规模决定了必须用模型做粗筛小分子有机物的可能空间量级在 10^60 上下任何穷举式实验筛选在这个数字面前都没有意义。真正被合成和测试过的分子只是其中极小一部分剩下的全是“潜在候选”。这就带来一个很现实的需求我们需要一个能在秒级给出属性估计的函数把 10^60 的空间先压到几百上千个值得做实验的候选再交给湿实验验证。机器学习在这里承担的角色不是替代化学家而是把“值得试的分子”从海量空间里捞出来。方案里所有模块的设计最终都服务于这个粗筛目标——模型精度不必追求 DFT 级别但排序能力把好分子排在前面必须可靠。2.2 三类建模范式与它们的适用边界从化学问题的输入形态出发方案里通常把模型分成三条线选型时按“有没有结构、结构多复杂”来定范式输入表征典型任务适用边界描述符 传统回归分子指纹、理化描述符溶解度、logP、毒性分类数据量千级以内可解释性要求高图神经网络原子-键图活性预测、反应产率数据万级以上结构信息关键序列模型TransformerSMILES 字符串逆合成、反应预测大规模反应数据集需要生成能力选型上我一般的做法是先上描述符 梯度提升树做基线拿到一个可解释的精度下限如果基线误差满足不了粗筛要求再换图卷积。直接上图网络在几千条数据上翻车是血泪经验——参数还没训开验证集就开始抖。方案里把基线模型作为强制第一步就是为了给后续复杂模型提供一个“不能比这更差”的参照。2.3 数据与算力的现实约束化学数据的特点是“贵且脏”一条活性数据背后是一次合成加一次测试标注成本远高于图像文本不同来源的实验条件不一致同一分子的活性值可能差一个数量级。方案里必须包含数据清洗环节——去重、单位统一、活性值取对数、按骨架做训练/验证集切分随机切分会造成数据泄漏这是最常见的翻车点。算力侧图网络在单卡上训练万级分子数据集通常几小时能收敛不需要集群这也是方案能落到课程设计规模的前提。3. 总体架构设计从分子表征到多目标输出的四层结构整套方案按数据流拆成四层表征层负责把分子变成模型能吃的张量模型层负责属性预测优化层负责在多目标约束下搜索候选评估层负责判断“这套东西到底能不能用”。四层之间用统一的数据契约衔接——表征层输出固定维度的特征或图对象模型层输出标准化后的属性预测值优化层消费预测值做排序和筛选评估层回算真实指标。这样拆的好处是每一层可以独立替换换表征不影响优化逻辑换模型不影响评估口径。3.1 表征层SMILES 规范化与图构建表征层的第一件事不是特征工程而是把 SMILES 洗干净。同一分子有多种写法不规范化会导致训练集和测试集里出现“同一个分子两种字符串”的泄漏。下面这段是方案里常用的规范化与图构建骨架from rdkit import Chem import torch from torch_geometric.data import Data def canonicalize(smiles: str) - str: 统一 SMILES 写法过滤无效分子 mol Chem.MolFromSmiles(smiles) if mol is None: return None # 无效结构直接丢弃不要静默补全 return Chem.MolToSmiles(mol, canonicalTrue) def mol_to_graph(smiles: str) - Data: 把分子转成原子-键图节点是原子边是化学键 mol Chem.MolFromSmiles(smiles) atom_feats, edge_index, edge_feats [], [], [] for atom in mol.GetAtoms(): # 原子类型、度、形式电荷、是否在环上四个基础特征 atom_feats.append([ atom.GetAtomicNum(), atom.GetDegree(), atom.GetFormalCharge(), int(atom.IsInRing()), ]) for bond in mol.GetBonds(): i, j bond.GetBeginAtomIdx(), bond.GetEndAtomIdx() edge_index [[i, j], [j, i]] # 无向图双向建边 bond_type bond.GetBondTypeAsDouble() edge_feats [[bond_type], [bond_type]] return Data( xtorch.tensor(atom_feats, dtypetorch.float), edge_indextorch.tensor(edge_index, dtypetorch.long).t().contiguous(), edge_attrtorch.tensor(edge_feats, dtypetorch.float), )这段代码的关键点在两个地方canonicalTrue保证同一分子只有一种字符串表示这是防泄漏的第一道闸edge_index双向建边是因为化学键没有方向图网络聚合邻居信息时必须两个方向都能走。原子特征只取了四个基础维度实际项目里可以加手性、杂化类型但特征维度不是越多越好——维度上去之后小数据集上过拟合会很明显我一般先跑四维基线看残差分布再决定加不加。3.2 模型层基线模型与图网络的职责划分模型层采用“双轨”设计梯度提升树吃描述符图卷积吃图结构两条线的预测结果在评估层做对比取满足精度要求且推理更快的那个进生产。基线模型的输入用 RDKit 算的分子描述符几百维训练几分钟出结果图网络用三层 GCN 加全局池化输出标量属性值。职责划分的原则是基线负责“快速给出可信下限”图网络负责“在数据量足够时突破下限”。方案里不预设哪个一定更好而是用验证集上的排序指标Spearman 相关系数来裁决因为粗筛场景关心的是排序而不是绝对误差。3.3 优化层多目标设计的约束求解思路多目标设计是这份方案里最像“工程”的部分。药物分子要同时满足活性高、毒性低、合成可行、代谢稳定这几个目标经常互相打架——活性上去毒性也跟着上去。方案里的处理方式不是训练一个多任务大模型而是把各属性模型输出的预测值组成目标向量用帕累托前沿筛选先按约束条件比如毒性低于阈值过滤再在剩余候选里找不被任何其他候选全面支配的解集。这样做的原因是单目标加权求和需要人为定权重权重一变结果全变而帕累托前沿把“权衡关系”显式暴露给化学家由人来拍板选哪个点。实现上可以用简单的非支配排序候选规模几千时计算量完全可接受。3.4 评估层排序指标优先于绝对误差评估层的口径直接决定方案能不能验收。回归任务习惯看 RMSE但粗筛场景里模型把好分子排到第 500 位还是第 50 位比它把某个分子的活性预测差 0.3 个对数单位重要得多。所以方案里主指标用 Spearman 秩相关和 Top-K 召回率预测前 K 个里有多少真的落在实验验证的活性区间RMSE 作为辅助指标看模型有没有系统性偏差。评估层还要固定一份“外部测试集”——按分子骨架切分、与训练集无重叠的那部分所有模型版本都在这份集合上报数避免每次换切分方式导致指标不可比。4. 关键模块实现性质预测流水线与多目标筛选这一章落到能直接跑起来的实现。整条流水线分三段数据准备、模型训练与验证、候选生成与筛选。每段都有明确的输入输出段与段之间用文件或 DataFrame 交接方便单独调试——流水线最怕的就是一段出错全链重跑分段之后哪段出问题一眼能看出来。4.1 数据准备切分策略与特征缓存数据准备阶段最容易埋雷的是切分。随机切分会让结构相似的分子同时出现在训练和验证集里验证指标虚高上线后直接打回原形。方案里用骨架切分Murcko scaffold split保证验证集里的骨架在训练集里没见过这样报出来的指标才接近真实外推场景。特征计算是耗时大头描述符算一遍缓存成 parquet图对象序列化存盘后续调模型参数时直接读缓存不用每次重算。import pandas as pd from rdkit.Chem.Scaffolds import MurckoScaffold from sklearn.model_selection import GroupKFold def scaffold_split(df: pd.DataFrame, smiles_col: str, n_splits: int 5): 按 Murcko 骨架分组切分防止结构泄漏 def get_scaffold(smi): mol Chem.MolFromSmiles(smi) if mol is None: return invalid return MurckoScaffold.MurckoScaffoldSmiles(molmol) df df.copy() df[scaffold] df[smiles_col].map(get_scaffold) # 以骨架为组做 K 折同一骨架的分子只会落在同一折 gkf GroupKFold(n_splitsn_splits) folds list(gkf.split(df, groupsdf[scaffold])) return df, foldsGroupKFold的groups参数传骨架列这是整个切分逻辑的核心同一骨架的分子被强制绑在一起不会跨折出现。n_splits5是常规选择数据量小于两千条时降到 3 折否则每折训练集太小、指标波动大。切分完要检查一下各折的正负样本比例分类任务里如果某折正样本占比偏离整体太多说明骨架分布不均需要换分层策略。4.2 模型训练早停、学习率与过拟合监控图网络的训练循环里早停和验证监控是必须的。化学数据集普遍偏小模型在训练集上 loss 一路降、验证集上先降后升是常态没有早停就是在训练一个记忆器。方案里的训练配置学习率 1e-3 配余弦退火验证指标连续 20 轮不提升就停保留验证指标最好的那轮权重。import torch.nn.functional as F from torch.optim import Adam from torch.optim.lr_scheduler import CosineAnnealingLR def train_epoch(model, loader, optimizer): model.train() total_loss 0.0 for batch in loader: optimizer.zero_grad() pred model(batch.x, batch.edge_index, batch.edge_attr, batch.batch) # 回归任务用 HuberLoss对活性值里的离群点更稳 loss F.huber_loss(pred.squeeze(), batch.y.squeeze(), delta1.0) loss.backward() optimizer.step() total_loss loss.item() * batch.num_graphs return total_loss / len(loader.dataset) # 训练主循环骨架 optimizer Adam(model.parameters(), lr1e-3, weight_decay1e-5) scheduler CosineAnnealingLR(optimizer, T_max100) best_score, patience_counter -1e9, 0 for epoch in range(200): train_loss train_epoch(model, train_loader, optimizer) val_score evaluate_spearman(model, val_loader) # 验证集看排序指标 scheduler.step() if val_score best_score: best_score, patience_counter val_score, 0 torch.save(model.state_dict(), best_model.pt) else: patience_counter 1 if patience_counter 20: break # 连续 20 轮无提升停止训练损失函数选 Huber 而不是 MSE是因为化学活性值里常有极端离群点测试误差或特殊结构导致MSE 会被这些点带偏Huber 在误差超过delta后转为线性梯度更稳。weight_decay1e-5是轻量正则小数据集上可以加到 1e-4但加太大会让模型欠拟合、验证指标上不去。早停的 patience 设 20 轮配合余弦退火的学习率曲线基本能覆盖大部分收敛过程。4.3 多目标筛选帕累托前沿的工程实现候选生成阶段先用训练好的模型对虚拟库批量打分得到每个候选的多属性预测向量再做非支配排序。实现上不需要引入复杂库一个 O(N²) 的朴素比较在几千候选规模下完全够用def pareto_front(candidates, objectives, maximizeNone): candidates: [(id, [obj1, obj2, ...]), ...] objectives: 目标名列表maximize: 每个目标是否越大越好 maximize maximize or [True] * len(objectives) front [] for cid, vals in candidates: dominated False for oid, ovals in candidates: if oid cid: continue # 判断 ovals 是否全面不劣于 vals 且至少一项严格更优 better_or_equal all( (ov v) if m else (ov v) for ov, v, m in zip(ovals, vals, maximize) ) strictly_better any( (ov v) if m else (ov v) for ov, v, m in zip(ovals, vals, maximize) ) if better_or_equal and strictly_better: dominated True break if not dominated: front.append((cid, vals)) return frontmaximize列表按目标方向配置活性、稳定性越大越好填True毒性、合成难度越小越好填False。返回的front就是不被任何候选全面压制的解集化学家在这个集合里按项目阶段挑点——早期偏活性后期偏安全性。候选规模上万时这个朴素实现会慢可以换成按第一目标排序后逐层剥离的算法但课程设计规模下没必要提前优化。5. 避坑与常见问题化学机器学习项目里最容易翻车的五件事5.1 验证指标漂亮上线一塌糊涂现象是交叉验证 Spearman 到 0.8换一批新分子预测相关性掉到 0.3。原因几乎都是数据泄漏随机切分让相似结构跨集或者特征计算时用了全量数据的统计量比如用全体均值做标准化。解决办法是骨架切分加流水线内标准化——标准化参数只在训练折上拟合验证折只做 transform。这个坑我踩过不止一次现在切分完第一件事就是查训练集和验证集的骨架重合率不为零就重切。5.2 无效 SMILES 静默通过现象是训练中途报张量维度错误或者某些分子特征全零。原因是MolFromSmiles对无效字符串返回None后续代码没判空直接往下走。解决办法是在表征层入口统一过滤返回None的样本记日志后丢弃并在数据准备阶段统计丢弃比例——比例超过 5% 说明数据源本身有问题要回头查原始文件编码或分隔符。5.3 活性值单位不统一现象是同一靶点的活性数据分布出现双峰模型怎么调都拟合不好。原因是不同来源的数据一半用 nM 一半用 μM数值差三个数量级。解决办法是建数据字典每个数据源标注单位入库时统一换算成对数尺度pIC50 之类换算后再做分布检查。单位问题在化学数据里极其常见方案里把单位字段作为必填项缺了就拒绝入库。5.4 图网络在小数据集上过拟合现象是训练 loss 降到接近零验证指标在第十轮左右见顶后持续下滑。原因是参数量远超数据量能支撑的规模。解决办法是砍层数三层降到两层、加 dropout、减小隐藏维度同时把基线模型拉出来对比——如果基线指标和图网络差不多直接用基线别为了用新技术而用。模型复杂度要跟数据量匹配这条在化学领域比在其他领域更严格。5.5 帕累托前沿全是极端解现象是筛选出来的候选要么活性极高毒性也极高要么两头都平庸没有中间可用的点。原因是各属性模型的预测尺度不一致某个目标的方差大支配关系被它主导。解决办法是先对各目标预测值做标准化z-score再算帕累托前沿让每个目标在支配判断里的贡献可比。另外可以在前沿之外加一层“实用区间”过滤把明显不可合成的结构先剔掉减少无效候选。6. 验收与答辩怎么证明这套方案真的能用验收这件事核心不是报一个漂亮的指标而是证明模型在“没见过的新结构”上仍然保持排序能力。我一般会准备三份材料第一份是骨架切分下的五折指标表每折单独报 Spearman 和 Top-10% 召回看折间方差——方差大说明模型对数据分布敏感答辩时被问到要能解释第二份是一组外部验证案例从公开数据里挑一批与训练集骨架无重叠的分子展示预测值对真实值的散点图和排序一致性第三份是失败案例分析挑几个预测偏差最大的分子从结构角度解释为什么错比如含有训练集里罕见的官能团这份材料最能体现你对问题的理解深度。答辩陈述的节奏建议按“问题—方案—证据—边界”四段走。问题段用化学空间规模和时间成本切入三十秒讲清为什么需要模型方案段讲四层架构和选型理由重点说清为什么先基线后图网络证据段放指标表和案例图指标只讲排序相关的RMSE 一句带过边界段主动说明模型不适用的情况——比如全新骨架、训练数据覆盖不到的靶点主动划边界比被问出来强得多。评委常问的两个问题提前准备好答案一是“你的模型和 DFT 比优势在哪”答推理速度和粗筛定位不硬碰精度二是“多目标权重怎么定”答用帕累托前沿把权衡显式化由人决策而不是模型拍板。验收标准可以落成一张检查表交付前逐项过检查项通过标准数据切分训练/验证骨架重合率为 0基线模型验证集 Spearman 有明确数值作为下限主模型相对基线有提升或明确说明为何不换外部验证独立骨架集上排序指标不低于交叉验证的 80%多目标筛选前沿解覆盖至少两个目标区间无全极端解可复现性固定随机种子重跑指标波动在 ±0.03 内最后一条是我现在每个项目都强制走的习惯交付前用固定种子把整条流水线从头跑一遍指标对不上就查环境依赖和随机性来源。从那以后我每次交方案前都强制走一遍这个复现检查翻车次数少了很多。希望这套结构能帮到你照着改改就能变成你自己的毕设或课设方案。本文还有配套的精品资源点击获取
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。