模型第一次跑通之后,真正消耗时间的往往不是“再写一个网络”,而是决定下一步做什么。验证集误差不理想时,我们可能同时想到扩充数据、增加模型容量、换损失函数、调阈值、清洗标签和重做数据划分。每条路都像是合理的,但工程预算不允许把它们全部试一遍。
机器学习策略解决的正是这个选择问题。它不承诺一次猜中最好的算法,而是让每轮实验更快回答一个明确问题:瓶颈在哪里,这次改动想改变什么,结果是否支持原来的判断,下一轮应当保留还是放弃什么。

这篇文章会把这套方法落到可执行的细节:如何写指标与约束,如何划分验证集和测试集,如何借助人类表现诊断偏差与方差,如何做错误分析,以及如何把候选实验按预期收益和成本排队。你不需要把这里的建议当成不可违反的规则;更合适的理解是,它们是一套帮助团队减少无效试验的默认工作法。
一次完整迭代至少包含五个动作:明确目标、观察失败、提出假设、运行实验、记录证据。只有“训练一个新模型”不算完整闭环,因为我们还不知道它在解决哪个问题,也无法判断数值变化来自预期机制、随机波动,还是数据与代码一起改变了。
假设一个语音指令模型的验证集错误率是 8%。团队列出四个想法:把网络加深、再收集 10 万条音频、增强带噪音频、调整拒识阈值。策略工作的第一步不是从中挑一个最流行的,而是先问:错误主要来自训练集也拟合不好,还是只在新样本上变差?它们是否集中在低信噪比场景?当前离线指标是否对应产品真正关心的误触发成本?不同答案会把实验送往完全不同的方向。
一个紧凑的实验闭环可以这样写:
这套流程强调“获得信息的速度”,而不只是单次训练的速度。一个两小时就能否定错误方向的小实验,可能比一周后得到 0.1 个百分点提升的大实验更有价值。Google 的深度学习调优指南也把增量式改进写成目标、实验、学习、是否采用四个循环,并提醒团队从简单配置开始,以证据支持每次增加的复杂度。
快速迭代不等于草率迭代。真正快的团队会缩小每次要回答的问题,同时保留数据版本、配置、随机性和评估结果;否则“跑得很多”只会留下无法比较的一堆数字。
正交化的直觉像一排功能清楚的旋钮:一个控制屏幕亮度,一个控制音量。调节某个旋钮时,我们希望先知道它主要影响哪项结果。放到机器学习项目里,就是把“拟合训练集”“泛化到目标数据”“满足线上约束”分开诊断,再为每个差距选择更直接的手段。

常见诊断链条可以写成下面四层:
“一次只改变一个控制变量”是获得可解释证据的好起点。若基线和候选方案同时换了模型、数据增强、阈值与数据划分,即使 F1 上升,也很难知道应该保留哪项变化。更稳妥的记录是:保持数据版本、评估脚本和阈值策略不变,只改变一项待研究因素。
不过,这也不是字面意义上的“永远只改一个超参数”。有些因素存在交互:改变优化器后,合适的学习率范围也会改变;扩大模型后,批量大小和正则化可能需要重新调节。此时可以把“模型结构”视为科学变量,把学习率等视为需要公平调优的伴随变量,并明确写出哪些量固定、哪些量允许搜索。关键是让实验仍能回答原来的比较问题。
正交化是一种诊断纪律,不是算法性质。早停会同时影响拟合程度和泛化,数据增强也可能改变优化难度。遇到这种工具,不必因为它“不够正交”而弃用;应把它影响的路径写清楚,并用训练曲线和对照实验辨别作用。
很多指标争论并不是数学争论,而是产品问题尚未说清楚。以“识别高风险订单”为例,至少要确定预测单位是一笔订单还是一个用户,预测发生在付款前还是付款后,正类指什么,模型输出会触发拦截、人工复核还是只用于排序。动作不同,误报与漏报的代价也不同。
一份够用的目标说明通常包括:
例如:“在付款前为每笔订单输出风险分数;在验证集上最大化召回率,同时要求误报率不高于 0.5%、P95 延迟不高于 80 毫秒,并在新用户切片上单独报告结果。”这句话仍不完美,但它已经能过滤掉许多不合适的实验。
约束最好在大规模搜索前写下。若看到结果后才把“误报率不高于 0.5%”改成 0.8%,团队可能无意中为某个喜欢的模型移动门槛。约束需要修改时,应记录修改原因,并重新考虑验证集是否已经参与了太多决策。
目标也不应只剩一个平均数。整体 F1 可能上升,而低光图像、新用户或少数语言切片明显变差。关键切片可以是满足指标,也可以是必须单独报告的诊断指标。它们是否应成为硬约束,要由业务风险、样本量和可操作性共同决定。
若模型 A 的精确率更高、模型 B 的召回率更高,而团队没有预先写决策规则,评审很容易变成各挑一个数字。单一优化指标的价值不是概括系统的一切,而是让同一轮候选实验能够稳定排序。
假设猫图识别的两个候选模型表现如下:
如果业务暂时把精确率和召回率等权看待,F1 可以提供一个排序数值。它使用调和平均,任一项很低时,结果都会明显被拉低:
但一个数字无法替代约束。若模型 A 的推理延迟为 600 毫秒,而产品预算只有 100 毫秒,F1 的小幅领先没有决策意义。此时可以把规则写成:先筛掉延迟超过 100 毫秒或模型体积超过 50 MB 的方案,再在合格方案中最大化 F1。

