从10%+10%=0.11说起,差之毫厘谬以千里

近日有网友称手机计算器出现了严重的BUG,在普通模式下,计算“10%+10%”得出的结果居然是0.11,而不是我们通常认为的0.2。尤其是小学老师表示问题很严重”。

1

该话题在微博上迅速升温,阅读量数亿,参与讨论的人数数万。而根据网友测试结果统计,包括三星、苹果、华为、oppovivo在内的绝大多数品牌都中枪了,而只有少数国产手机品牌可以得到正确的结果。

 

 

这个问题换一个场景就很容易弄清楚了:例如商场促销打九折,有10%的优惠,你购买了100元的东西,直接输入100-10%就可以算出90元的折后价,而不需要在计算器内输入100-100*10%这么麻烦。又如计算银行利息,如果年利率为4%,那么存10000元一年后就是10000+4%=10400元,这样的场景下如此操作是否更加方便呢?所以其实10%+10%=0.11并不是BUG,只是思维方式不同以及计算机的一个省略算法而已。

 

然而这件小事的本质是思维习惯和人机交互的问题,我们认为是理所当然的小问题,在不同的文化背景,以及不同的思维习惯下,会造成很严重的问题,所谓差之毫厘谬以千里。也让我想到最近在读的《生命3.0》(作者为迈克斯·泰格马克,麻省理工学院的物理学终身教授),从宇宙学、价值观以及意识主观等各方面预测了人工智能革命的前景与风险。

生命3.0

 

《生命3.0》中就这个问题详细展开了讨论,从智能的定义开始,记忆、计算、学习,智能的运行都独立于物质之上,因为没有理由认为机械不能拥有智能。而人工智能的出现,将极大的改善我们的生活,也将带来严重的危机,因此需要解决与验证、确认、安全和控制有关的一些棘手技术问题。

 

1)验证——是回答“我建造系统的方式正确吗?”

 

验证的意义在于,保证软件完全满足所有的预期要求。信息技术对人类几乎所有的实业领域都产生了积极的影响,从科学界到金融、制造、交通运输、医疗服务、能源、传媒等。但太空探索领域血淋淋的教训,证明计算机科学家所说的验证非常重要。

 

199664日,阿丽亚娜5火箭发射37秒之后在空中炸成了灿烂的烟花,亿万美元的投资毁于一旦。经过调查,他们发现导致这次事故的原因是,当火箭中的某个软件在处理一个数字时,由于这个数字太大,超出了预先分配给它的16个比特的范围,因此发生了故障。

burn-burst-crash-256229

 

1998年,NASA的火星气候探测器(Mars Climate Orbiter)意外落入了这颗红色星球的大气层,最终瓦解碎裂,此次事故由计量单位的混淆造成,飞行系统软件使用公制单位计算推进器动力,而地面人员输入的推进器参数则使用的是英制单位,导致飞行系统软件的错误率高达445%

 

1962722日,NASA的金星探测器水手1在卡纳维拉尔角发射升空后,旋即爆炸,原因是一个符号的错误造成了飞行控制软件的故障。

 

198892日,苏联的福波斯1任务也失败了。这是有史以来最重的行星际飞行器,它拥有一个远大的目标:在火卫一上安置一个着陆器。但这一切因为一个连字符的丢失而烟消云散。这个故障将中止任务的指令发送给了正在赶往火星途中的福波斯1,导致它关闭了所有系统,与地球的通信中断。

 

2)确认——是回答“建造的系统正确吗?”

 

信息技术给金融行业也带来了巨变,让金融资源在全球以光速进行高效的重组和分配,如今股票市场中大部分买卖的决策是由计算机完成的,因此验证对金融系统的安全性也十分必要,20128月,美国骑士资本集团(Knight Capital)就收到灭顶之灾,它在45分钟内损失了4.4亿美金,只因其部署了未经验证的交易软件。然而验证并不能充分保证不发生严重的事故:

blur-chart-data-159888

 

