第五部 · 拓展专题专题四 / 共 6 篇

给科研人的机器学习实用课

材料、化学、生物、医学、工程里用得最多的不是大语言模型,是几百个样本上的机器学习。这一篇讲小数据怎么做、分子和材料怎样变成数字、实验很贵时下一个该测什么,以及科研论文里最常见的错误。

主线 14 分钟 · 深入 2 段 · 实验 3 个
两百个样本,一本笔记,一个问题。
两百个样本,一本笔记,一个问题。

一个材料课题组做了三年实验,积累了两百多种合金配方和它们的硬度。他们想知道:能不能用这些数据预测没做过的配方,少做一些实验?

这是校园里最常见的机器学习问题,它和第七到九章的大语言模型几乎没有关系。它用的是第四、五章的东西,只是数据少得多、每个样本贵得多、而且出错的代价是几周的实验白做。第十三章讲了 AI 做科学的宏大图景;这一篇讲桌面上的事:你手里的几百个数据,具体该怎么办。

它假设你读过第四、五章。如果没有,先读它们,再回来。

① 问清问题预测什么、用来决定什么错了代价是什么 ② 表示样本变成数字描述符 / 指纹 / 图 ③ 傻基线均值 / 线性 / 一棵树先知道「多好算好」 ④ 树模型梯度提升 / 随机森林小数据的默认选手 ⑤ 再深数据够了才上网络 贯穿每一步:考试制度 按骨架 / 批次 / 时间划分而不是随机 · 嵌套交叉验证 · 报告分布之外的表现 · 给不确定性 两百个样本时③④ 常常就是终点;一个调好的梯度提升树很难被小网络打败 两万个样本时图神经网络、预训练分子模型开始有优势 实验很贵时问题从「预测」变成「下一个该测哪个」:主动学习与贝叶斯优化 任何时候最常见的错误在划分与泄漏,不在模型
小数据科研项目的配方。最常见的错误在划分与泄漏,不在模型。

一、先问清楚问题

第四章的七步流程第一步是定义任务,在科研里这一步尤其容易跳过。三个问题值得在写第一行代码前回答。

预测出来用来做什么?如果是筛选(从一万个候选里挑一百个去做实验),你需要的是排序能力,前一百个里有多少真的好,比整体误差重要。如果是解释(哪些因素影响硬度),你需要的是可解释的模型,一个准确率高但说不出为什么的黑箱帮不上忙。如果是设计(找到硬度最高的配方),你需要的是第六节讲的优化,而不是预测。

错了的代价是什么?漏掉一个好配方,和把一个差配方送去做实验,哪个更贵?这决定了第五章讲的精确率和召回率该偏向哪边。

数据能代表要预测的东西吗?两百个配方是怎么选出来的?如果全是某一类合金,模型对另一类一无所知。这是第五章的抽样偏差,在科研里的形式是:你的数据反映的是你以前感兴趣的区域。

二、样本怎样变成数字

第四章说样本是一行数字。对订单,这一行是距离和时段;对分子和材料,这一行是什么,是科研机器学习最核心的问题,叫「表示」。

手工描述符分子量、极性、环数元素的电负性均值人定的几十到几百个数可解释 · 小数据好用第四章的特征工程 指纹分子里有哪些子结构→ 几千位的 0/1 向量规则生成,不需训练相似性搜索的标准配树模型很强 图神经网络原子是节点,键是边信息沿着键来回传表示从数据里学出来第六章的表示学习要几千到几万样本 预训练模型在几亿分子 / 蛋白序列上自监督预训练拿来微调或直接取向量第七、九章的做法小数据也能受益 从左到右:越来越少靠人定义,越来越多靠数据;对数据量的要求也越来越高。 物理约束(旋转、平移不变,能量守恒)可以直接写进网络结构,是科研模型和通用模型最大的不同。 实践里常常四种一起试,用同一套考试制度比较。
四种表示:越往右越少靠人定义,对数据量的要求也越高。

