夜钓者看不见的浮漂
深夜,湖面平得像一面镜子。一个钓鱼的人坐在小船上,盯着水里一排浮漂。每个浮漂上都绑了一根荧光棒,鱼一咬钩,光就会晃动。可奇怪的事发生了:有几个浮漂慢慢沉到水面以下,荧光完全看不见了。鱼可能正在咬钩,钓鱼的人却什么信号都收不到。有一类智能软件也遇到了同样的困境:它把内部信号转换成对每个答案的信心值,但某些转换方式会让信心直接归零。信号一归零,软件就像盯着黑水的钓鱼人,恰恰在最需要学习的地方,彻底失聪了。
为什么浮漂会消失?因为荧光棒只在水面以上才发光,往下多沉一点点,光就全灭了。三种浮漂设计对应三种信号转换方式:第一种一入水就全黑,像开关一样一刀切;第二种慢慢变暗;第三种沉得再深,也始终保留一丝微光。结果呢,在答案选项特别多的复杂任务里,用一刀切方式的软件,准确率比普通软件低了将近四十个百分点。而保留微光的方式好得多。这个排序终于解释了困扰人们多年的一个现象。
有人试过一个办法:每当软件对错误答案表现出信心,就惩罚它。好比钓鱼人把漂到错误位置的浮漂全拽走。问题是,拽走错位置的浮漂,并不能让沉在水下的浮漂重新发光。浮漂总数变少了,水下那些该亮的还是黑着。惩罚力度越大,反而把更多浮漂推到水下。在一个有上百个选项的任务里,加大惩罚之后准确率反而更低了。软件被纠正了错误,却在黑暗区域得不到任何正确方向的指引。
真正管用的做法很简单:给每个沉下去的浮漂绑一个小小的救生浮球。浮漂沉得越深,浮球向上托的力就越大;等浮漂自己浮上来能发光了,浮球就自动脱开。对应到软件里,就是加了一个修正项:一旦正确答案的信心值归零,就注入一个向上的推力,推力大小跟软件当前的不确定程度成正比。不确定最高时,推力最强。信心慢慢恢复后,推力平滑退出,正常的学习过程接管。
浮漂本身也做了改良。那种始终保留微光的设计在水下表现好,但在浅水区光会猛然增强,亮到刺眼,把旁边的信号全盖住了。于是设计者做了一种混合浮漂:水下部分保持微光特性,确保深处有信号;水上部分改成匀速变亮,不会突然炫目。两个优点合在一起,各种条件下都能稳定工作。
装上救生浮球、换上混合浮漂,钓鱼人重新出发。在平静的小湖里,各种方案差别不大。但到了波浪翻涌、上百种鱼同时咬钩的大湖,差距一下子拉开了。升级后的装备识别率达到了百分之七十六,老式一刀切浮漂只有百分之三十六。而且信号变得可信了:那些亮得最稳的浮漂,几乎每次都判断正确。闪烁微弱的,钓鱼人知道要多留个心眼,再确认一遍。
这套救生浮球的思路不只适用于一个场景。在识别模糊人脸、从极少的样本中学习、发现从没见过的陌生物体等不同任务里,老系统都卡在黑暗区域动弹不得,加上浮球之后就恢复了正常学习。不需要重新设计整个系统,只是加了一个小小的自适应推力,再换上混合浮漂。核心道理就一句话:当一个系统在衡量自己有多确定的时候,存在一个隐藏的盲区,信心低到一定程度,系统就对反馈彻底失聪。一个能自动调节的小推力,就能让它重新听见。