201056日,道琼斯指数在20多分钟内暴跌约1000点,其中最剧烈的600点下跌发生在5分钟内,之后指数又大幅回升。这一交易日也创下美国股市有史以来最大单日盘中跌幅,堪称华尔街历史上波动最为剧烈的20分钟,被称为“闪电崩盘(Flash Crash)”,后经美国执法部门的调查发现,事件的罪魁祸首是来自英国的萨劳,他当时在位于伦敦郊区的普通住宅内,利用家用电脑对美国股市的期货交易系统下虚假合约单,制造恐慌并引发股市动荡。萨劳利用一个计算机交易程序对美股股指期货下巨额卖单,但能瞬间实现撤单,以保证这些卖单不会成交,却能对交易价格构成实时抛压。这一做法的目的并非完成交易,而是影响价格和达到操纵市场的目的(不过,部分业内人士对美方有关萨劳制造“闪电崩盘”的指控持怀疑态度,认为他可能是美国当局找到的“替罪羊”)。

 

这样的事故并不能通过“验证”来避免,也并非计算机失灵造成的,而是因为“预期被违背”,如果说是萨劳根据交易系统的漏洞对交易价格构成了实时的抛压,使很多公司的交易程序出现了前提假设的失效。

 

3)自动设备安全事故的原因,是因为它们做了无效的假设

 

生产制造业里使用的机器人越来越多,对机器人软件系统的验证和确认的重要性也越来越高,然而即便如此,在生产制造业里仍然出现了工人被机器人杀死的惨案。虽然随着技术的进步,生产事故的数量已经减少了许多,但上面的例子的事故,不是因为设备故障,也不是出于机器系统产生了恶意的意识,仅是因为机器做出了无效的假设:那个工况里没有人。

 

交通运输业,也将是AI的广阔用武之地,将很大程度上提升安全性,减少交通事故的死亡人数,据统计2016年美国机动车事故造成了约3.5万人丧生,我国道路交通事故死亡人数约6.3万人,而印度则约有13万人死亡。因此许多科研工作者及企业家对AI寄予厚望,他们相信采用AI驱动的无人驾驶汽车能降低至少90%的由交通事故导致的死亡人数。在这样的理想支持下,无人驾驶汽车的研发在如火如荼的开展。

7

 

无人驾驶汽车的安全记录确实比人类司机的更好,而过去发生的事故强调了“确认”的重要性和难度。无人驾驶汽车的第一次轻微交通事故发生在2016214日,一辆谷歌无人驾驶汽车对一辆公交车做出了错误假设,它错以为当它在公交车前面驶入主路时,公交车司机会让它先行。无人驾驶汽车的第一次致命事故则发生在201657日。一辆自动驾驶的特斯拉汽车在交叉路口撞上了一辆卡车后面的拖车。这个事故是由两个错误的假设造成的:第一,它错以为拖车上明亮的白色部分只是天空的一部分,第二,它错以为司机会注意路况。

 

4)验证和确认之外,还需要好的控制

 

2019310日,埃塞俄比亚航空一架波音737 MAX飞机发生坠机空难,这是继20181029日印尼狮航空难事故之后,波音737 MAX飞机发生的第2起空难。201944日,埃塞俄比亚公布了埃航空难初步调查结果,结果确认起飞时一切正常且机组人员在紧急情况是完全按照波音和FAA的操作规程处理,但却无法掌控飞机,埃方最后建议波音对飞控系统进行检查。

8

 

狮航空难的原因是飞机信号系统接收到一个假信号,信号显示飞机“抬头”,所以飞机自动失速控制系统持续给出了“低头”的指令,机组人员与飞机自动失速控制系统搏斗很长时间,但最终还是发生了坠机悲剧。

 

201945日,波音公司CEO Dennis Muilenburg首次通过视频承认波音737 MAX机型的防失速系统(MCAS)是两次空难的原因。

 

也许波音飞机的例子放在这里并不十分合适,但是我想说明的是,即使在验证和确认之外,仍然需要好的控制,在有些情况下,需要人类操作员能够监视系统,并在必要时接管系统,并改变系统的行为,这就需要保持必要的、有效的人机交流。

 

小结

 

10%+10%的事情不过只会给我们带来一点困扰,聪明的程序员会有很多办法来解决或避免类似的问题。但如果我们处理的是比人类力量强大许多的工程机械、处理比人类速度快许多的自动驾驶车辆,处理比人反应快许多的时间敏感相关的能源工业系统问题,处理涉及生命安全的医疗手术、处理金融系统问题这样的问题绝对不是小事情,差之毫厘谬以千里,希望各产业里能够有更加健壮的软件,或者更强大的AI,可以避免不必要的损失,可以不必通过试错使技术更好地服务于人类。