手工描述符。人根据领域知识定义的几十到几百个数:分子的分子量、极性、环的数量、氢键供体数;合金的元素电负性均值、原子半径差、混合熵。这是第四章的特征工程,在小数据上至今是最好用的,因为每个数都带着物理意义,模型学出来的规律人能读懂。有现成的库能从分子式或化学式自动算出几百个。

指纹。把分子里出现的子结构编码成一个几千位的 0/1 向量:有苯环的第 137 位是 1,有羧基的第 502 位是 1。不需要训练,由规则生成,是化学信息学里相似性搜索的标准工具,配树模型很强。

图神经网络。把分子表示成图:原子是节点,化学键是边。网络让每个原子从相邻原子那里收集信息,一轮一轮传递(叫「消息传递」),几轮之后每个原子的向量包含了它周围的环境,再汇总成整个分子的向量。这是第六章表示学习在分子上的形式:不再由人定义描述符,而是从数据里学。它需要几千到几万个样本才开始超过树模型加描述符。

预训练模型。第七到九章的做法搬到分子和蛋白质上:在几亿个分子的字符串表示或几亿条蛋白质序列上自监督预训练,得到一个「懂化学」或「懂蛋白质」的模型,然后在你的几百个样本上微调,或者直接把它输出的向量当作描述符用。这让小数据也能受益于大数据,是 2022 年之后科研机器学习最重要的变化之一。

一个科研模型与通用模型最大的不同:物理约束可以直接写进网络。分子旋转一下性质不变,所以网络对旋转应当不变;能量应当守恒,所以网络的输出应当满足某些关系。把这些写进结构,模型用更少的数据学到更对的东西。

用一个具体的例子。乙醇分子有三个重原子:两个碳和一个氧。开始时每个原子有一个向量,只包含它自己的信息(是什么元素、几个氢、什么杂化)。

第一轮消息传递:每个原子把自己的向量发给相邻的原子,同时收到邻居的向量,用一个小网络把「自己」和「邻居们的汇总」合并成新的向量。这一轮之后,甲基碳的向量知道了「我旁边是一个连着氧的碳」。

第二轮:再传一次。现在甲基碳的向量知道了「我隔一个碳有个氧」。轮数决定了每个原子能「看」多远。三到五轮通常够用,因为化学环境的影响随距离衰减。

最后,把所有原子的向量加起来或取平均,得到整个分子的向量,接一个小网络输出性质。整个过程从头到尾用第四章的梯度下降训练,每一轮传递的「小网络」是共享的,所以参数不多。

它的强项是不需要人定义描述符,而且天然处理不同大小的分子;弱项是需要数据,以及它学到的表示人读不懂。晶体材料的做法类似,把周期性边界处理一下即可;蛋白质常常把氨基酸当节点、空间接触当边。

三、小数据的配方

两百个样本,怎么做?

先做傻基线。永远预测平均值,误差是多少?一个线性回归,误差是多少?这两个数字告诉你「多好算好」。很多论文里的模型比傻基线好不了多少,只是没人算过。

默认用树模型。梯度提升树(第四章的深入段落讲过)在表格数据上是小数据的默认选手:对特征的尺度不敏感,能处理缺失,几乎不需要调参就有不错的结果,还能告诉你哪些特征重要。两百个样本上,一个调好的梯度提升树很难被任何神经网络打败。

考试制度要更严。数据少,随机划分的波动就大:换一个随机种子,误差可能差一倍。用第五章讲的交叉验证,并且报告方差而不只是均值。更重要的是划分的方式:如果你的两百个合金里有几十个只是同一配方的微调,随机划分会把「几乎相同」的样本分到训练和测试两边,成绩会假得漂亮。要按「家族」划分:同一骨架的分子、同一批次的实验、同一基体的合金,整组放在同一边。这是科研机器学习论文里最常见的错误,没有之一。

