
做药物研发的朋友这两年被AIDD这个词刷屏的概率应该非常高。AIDD的全称是AI-driven Drug Discovery翻译过来就是“AI驱动的药物发现与设计”。这几年小分子药物的研发模式正在悄悄发生改变以前更多靠经验和大量实验来试错现在很多人会先让机器学习模型在千万级分子库里面筛一遍用深度学习预测活性、代谢、毒性把所有候选分子排序后再进实验室。这种流程一旦跑通确实能省下很多时间和经费。这篇文章把AIDD领域里机器学习和深度学习在药物发现与设计中的核心内容做一次系统性梳理包括分子表示、建模算法、应用场景、工具链和常见雷区都以我实际接触过的项目为背景尽量不写空话。适合正在入门科研计算、想了解AI药物设计全貌、或准备把机器学习用在药物相关课题的读者。1. AIDD整体认知与学习路线规划1.1 AIDD到底是什么从CADD到AIDD的演进药物设计这个方向其实很早就有计算手段了以前叫CADD也就是Computer-Aided Drug Design。早期的工作主要集中在分子对接、药效团模型、分子动力学模拟这些偏机理和结构的方法上。分子对接负责回答“配体能不能放进靶点蛋白的口袋里”分子动力学模拟负责回答“这个复合物在动态环境下稳定不稳定”。这些方法到现在仍然是药物设计的重要工具但它们的局限也很明显一是对每个分子做构象采样和打分非常耗时二是打分函数的精度有限很多时候只能做粗筛。AIDD和CADD最大的区别在于它把“经验规则”和“物理模型”换成了“从数据里学出来的规律”。机器学习擅长从大量已知活性和非活性分子里提取模式深度学习还能通过多层网络自动学习分子中复杂的结构特征。换句话说CADD像是拿着一本操作手册去修机器AIDD则是给了一个系统通过大量维修记录自己总结出故障规律。后者一旦训练好推理速度极快一个训练好的模型可以在几秒内扫描上百万个分子这在实际虚拟筛选场景里太重要了。需要强调一点AIDD不是一个独立的单点技术而是一套方法链。从靶点确认、虚拟筛选、先导化合物发现、ADMET预测到化合物合成路线规划每一个环节都有对应的模型和工具。所以学AIDD首先要建立全流程视角不能只盯着某一个模型。1.2 学习路线零基础到实践要过的四道关卡我经常被问做AIDD需要什么基础我的回答是不需要你是药化博士也不需要你是算法天才但以下四道关卡基本绕不开。第一关是分子学和生物化学基础。至少要知道什么叫小分子、什么叫靶点蛋白、什么叫抑制剂、什么叫IC50。不用精通但得有基本概念否则连数据里的pIC50值是什么意思、活性单位nM代表什么都不知道。如果你完全没接触过建议先找一本药物化学导论类的教材翻前四章。第二关是Python编程。AIDD主流的工具链几乎都是Python生态包括RDKit、DeepChem、PyTorch Geometric等。网上经常有人问“深度学习需要什么编程语言”在AIDD领域答案基本是唯一的Python。建议至少达到能独立写数据处理脚本、能看懂模型训练代码的水平。第三关是机器学习和深度学习基础。如果完全零基础我推荐先看吴恩达的机器学习课程把线性回归、逻辑回归、决策树、SVM、神经网络这些基本概念过一遍。然后再看李宏毅的深度学习课程尤其关注CNN、RNN、Transformer、自注意力机制这几块。这两门课资源都很容易找到配套作业也完全可以自己在本地跑。第四关才是AIDD专业知识和工具。比如学习SMILES语法、分子指纹原理、RDKit操作、分子对接工具、QSAR建模流程等。到这一阶段建议以项目带动学习不要只做知识点的搬运工。学习阶段核心内容推荐资源周期建议基础理论药物化学、靶点、构效关系教材 综述文章2-3周编程能力Python、Pandas、Numpy廖雪峰教程 / 官方文档3-4周AI基础经典ML、深度学习基础吴恩达、李宏毅课程6-8周AIDD实战分子表示、QSAR、虚拟筛选、分子生成本文 DeepChem文档 论文复现长期我个人的建议是前两关可以快速过第三关不要跳。很多后期莫名其妙报错、模型不收敛、结果解释不清楚的问题根源都在AI基础不牢。基础关该背的概念一定要背该手推的公式至少要推一遍梯度下降。2. 分子表示与数据工程AIDD的地基2.1 分子怎么变成机器能读的“语言”药物设计里第一个核心问题就是分子是三维的化学结构但机器学习模型需要数值输入。怎么把分子结构变成向量、序列或图这就是分子表示问题。方向选对了模型事半功倍方向选错了后续所有工作都会变形。最常见的几种表示形式包括SMILES字符串、分子指纹、分子图和分子描述符。SMILES是一种用ASCII字符串描述分子结构的语法比如苯环可以写成c1ccccc1。它本质上把二维化学结构编码成了序列。因为序列模型发展很成熟早期很多深度学习药物设计工作直接用SMILES作为输入把分子生成当作语言建模问题来解。但你也要知道SMILES有严重的“语法歧义”问题一个分子可能对应多个合法的SMILES字符串比如原子顺序改变、环的断开位置不同都能生成不同但等价的字符串。这个问题在数据清理和标准化时一定要处理否则同一个分子会被当成两个不同样本。分子指纹是另一种常用表示它把分子结构编码成固定长度的二进制向量。最常用的是Morgan指纹也就是ECFPExtended Connectivity FingerprintRDKit里一行代码就能计算。原理是把每个原子周围特定半径范围内环境哈希成整数然后映射到固定长度的位向量上。指纹的好处是固定维度、计算快、适合输入传统机器学习模型缺点是会丢失部分三维信息和局部结构关系适用于分子相似性比较和QSAR建模但不适合做分子生成。分子图表示则把原子作为节点、化学键作为边完整保留了分子的拓扑结构。这是图神经网络GNN的标准输入格式。相比指纹分子图能更好地捕捉长程依赖关系比如某个原子和它不相邻但通过路径相连的原子之间的影响。我个人的经验是做性质预测任务GNN在多数情况下的表现会优于基于指纹的传统模型但需要更多的数据和更长的训练时间。至于分子描述符比如RDKit计算出的脂水分配系数LogP、分子量、氢键供体/受体数、可旋转键数等属于最经典的表征方式。它们可解释性最强适合做规则筛选和传统统计建模但信息量有限很难单独支撑高精度预测任务。2.2 数据获取与清洗公共数据库与构建高质量数据集算法再强数据是地。AIDD可用数据公开程度很高很多经典数据集都可以免费获得这是这个领域一个非常大的优势。常用的公共数据库包括ChEMBL包含大量生物活性数据有化合物结构、靶点信息、IC50/Ki/EC50等活性数值是QSAR建模最主要的来源。PubChem更多偏化合物基础信息和生物测定记录覆盖面广但与靶点结合活性数据相对分散。BindingDB专门收集蛋白质-配体结合亲和力数据适合做对接打分和亲和力预测。ZINC数据库包含海量可购买的类药分子库常用于虚拟筛选候选分子来源。数据拿回来之后清洗才是真正耗时又关键的一步。我强烈建议在动手建模前把数据清洗和标准化做成一套固定流程包括以下几项操作。去盐和保持单一组分。很多数据库条目带有盐离子或阴阳离子需要用RDKit去掉盐基只保留主要有机组分。去重复。同一分子可能出现在多个记录中需要按国际化合物标识符InChIKey去重同时处理SMILES标准化确保等价分子归一。活性值的标准化与单位转换。不同文献使用的单位不一样nM、uM、pIC50之间需要互相换算且顶点数据集中只有半数抑制浓度IC50值还不够建议统一转换成pIC50即-log10(IC50)这样数值上更接近正态分布模型更容易学习。去异常值。活性测量本身有误差同一分子在不同实验室可能差出一个数量级。对于同一个分子有多个活性值的记录我一般取几何平均数或中位数遇到相差超过两个数量级的直接把该分子剔除。这方面踩过一次大坑刚开始我建QSAR模型时没有去盐导致同一个母核结构因为带有不同盐形式被生成了不同的SMILES指纹数据集里出现大量“看似不同实则相同”的重复分子。模型交叉验证指标看起来很好但一到外部验证集上性能断崖式下跌。后来把数据标准化以后模型才恢复稳定。3. 经典机器学习在药物发现中的应用3.1 QSAR建模从描述符到活性预测QSAR的全称是Quantitative Structure-Activity Relationship定量构效关系。它的基本假设是化合物结构和生物活性之间存在定量关联结构相似的分子往往具有相似的活性。这也是老牌方法了但现在依然活跃在AIDD的一线尤其适用于中小规模数据集的活性预测。QSAR建模的典型流程是收集一批化合物的结构和对应靶点的活性数据把结构编码为分子指纹或描述符然后训练一个回归模型预测pIC50值或者训练一个分类模型区分活性分子和非活性分子。实际建模中我通常把分子指纹和传统机器学习算法组合作为基线模型。随机森林和XGBoost是我个人用得最多、也最推荐优先尝试的两个模型。它们在中小规模数据上表现稳定训练速度快对数据标准化和特征尺度不敏感还有一定特征重要性解释能力。SVM也很经典尤其在小样本高维特征的场景下表现不错但对超参数比较敏感需要花时间调优。模型适用场景优势劣势随机森林中规模QSAR、ADMET稳定、可解释、抗过拟合外推能力差XGBoost中大规模、表格特征精度高、支持自定义损失过拟合需正则SVM小样本高维指纹核技巧处理非线性大样本训练慢逻辑回归简单的活性/毒性二分类简单、可解释表达能力有限我注意到很多人入门时喜欢直接上深度学习但我建议先从这些经典模型跑起。原因很简单只有建立了和使用基准你才能判断自己辛辛苦苦搭的GNN到底是真有效还是在靠吃更多参数硬撑。如果XGBoost加Morgan指纹已经能跑到不错的AUC深度学习模型至少要显著超过这个基线才值得投入。3.2 药物筛选中的分类与回归随机森林、XGBoost、SVM在真实的药物筛选场景里分类任务和回归任务往往交织出现。分类任务是判断一个分子“有没有可能是活性分子”比如在100万个分子里筛出前1万个候选。回归任务是预测具体的活性值或性质指标比如预测一个化合物的溶解度LogS、渗透性、清除率等。做分类时要特别注意正负样本的定义。活性阈值怎么定有的论文把pIC50大于6定为活性有的定到7有的用倍数阈值如IC50 100 nM。这个阈值直接影响正负样本的比例、模型学习难度和最终评估结果。我的经验是阈值的选择要结合具体靶点和项目目标不要盲目照搬文献同时务必在论文里写清楚让别人能复现。回归任务的核心指标通常看RMSE和R方。这里有一个经验回归模型预测分子活性时RMSE在0.5到0.7个对数单位以内已经属于可用水平如果目标定在0.3以内大概率是数据泄漏或者用了过于简单的数据集。业界对活性的预测误差有一个常识湿实验结果本身就有0.3到0.5个对数单位的误差波动纯计算模型很难突破这个物理极限。3.3 ADMET预测机器学习最实用的落地场景ADMET是Absorption吸收、Distribution分布、Metabolism代谢、Excretion排泄、Toxicity毒性的缩写。以前药物研发里流传一句话叫“失败的化合物更多是死于ADMET而非活性不足”。很多化合物活性很好但毒性大、溶解差、代谢太快最终仍然进不了临床。如果在研发早期就能用模型提前把这些风险筛掉能节省大量时间和经费。ADMET预测之所以是机器学习的理想场景是因为该类任务数据相对充裕、标签定义比较清晰且多为分类问题比如是否有肝毒性、是否透过血脑屏障、是否抑制hERG钾通道。其中hERG抑制预测是业界非常重视的一个方向因为hERG抑制会导致心脏毒性很多候选药物因此在临床阶段失败。建模上ADMET任务和QSAR套路差不多但有一些特殊性。首先数据正负样本极度不平衡比如某毒性数据集中阳性分子可能只有5%到10%这时候简单的准确率指标没有意义要看AUC-ROC、AUC-PR、F1和混淆矩阵。其次处理不平衡时我会综合使用欠采样、过采样SMOTE和类别加权损失函数具体用哪种要先做交叉验证对比。我在实操中遇到过这样一个项目构建肝毒性预测模型正样本比例只有8%直接训练一个XGBoost看起来AUC有0.75但看混淆矩阵才发现所有的阳性样本几乎全被预测成阴性。后来我改用类别加权并调节阈值把模型在验证集上的召回率拉到了0.7以上模型才真正有了实用价值。4. 深度学习模型解析与选型4.1 DNN与MLP最朴素的深度学习基线深度学习在药物设计中的应用也不是只有GNN和Transformer这些听起来高大上的模型。多层感知机MLP加分子指纹的组合很多时候依然是最划算的起点方案。把ECFP指纹或RDKit描述的向量直接输入一个两到三层的全连接网络做活性预测或者性质预测训练成本极低推理速度快非常适合跑批量筛选。我之前做过一个比较实验在同一份logP预测数据上MLP加分子描述符的模型表现可以追平甚至超过很多复杂的图模型。原因很朴素logP主要由分子的疏水基团决定而描述符已经把相关特征提取好了。所以不要小看简单模型关键看任务和数据特征匹配不匹配。深度学习模型的价值更多体现在处理复杂高维特征上比如直接从SMILES或者分子图端到端学习。跟传统指纹相比深度学习网络自动学习到的特征往往更贴合目标任务。但这也带来一个问题可解释性差。很多时候你不知道模型到底学的是什么只能用SHAP、Grad-CAM之类的工具去做事后解释。4.2 CNN与分子图像把分子画成图再用视觉模型解读CNN在AIDD中的应用出现得也挺早。它的思路很有趣用RDKit把分子画成二维平面结构图然后把这个图像输入到为图像识别设计的卷积神经网络里做分类或回归。分子每画出一种二维图形CNN通过卷积核就能自动学习到一些原子连接模式。采用这种方法优点是可以直接复用图像识别领域的成熟网络结构比如ResNet、Inception。缺点其实也很明显分子二维图形的画法并不唯一旋转、缩放、原子标签位置都可能影响图像内容而且分子的二维结构图丢了大量三维空间信息。我本人的看法是分子图像方法现在更多是作为对比实验出现真实应用里直接用SMILES或者分子图往往性能更好、更稳健。不过CNN并没有离开AIDD。有一些变体思路很有意思比如用CNN处理分子的三维格点表示把分子放在三维网格上用三维卷积核来学习空间结构。这类方法在结合位点预测、蛋白-配体相互作用预测中还有不少工作在做。4.3 RNN与分子生成用语言模型合成新分子药物设计里有个很吸引人的方向用算法直接生成全新的分子结构。这个方向被称作分子生成或者分子反设计在很多AIDD综述里是重头戏。RNN类模型最早承担了这个任务。思路是把SMILES字符串当作一种“化学语言”用训练集里的分子SMILES去训练一个语言模型RNN根据前一个字符预测下一个字符这样就能一路采样生成新的字符串。如果采样得到的字符串能够被RDKit解析成合法分子那它就是候选化合物。这种生成方式本质上是学一个分子的概率分布。实际操作中RNN生成会碰到两个高频问题。第一是非法序列比例高RNN生成的字符串经常语法错误不能被解析为有效分子解决方法是引入语法约束解码或者用蒙特卡洛树搜索引导生成。第二是仅凭RNN学到的分布不会自动满足活性、类药性需求生成出的分子很多是合理但不“有用”的需要结合强化学习或者目标函数进行定向优化。顺便插一句SMILES字符串本身存在同一分子多表示的问题这会加大生成模型的负担。后来有人提出用SELFIES这种鲁棒性更好的化学字符串表示它天然保证字符串一定能解析为合法分子这样生成模型可以把精力集中在属性优化上我建议做分子生成的朋友关注一下SELFIES。4.4 GNN与分子图图神经网络是当下的主角如果说2017到2020年是RNN在分子生成里唱主角那么2020年之后图神经网络就是当之无愧的主角。分子天然是图结构原子是节点、化学键是边。GNN通过消息传递机制让每个原子逐步“看见”它周围的环境积累更高阶的结构信息最终汇总成对整个分子的表征。常见的GNN模型包括GCN、GAT、GraphSAGE以及更复杂的MPNN框架。在分子性质预测上GNN类模型在多个公开基准中已经显著优于基于指纹的传统模型尤其当训练数据规模在万级以上时这种优势更加明显。做分子性质预测选用GNN作为主力模型是一个稳妥的选择。要重点提醒的是GNN不是万能的。第一它比指纹慢很多虚拟筛选大规模场景要考虑计算效率。第二数据量小的时候GNN容易过拟合。我见过有人用几百个分子的数据去硬训GNN结果验证集上AUC乱跳模型完全不收敛。这种数据规模老老实实跑随机森林加指纹才是出路。第三训练稳定性问题GNN需要设置合理的早停策略和模型保存逻辑不是简单跑够epoch就完事。4.5 Transformer与预训练模型ChEMBERTa们的崛起Transformer架构引领了整个深度学习的范式转换AIDD也不可避免地卷入了这场浪潮。一个代表性思路是用大规模未标注的分子SMILES做自监督预训练比如用BERT的掩码语言建模目标去学习化学语言的上下文表征然后在下游任务上微调。ChemBERTa就是比较典型的代表。这个思路在自然语言处理领域已经很成熟了在化学领域的迁移也很自然。很多研究证明预训练后的Transformer模型在分子性质预测、反应预测、分子生成等任务上都能达到不错的效果。它的优势在于能捕捉全局分子结构信息、上下文依赖关系对序列中的长程依赖非常敏感而这些恰恰是RNN的短板。不过有一点要注意预训练模型参数量大、推理速度慢、显存消耗高如果你只是想快速跑通一个QSAR模型用Transformer纯粹是杀鸡用牛刀。我现在的习惯是先看数据规模再决定模型选型。数据量少于一万条优先考虑指纹加传统机器学习数据量在十万级以上再考虑上GNN或Transformer。5. 核心应用场景实战与工具链5.1 虚拟筛选实战流程一天处理十万候选分子虚拟筛选是AIDD里最直接的应用场景。基本思路是用已有的模型或者对接工具在庞大分子库中筛选出可能对靶点有活性的分子然后交给湿实验团队验证。一套相对完整的虚拟筛选流程通常包含以下步骤。第一步是数据预处理。把候选分子库可能是几万、几十万甚至百万的SMILES统一做去盐、去重、去电荷中性化用RDKit计算基本性质用类药性规则如Lipinski五规则做粗筛剔除明显不符合成药性的分子。第二步是快速预测模型筛选。如果有一个训练好的活性预测模型或者ADMET预测模型可以先跑一遍推理剔除模型预测不活跃或者有毒性的分子。这一步通常很快是真正的粗筛。第三步是分子对接。对剩余的分子做对接打分评估分子与靶点蛋白的结合模式和结合亲和力。常用工具包括AutoDock Vina、Glide、GNINA等。AutoDock Vina是开源且使用最广泛的也是我喜欢推荐给新手的选择。一个典型的Vina对接命令如下vina --receptor receptor.pdbqt --ligand ligand.pdbqt --center_x 10 --center_y 20 --center_z 30 --size_x 20 --size_y 20 --size_z 20 --exhaustiveness 16 --num_modes 9对接前还需要用Open Babel或AutoDock Tools把配体和蛋白文件转成pdbqt格式并确定活性口袋的中心坐标和口袋大小。新手最容易踩坑的地方是坐标设错口袋中心偏了哪怕5埃对接结果基本就没有参考价值了。第四步是打分排序。把对接分数、模型预测分数、类药性分数加权汇总根据自己的项目目标做综合排序最后人工挑出几十到几百个分子送实验验证。如果没有对接步骤用多个模型做集成投票再加一些结构多样性分析也足够支撑大部分场景。5.2 分子生成与优化从随机生成走向定向优化分子生成做完之后还有一个更重要的环节是分子优化。生成模型可以产出一大堆新分子但绝大多数并不满足项目要求你需要一个优化步骤让候选分子在保持骨架合理的前提下逐步提高目标属性比如提高对特定靶点的预测活性、降低毒性预测分数、改善溶解度。目前主流的方法是强化学习和遗传算法结合ADMET预测模型做一个多目标优化循环。简单来说生成模型在生成分子后立即用预测模型评估这些分子的目标属性属性好的分子会被用于更新生成模型或者保留到下一轮种群中。这样循环几百到几千轮生成的分子会逐渐靠近你想要的属性空间。我建议做分子优化项目的朋友先建立一套“生成-打分-筛选”的基础循环再逐步引入多目标策略。如果一开始就追求复杂算法很容易陷入代码调试的泥潭连分子是否真的变好都看不清。5.3 常用工具链与硬件环境配置运行AIDD项目工具链的搭建是不可跳过的一步。核心工具包括RDKit用于分子的生成、转换、指纹计算和基本性质预测DeepChem是专门为药物化学和分子机器学习设计的库集成了很多数据集和模型PyTorch Geometric或DGL用于实现GNN模型PyTorch本身作为深度学习框架AutoDock Vina用作对接工具。环境配置方面我倾向于直接用conda建一个独立环境把pytorch、rdkit、deepchem这些都装进去避免不同项目之间的依赖冲突。深度学习训练建议用NVIDIA显卡配合CUDA显存至少8GB起步如果你只是做小规模实验云平台或者实验室已有的GPU服务器都够用。深度学习框架选型上PyTorch在这几年事实上已经成了主流不管是DeepChem还是PyTorch Geometric都原生支持PyTorch学习成本和社区支持都是最友好的。6. 常见问题与排查技巧实录6.1 数据泄漏模型评估不准的头号杀手AIDD建模中最大的坑我个人认为不是模型选型而是数据泄漏。数据泄漏指的是训练集信息在评估阶段不小心进入了测试集导致模型的评估指标虚高而这在真实应用场景中必然崩盘。最典型的泄漏来源是数据划分时没有去重。比如ChEMBL数据集中同一个分子可能有多条不同靶点的记录如果不做InChIKey去重同一个分子会同时出现在训练集和测试集中模型“见过”这个分子评价分自然虚高。另一种泄漏是相似分子混在了跨集合划分中。如果一个高活性的分子和它非常相似的类似物一个在训练集、一个在测试集模型也能通过相似性“蒙对”。所以做数据划分时我强烈推荐使用基于分子骨架或基于相似性的分割法比如Butina聚类分割而不是简单的随机划分。还有一个隐蔽的数据泄漏来源特征工程时用了未来信息。比如你在做ADMET预测时用了包含某条测试样本统计量的全局归一化参数这就相当于提前透露了数据分布。正确的做法是先只基于训练集计算归一化参数再应用到验证集和测试集这一点在日常写脚本时最容易忽视。6.2 类别不平衡与活性悬崖两个反复出现的噩梦类别不平衡在毒性预测、肿瘤响应预测这类场景里几乎必然出现。正样本比例往往很低模型很容易学成一个“全都预测为负”的偷懒分类器。解决方法上面也提到过用AUC-PR评估、做类别加权、用SMOTE做少数类过采样。但要记住类别加权是处理不平衡的“标准答案”很多时候不需要额外上采样就能解决大半问题。活性悬崖则是一个更难的问题。两个分子在结构上只差一个甲基或者一个氟原子活性却可以天差地别这种情况在药物化学中非常常见。对这类问题模型即使训练得很好也大概率会给出相似的预测。因为从分子表示的角度看指纹和分子图的微小变化只反映在一两个位点上信息量很小。应对方式是在模型层面加入更多三维结构信息比如构象、电荷分布、分子场特征同时清醒地认识到活性悬崖问题本质上是湿实验的物理现象计算模型只能缓解不能根除。6.3 干湿结合怎么让你的模型真正被实验团队信任跟湿实验团队协作时有个典型矛盾模型预测说这个分子活性高但实验一做没有活性。一次两次还好连续几次失败后实验团队就开始对模型产生信任危机。我的经验是一开始就不要承诺模型“一定准”而要把模型定位成一个“筛子”它帮你从100万分子快速缩小到100个大大提高实验团队的筛选效率哪怕这100个分子里最终只有5个活性价值也已经很大了。此外交付给实验团队的结果建议附带多维信息包括模型预测分数、置信度、与已知活性分子的相似性、ADMET风险提示。这会让实验团队更容易理解模型的预测逻辑和判断可靠性而不是拿一个孤零零的数字去做决定。6.4 训练稳定性与可复现性别让随机性毁掉你的结论深度学习训练的一大痛点是随机性。同一份代码同一份数据跑两次结果可能不同。这不是玄学而是因为随机初始化、数据加载顺序、dropout等机制引入了随机性。很多新手在对比模型时只跑一次就下结论这是非常危险的。特别是当两个模型的性能差只有0.01时这种差异很可能只是随机噪声。我的建议是每个模型至少跑3到5个不同随机种子取平均值和标准差报告结果。固定好全局随机种子包括Python、NumPy、PyTorch、CUDA等各层面的种子确保大部分实验可以被复现。保存模型时不要只保存最后一轮的权重要记录验证集上表现最优的checkpoint。训练时设置早停避免模型过拟合同时保存训练日志方便事后回溯。如果换了显卡或者换了CUDA版本检测结果是否能复现也很有必要。我遇到过同一个模型在两张不同显卡上跑出来的指标相差0.03的情况原因大概率是浮点运算顺序和cuDNN算法的差异。这种问题不好完全消除但提前验证可以避免项目后期被这种细节坑到。最后再分享一个个人体会。AIDD这个方向入门看起来信息量巨大既要有化学素养又要有编程和算法功底很容易让人望而却步。但实际做下来发现核心就是三件事把分子表示好、把数据清洗干净、把模型评估做严谨。三件事都做到位哪怕用的是最简单的算法产出的结果也足够可靠。反过来再炫酷的深度学习模型如果数据一塌糊涂、评估方法不对也只是废铁。我建议想入行的朋友不用贪多求全先拿一个公开数据集把整个流程走通一遍这个“端到端”的经验会比看一百篇教程都管用。