夜班十一点,装配线尾端的相机闪了一下,屏幕上有个工件被红框圈住。操作员看了两秒,点下“放行”。这个动作他一晚上要重复几十次,多数时候并不需要抬头。
相机后面跑着一个检测模型。它不说“这个件有问题”,它给出一个介于零和一之间的分数,再由一个阈值把分数切成两堆。阈值写在配置文件里,通常是个默认值,很少有人回头去动它。于是不少人以为系统在“判断”,实际上系统在“比较”。
一个分数被当成一句话
分数和结论之间隔着一次翻译。训练时见过的缺陷样本往往不多,模型对这类样本天然谨慎,遇到有点像的就把分数往上抬一点。分数高,只说明它像训练集里的某些东西,不说明问题有多严重。把这两件事混在一起,后面所有的调整都会失去依据。
另一头是现场的变化。换一批物料、换一组灯管、镜头蒙了一层薄灰,分数的分布就悄悄挪了位置。模型没有变,它看到的世界变了。这类漂移不会报错,只会让红框出现的频率慢慢偏离预期,而现场的人通常比后台更早察觉。
成本不对称,阈值就不该对称
漏掉一个坏件,代价可能是一批货流到客户手里,再往回追;误拦一个好件,代价只是多一次复检。这两件事的量级常常差得很远。阈值调低,拦下来的多,误判也多;调高,情况反过来。这并非模型能力的缺陷,关键在于把它放在哪条线上的取舍。
有人习惯用报表上的准确率来定这件事。样本不均衡时,准确率很容易给出安慰:绝大多数件都是好的,只要一律判合格,数字也不会难看。要拆开看,把误判和漏判分开计数,两个数才有意义。只看一个合并后的百分比,等于把两种性质不同的错误放在同一个天平上。
所以调阈值不是调参,它是在写业务规则。谁承担漏判的后果,谁就该参与这个决定。把人工智能放在这条线上,它负责的是“像不像”;“要不要”这一句,还得由懂成本的人来签。
人的那一秒钟
回到夜班那个瞬间。操作员放行,其实是用眼睛补了一次判断:框的位置偏了一点,划痕在反光下不明显,这个件他刚刚上手摸过。这些信息不在模型的输入里,也不该指望它在输入里。
但人的注意力有限。如果系统把大量模棱两可的分数都标成警报,人很快会学会无视它,红框变成背景噪音。让系统在拿不准的时候安静下来,把有限的红框留给真正需要看的东西,往往比再多调一个点更有用。沉默也是一种输出,只是它不会出现在任何报表里。当然,沉默需要代价来兜底:定期把放行的样本捞回来让人复核,尤其在物料或光照变化之后。
需要警惕的其实并非模型偶尔出错;更值得留意的是,没有人能说清阈值为什么是那个数。