调参要在训练集内部做。用交叉验证选超参数,然后在从未碰过的测试集上报告一次。如果你反复看测试集调模型,第五章说过,你自己就成了过拟合的一部分。数据少时这个错误尤其致命,因为几个样本就能让成绩看起来好很多。

特征不要太多。两百个样本配三百个描述符,模型能「记住」而不是「学会」。先用领域知识删掉明显无关的,再用正则化或特征选择,最后看留下的特征是否说得通。

四、不确定性:科研比准确率更需要它

一个预测「这个配方硬度 620」的模型,和一个预测「620 ± 15」或「620 ± 200」的模型,对研究者的价值天差地别。前者你不知道该不该信,后两者告诉你该不该去做实验。第十三章说 AlphaFold 能被信任是因为它说出自己何时不确定,这一点在小数据上更重要。

三种常用的办法。集成:训练几十个略有不同的模型(不同的随机种子、不同的数据子集),它们预测的分散程度就是不确定性;简单、通用、和任何模型都能配。高斯过程:一种直接输出预测分布的模型,在几百个样本、几十个特征的尺度上非常好用,也是下一节贝叶斯优化的标准引擎。共形预测:一种不依赖模型类型的「后处理」,用一部分留出数据校准,给出「有 90% 概率包含真值」的区间,保证是数学上的,前提是新数据与校准数据同分布。

不确定性最实用的用法:把它画出来。哪些区域的不确定性大,就是模型没见过的区域,也就是第五章「分布偏移」的地图。在那里的预测不要信,或者去那里做实验。

高斯过程不假设一个具体的函数形状(直线、多项式),而是假设「相近的输入应当有相近的输出」,用一个「核函数」定义什么叫相近。给它几个数据点,它给出的不是一条曲线,而是一族曲线的分布:在数据点附近,所有曲线都挤在一起(不确定性小);离数据点远,曲线散开(不确定性大)。

它的预测就是这族曲线的均值,不确定性就是它们的分散程度,两者都有解析解,不需要梯度下降。它天然给出校准的不确定性,这是它在贝叶斯优化里成为标准的原因。

它的限制是计算量随样本数的立方增长,几千个样本以上就慢了;以及核函数的选择需要一点经验,通常从「平方指数核」加「噪声项」开始。在几百个样本的科研问题上,它常常是最好的第一选择,而且比神经网络诚实得多。

五、实验很贵:下一个该测哪个

预测只是手段,很多时候研究者真正的问题是:我只能再做二十个实验,该做哪二十个?

这是第三章「探索与利用」在实验室里的形态。做已知区域附近的实验(利用),大概率结果不错但学不到新东西;做远处的实验(探索),可能失败但会告诉你模型不知道的事。贝叶斯优化把这个权衡变成一个算法。

已有的实验数据十几到几百个 带不确定性的模型高斯过程 / 集成 选下一个实验「可能好」和「不知道」的折中 去做或机器人做 结果加入数据,模型更新,再选。目标不是「预测得准」,是「用最少的实验找到最好的」。 这是第三章「探索与利用」在实验室里的形态;配上自动实验室,就是专题四里那个自驱动的闭环。 实验很贵的时候,问题从「预测」变成「下一个该测哪个」
循环:带不确定性的模型选下一个实验,结果回来更新模型。

流程是:用已有数据训练一个带不确定性的模型(通常是高斯过程);对每个候选配方算一个「采集分数」,同时奖励「预测值高」和「不确定性大」;选分数最高的去做实验;结果加入数据,重来。它常常用几十个实验找到几百个随机实验才能找到的最优点,在催化剂、合金、电池电解液、工艺参数的优化上已经是标准做法。

在哪里挖下一个洞:已知的高点,和一无所知的区域。
在哪里挖下一个洞:已知的高点,和一无所知的区域。