这种“满足指标 + 优化指标”的结构也适合安全与切片要求:
单一指标也可能掩盖变化,因此候选模型仍应附带混淆矩阵、关键切片和置信区间。我们只是在“采用哪个方案”这一步使用明确规则,不是把其他信息从报告里删除。
二分类模型通常先输出分数,再用阈值把分数变成动作。设真正例、假正例和假反例分别为 、、,则:
Precision 回答“被模型判为正的样本中有多少是真的”,Recall 回答“所有真正例中找回了多少”。提高分类阈值通常会减少正类预测,假正例可能下降、假反例可能上升,因此 Precision 与 Recall 会随阈值一起变化。Google 的分类指标指南明确提醒,这些指标都对应某个固定阈值,指标选择要结合两类错误的成本。
F1 默认同等看待 Precision 和 Recall,也没有使用真负例,更不知道一次漏诊与一次误报分别造成多少损失。如果业务能给出近似成本,可以先写一个简单决策代价:
其中 是阈值, 与 是两类错误的单位代价。成本很难精确货币化时,也可以用约束表达,例如“Recall 至少为 95%,在此条件下最大化 Precision”。这比先追求最高 F1、上线前再临时挑阈值更容易审计。
阈值应在验证集上选择,并在测试集评估前锁定。scikit-learn 的分类阈值调节指南把概率估计与决策动作明确分开,也提醒不要在训练模型的同一数据上调阈值。更严格的项目还会把阈值选择嵌入交叉验证或独立校准流程,以减少过拟合。
测试集不能既用于挑模型,又用于调阈值,最后还被当成“未见数据”报告。每次根据测试结果修改方案,测试集就参与了一次开发决策;反复使用后,它对真实泛化性能的估计会变得过于乐观。
训练集用于学习参数,验证集用于多轮选择模型、超参数和阈值,测试集用于开发结束后的独立估计。三者用途不同,划分原则也不能只剩一个固定比例。
对于计划上线到手机端的图像模型,团队可能拥有大量棚拍或网络图片,但真正关心的是用户在手机上拍摄的照片。训练集可以在必要时混入前一种便宜数据;验证集和测试集则应从明确的目标场景抽取,并采用一致的抽样规则。否则团队可能一直在为“验证集中的旧设备用户”优化,最后却用“测试集中的新设备用户”判定成败,两组数字很难形成稳定反馈。

“同一分布”在项目里需要被具体化:时间范围、设备、地区、用户类型、采集流程和去重单位都要说明。如果产品关注未来数据,按时间划分可能比随机划分更接近部署;这时验证集和测试集可以来自连续但不同的未来时间窗,只要这种差异是评估设计的一部分,而不是无意的抽样偏差。
数据划分还要防止泄漏。来自同一用户、同一视频、同一患者或同一商品的高度相关样本,不应随意散落到训练与测试两侧。Google 的训练、验证与测试集指南强调评估集应足够大、代表真实数据,并移除与训练集重复的样本。
“20% 留作测试”并不是普适答案。验证集需要大到足以区分候选方案,测试集需要大到能以所需精度报告最终结果。对错误率这类二项比例,若暂时忽略相关性,可用下面的近似标准误做第一轮估算:
近似 95% 误差范围是 。最保守地取 ,若希望误差范围约为正负 1 个百分点,粗略需要约 9604 个独立样本;希望缩到正负 0.5 个百分点,数量约为其四倍。这个公式只是规划起点,不是最终证明:同一用户的相关样本、稀有切片、小样本比例和模型间配对比较都需要更合适的方法,例如分组 bootstrap 或配对检验。
整体样本够大也不代表关键切片够大。若夜间样本只占 1%,一万个测试样本里大约只有一百个夜间样本,夜间错误率仍会很不稳定。样本量规划应回到真正要做的决策:要比较多小的提升,要约束哪个低频风险,要以多窄的区间向外报告。
在给定数据分布和损失函数下,贝叶斯误差可以理解为利用真实条件分布所能达到的最低期望错误。现实项目通常不知道真实分布,也就无法直接测出这个理论下限。人类表现的用途,是在“人类擅长、输入信息相同、评估协议明确”的任务上,为这个下限提供一个可观察但并不精确的代理。
这句话有三个限制。第一,人类可能远未达到贝叶斯最优,尤其在高维表格、长时间序列或需要大规模统计规律的任务上。第二,人类和模型看到的信息必须可比;专家如果能查看病史而模型只能看一张影像,两个错误率不能直接相减。第三,“人类水平”不是一个天然常数,它依赖参与者、标注说明、独立判断还是会诊、是否允许拒答,以及如何处理分歧。

