想象你训练了一个识别猫的图片分类器,准确率 90%。听起来不错?但剩下 10% 的错误藏在哪里,你一无所知。这时候大多数团队的本能反应是:换更复杂的模型、加更多数据、调参。这就像房间里灯坏了,你的对策是把整栋房子的电线全换一遍。
吴恩达在他的机器学习课程里给过一个反直觉的建议,几乎和本能相反:先别动模型,先去看那些错的东西。
把错误摆到桌面上
具体做法朴素得让人意外。从你的开发集(一组模型没见过、专门用来挑模型毛病、辅助改进的数据)里,把分类错误的样本挑出来,比如 100 个。然后,一个一个人眼去看,给每个错误贴一个标签:这张图其实是狗,被当成了猫;这张图光线太暗;这张图里猫只露出半张脸……
贴完标签之后做一件关键的事:按出现次数从多到少排序。比如你发现 100 个错误里,有 43 个其实是狗的照片,27 个是光线问题,15 个是猫被遮挡,剩下的零零碎碎。
排序一出来,下一步该干什么几乎是自己喊出来的。43% 的错误是狗惹的祸?那就专门去找一批狗的图片加进训练集。改完这一项,准确率可能就跳了两个点。然后收拾 27% 的光线问题,再跳一点。
人话版:别修全屋的电线。先把 100 个坏灯泡摆桌上数一数,哪种坏得最多就先修哪种。
为什么这招有效
它有效的原因藏在一条朴素的数学事实里:错误不是均匀分布的,它们是扎堆的。如果错误均匀散布在无数种原因上,每种原因只占千分之一,那你做什么都不会有明显效果,这个方法也就没用了。但真实世界里,错误几乎总是集中在少数几个原因上——少数几类数据、少数几个场景,贡献了绝大多数的坏结果。
所以「数一数、排个序、从头开始修」不是一个偷懒的近似,而是对准了错误分布的重心开火。修掉第一大原因,收益立竿见影;而且因为各原因是叠加的,每修掉一个,你的指标只会往上走,不会往下掉。
它不只是在讲机器学习
这个方法的名字叫错误分析(error analysis),吴恩达把它当作训练深度学习模型的标准动作来教。但你把它抽出来看,骨架其实是这样的:
- 收集一批「坏案例」,而不是对着抽象的总体焦虑;
- 给每个坏案例找原因,归类;
- 按原因的出现频率排序;
- 从频率最高的原因开始,一个一个击破。
这个骨架里没有一丁点儿数学,也没有任何只属于神经网络的东西。换句话说,它完全可以搬出机器学习,搬进任何「有一堆问题要解决、但不知道从哪儿下手」的场景。
客服投诉太多?把投诉逐条归类排序,先修被投诉最多的那一项。孩子写作业总出错?把错题归归类,多半你会发现就两三种类型在反复出现。软件线上事故不断?把事故复盘报告里的原因数一数,排序,先消灭那个出现十几次的。
方法好用到这个程度,问题就来了——它叫什么?