配上第十三章讲的自动实验室,这个循环可以不需要人:算法选,机器人做,仪器测,结果回来,再选。它是「自驱动实验室」的核心。但它也有第五章的老问题:候选空间是人定义的,模型只会在这个空间里找;空间之外的惊喜,它永远不会提议。

六、序列、图像与光谱

不是所有科研数据都是表格。

图像:显微照片、电镜图、病理切片、天文图像。第六章的卷积网络是标准工具,而且几乎不需要从头训练:在自然图像上预训练的网络,换掉最后一层,用几百张你的图片微调,通常就很好。这叫迁移学习,是小数据图像任务的默认做法。要小心的是第五章的泄漏:同一个样品的多张照片必须在同一边。

光谱与时间序列:拉曼、红外、质谱、传感器读数。它们是一维的「图像」,一维卷积或者把它们当作序列送进第八章的 Transformer 都可行;在小数据上,先做傅里叶变换或峰提取变成描述符,再用树模型,往往更稳。

生物序列:DNA、RNA、蛋白质。第七章的语言模型技术几乎原样适用,而且已经有在几亿条序列上预训练好的模型,取它输出的向量当描述符,是当前最强的起点之一。

七、科研版的错误清单

第五章讲了泄漏、偏差、偏移。下面是它们在科研论文里的具体形态,每一条都在发表的论文里反复出现。

  1. 随机划分了有家族结构的数据。同一骨架的分子、同一批次的实验、同一病人的多张影像分在两边。对策:按家族划分。
  2. 用全部数据做了预处理。标准化、特征选择、降维在划分之前做,测试集的信息进了训练。对策:所有预处理只在训练集上拟合。
  3. 反复看测试集。对策:嵌套交叉验证,测试集只看一次。
  4. 没有基线。报告了 0.92 的相关系数,没说线性回归能到 0.90。对策:永远报告傻基线和简单基线。
  5. 在训练分布之外外推。模型在合金硬度 300 到 700 的数据上训练,用来预测 1000。对策:画出不确定性,标明适用范围。
  6. 指标与目标不符。目标是筛选,报告的是整体误差。对策:报告前 K 个的命中率。
  7. 数据太少就上深度学习。两百个样本训练一个图神经网络,结果不如树模型,但论文只报告了网络。对策:先树后网,都报告。
  8. 把相关当因果。模型发现「含铬量与硬度正相关」,论文写成「铬提高硬度」。对策:第五章的随机实验,或者至少说明这是相关。

一条总的建议:审稿人越来越懂这些。在方法部分主动写清划分方式、基线、不确定性和适用范围,是今天科研机器学习论文可信度的标志。

八、工具与路线

不需要成为程序员,但需要知道工具的名字。表格数据:scikit-learn 加一个梯度提升库;分子:RDKit(描述符、指纹、图);材料:pymatgen 与 matminer(结构与描述符);深度学习:PyTorch;贝叶斯优化:几个成熟的库。它们都是开源的、有文档的、有大量例子的。

第十二章讲的编程智能体对科研数据分析特别有用:告诉它「用这两百个样本训练一个梯度提升树,按骨架划分做五折交叉验证,画出预测对实测的图和特征重要性」,它能在几分钟内给出可运行的代码和图。你的工作是第一节的三个问题、第七节的清单、以及看结果是否说得通。这个分工,正是第十四章的分工表。

九、一个完整的例子

回到开头的合金组。他们最后是这样做的。

问题:从两百三十个配方预测硬度,用来从五千个候选里挑二十个去做。所以目标是排序,指标是「挑出的二十个里有几个进入真实前 5%」。

表示:从化学式算出一百二十个元素统计描述符(电负性、原子半径、价电子数的均值、方差、极差)。

考试制度:按主元素分成六个家族,做留一家族交叉验证;每个家族当一次测试集。这比随机划分的成绩低了不少,但更接近「预测一个新家族」的真实情况。