例如,同一影像任务可能得到三组结果:普通标注员错误率 4.5%,专科医生 2.8%,三位专家独立判断后仲裁为 1.9%。如果团队想用 1.9% 作为参考,就应该把协议写成“专家人数、可见信息、仲裁方法、目标数据和同一指标”,而不是只在表格里写“人类:1.9%”。
在 Andrew Ng 的《Machine Learning Yearning》与 DeepLearning.AI 的机器学习项目结构课程中,人类表现被用于辅助判断可避免偏差。更准确的表述是:它在特定任务里可能接近贝叶斯误差,因此可以充当诊断参照;它既不是贝叶斯误差的测量值,也不是所有模型都不能跨越的硬上限。
“模型超过普通人”只说明模型在当前数据、指标和人类协议下取得了更低误差。它不能自动推出模型超过专家、超过贝叶斯最优,或已经适合部署。切片风险、校准、代价和数据变化仍需单独评估。
传统的“训练误差减到零”会忽略任务本身的不可约不确定性。若人类水平能作为贝叶斯误差的合理代理,可以把两段差距分开看:
假设专家协议下的人类错误率为 1.5%,模型训练错误率为 2.3%,验证错误率为 4.0%。第一段差距约为 0.8 个百分点,第二段约为 1.7 个百分点。在指标、分布和估计都可信的前提下,当前更大的信号来自泛化差距,团队可以优先检查正则化、有效数据量、重复样本、切片和训练/验证差异。
另一个项目的人类错误率为 5.0%,训练错误率为 7.0%,验证错误率为 7.5%。此时可避免偏差代理约为 2.0 个百分点,泛化差距约为 0.5 个百分点。优先检查优化是否充分、模型或输入表示是否有能力拟合训练模式,会比一开始就大规模收集同分布数据更有针对性。
这里的“偏差”和“方差”是工程诊断的简写,不等同于对估计器做严格的偏差—方差分解。差距很小时,还要先比较评估噪声和训练随机性。如果验证误差只改善 0.05 个百分点,而重复训练的标准差已有 0.1 个百分点,就不宜把一次最好结果当成稳定提升。
还要检查三个异常情况:
验证错误率告诉我们“有多少错”,却不告诉我们“错在哪里”。错误分析的做法是从验证集错误中抽取一批可管理的样本,逐个查看并记录现象、可能根因、切片、标签疑问和可修复性。这样做的目的不是写一份漂亮分类表,而是找出下一轮最值得验证的假设。
一张实用表格可以包含:
类别应允许重叠,因为一张图片可以同时低光和模糊。也要区分“可观察现象”和“推测根因”:模糊是现象,快门设置或上传压缩才可能是根因。把两者混在一个勾选框里,容易让团队直接跳到解决方案。

假设当前验证错误率为 8%,抽查的错误中有 25% 带有严重模糊。即使存在一个“完美修复模糊错误”的方法,并且这些样本与其他类别没有复杂重叠,整体错误率最多下降约 2 个百分点:
如果预计只能修好该桶的 40%,更朴素的潜在改善估计是:
这只是上限或粗略期望,不是收益承诺。类别重叠时不能把各桶上限直接相加;样本量小也会让比例不稳定。更稳妥的做法是保留样本级勾选,报告分母与不确定性,并在修复后回到完整验证集评估。
标签疑问要单独记录。它可能揭示标注规范含糊、类别边界变化或评审者不一致,但不能在看到模型输出后随意把标签改成模型预测。应使用与模型无关的复核协议,并保留修改前后的数据版本。下一章会继续讨论标注错误和训练/目标分布不匹配,因为它们会改变我们对“过拟合”的判断。
错误占比大不等于一定先做。一个覆盖 40% 错误的方向可能需要三个月重建采集系统,另一个覆盖 12% 错误的方向也许半天就能验证。排序时至少同时考虑潜在收益、实现成本、结论可信度和对后续实验的信息价值。

可以为每个候选实验写一张短卡片:
“潜在收益 ÷ 成本”可以帮助初排,但不要把它伪装成精确财务公式。收益估计来自有限错误样本,成本也可能遗漏标注、部署和维护。低成本、高信息量的实验通常适合先做;高收益、高成本方向则可以先设计一个便宜的前置验证。
最低限度的实验记录应包含:
Google 的训练流程附加指南建议记录研究名称、配置链接、说明、trial 数量、最佳验证表现和复现命令,并直言未被追踪的实验几乎等于不存在。JMLR 的机器学习可复现性报告则从更广的研究实践说明,代码、数据、配置和评估披露是复查实验结论的基础。
固定随机种子有帮助,但它不是可复现性的全部,也不能代替多次运行。种子能重放一部分随机过程;框架版本、硬件算法、数据顺序和非确定性算子仍可能造成差异。重要候选方案应在预算允许时重复运行,并把均值、离散程度和单次最好值区分开。
如果错误分析显示训练集表现良好,但验证错误集中在训练数据中很少出现的目标场景,就不能简单归为“需要更多同类训练数据”或“加强正则化”。下一章会把训练—开发集与目标验证集分开,继续处理分布不匹配、标注修订,以及如何在可获得数据与真正目标之间搭桥。