模型:傻基线(均值)误差 85;线性回归 62;梯度提升树 41;一个小网络 47。选树。

不确定性:五十棵树的集成给出预测区间;在两个家族上区间很宽,说明数据不够,模型标出了自己的盲区。

选择:不用预测值最高的二十个,而是用贝叶斯优化的采集分数,兼顾「预测高」和「不确定」,其中六个落在模型没见过的区域。

结果:二十个里有七个进入真实前 5%,随机挑的期望是一个。两个「不确定区」的配方之一意外地好,成为下一轮的起点。

这个例子里没有一步需要大模型,也没有一步需要超过一台笔记本的算力。它需要的是第五章的纪律和对自己数据的了解。这是校园里绝大多数 AI 应用的真实样子。

自测先自己想,再点开答案
  1. 两百个样本的表格数据,第一个该试的模型是什么?为什么不是神经网络?

    答案

    先傻基线和线性回归确定「多好算好」,再用梯度提升树。小数据上树模型对尺度不敏感、几乎不用调参、能给特征重要性,很难被小网络打败;网络需要几千以上的样本才开始有优势。

  2. 为什么同一骨架的分子必须划分到同一边?

    答案

    它们几乎相同,随机划分会让模型在测试集里遇到「见过的」样本,成绩虚高;真实使用时要预测的是新骨架,按家族划分才接近这个情况。

  3. 一个模型给出「620 ± 200」,这个大的不确定性有什么用?

    答案

    它标出了模型没见过的区域:在那里的预测不要信,或者正应该去那里做实验(探索)。不确定性的地图就是分布偏移的地图。

  4. 贝叶斯优化和「挑预测值最高的去做实验」有什么区别?

    答案

    它同时奖励预测高和不确定性大,兼顾利用与探索,用最少的实验找最优,而不是只在已知的好区域附近打转;它也会在模型的盲区里提议实验。

  5. 论文里报告「相关系数 0.92」,审稿人该追问什么?

    答案

    划分方式(随机还是按家族)、预处理是否只在训练集上拟合、傻基线和简单基线是多少、有没有不确定性和适用范围、指标是否与用途一致。

本章术语

监督学习Supervised learning

用带标签的数据训练模型,学习从特征到标签的映射。最成熟、应用最广的范式,识别与预测两类能力主要来自它。瓶颈是标签昂贵。

泛化Generalization

模型在没见过的数据上表现稳定的能力。它是机器学习唯一真正的目标,损失、梯度、参数都为它服务。训练数据上的表现不能说明泛化,必须在留出的数据上考。

训练集与测试集Train / validation / test split

把数据分成三份:训练集用来学,验证集用来调参数和决定何时停,测试集只在最后考一次。验证与测试分开,是为了防止你反复根据同一份数据调整模型而间接过拟合它。有时间顺序的数据必须用过去预测未来。

标签泄漏Label leakage

某个特征偷偷包含了答案(预测是否住院,特征里有「是否开了住院单」)。模型会得到近乎完美的训练成绩,因为它作弊了,而作弊的特征在真正预测的时刻并不存在。往往很隐蔽。

探索与利用Exploration vs. exploitation

强化学习特有的矛盾:是沿用已知有效的行动(利用),还是尝试未知的行动以发现可能更好的选择(探索)。只利用会困在平庸解,只探索拿不到稳定回报。监督学习的数据是给定的,不存在这个问题。

表示学习Representation learning

深度学习真正的突破:不只学从特征到答案的映射,连从原始数据到特征的映射也一起学。人只提供像素和标签,网络自己发明「边缘」「纹理」「耳朵」。它让同一套方法可以用于图像、语音、文本、蛋白质结构。

校准Calibration

模型表达的把握程度与实际正确率的一致性。基础模型校准通常很好,对齐后常变差,因为标注者偏爱肯定的语气。于是「自信」不再对应「正确」。实用建议:把语气当噪声,把多次回答的一致性当信号。