thealgorithmsforeverything.
dhew
程序员的终极梦想到底是什么
dhew,科幻作者,热血中年。虽出道甚早,但沉迷游戏以致荒废十年,不后悔,感谢游戏。如今在做自己的游戏(非科幻游戏),同时写作,写科幻小说。代表作《基因战争》。
那天我酒喝多了,好奇地问在场的一位程序员哥们儿:“这个社会对程序员有那么多的误解,你们是怎么坚持下来的?”
那哥儿们估计也喝多了,就给我讲了那个所有程序员都知道的故事。
一开始,只是有人想做个预报天气的软件。这人当然是个程序员,叫什么名字不重要。重要的是,他不想做那种给天气预报配点小清新照片就完事的手机应用。他想从零开始,从气温、风向、风速和云图入手,推测出接下来二十四小时的天气变化。他想要做个预报天气的软件。
程序员们很像手工匠人,天生喜欢从无到有做点什么东西出来。这个程序员也不例外。他从气象学的基本理论开始构建一个算法,我们姑且把它称为算法a吧。就像所有刚刚通过调试的软件一样,算法a出师不利:上线运行那天,气象局预报下午有雨,而算法a预报天晴。
程序员大多对自己开发的软件坚信不移,这名程序员也不例外,于是他被雨淋了个透湿。在反复审视自己的作品后,他把问题锁定在了算法上。并不是算法有问题,而是依据气象学的数学表达本身就不完备。但他没能力把这门科学再往前推进一步。他把源代码上传到github,并开了一个帖子,向其他程序员求助,有人回复说,没办法了,上机器学习吧。
和大众想象的不一样,程序员们对机器学习抱着一种爱恨交加的复杂感情。爱的是它让全世界的程序员们都出了次风头,恨的是它完全不符合程序员们习惯的思考方式。
机器学习的原理和小学生做数学习题的方式颇有共通之处。计算机做一道题,看一下答案,如果错了,就重做。它可能并无解题思路,甚至对题目想要考验的知识一无所知,但如此反复几百万遍后,计算机会得出一个正确率最高的解题方法,然后用这个方法快刀斩乱麻般解决所有类似问题。但问题在于,计算机无法向你解释这个方法到底是什么。它就在那里,你知道它存在就行了。就像一个魔法师的帽子,程序员们能从里面掏出兔子来,却无法解释这个帽子到底是连通了异次元还是怎么的。
引入机器学习后,算法的准确率大幅提升,气象局预测下雨时,算法预测为下冰雹;气象局预测天晴时,算法预测为高温警报。虽然看起来只是在气象局的结果上叠加了一个正态分布,但程序员知道这个算法已经踏上了正确的道路。训练三周后,算法在预测的即时性和准确度上就已经超过了气象局。程序员欣喜地将软件放到网上,为所有人免费提供未来二十四小时的天气预测,并在预测结果上加入了“更精准,更及时”的标题。气象学家们上电视宣称这是气象学理论推动了社会的进步和发展,而程序员只是适逢其会。
看完节目的程序员愤怒地将算法的代码开源了。立刻就有同仇敌忾的程序员跟进并重写了代码,剔除了依据气象学理论加入的基本原则和预测方法,直接使用机器学习由零开始构筑新的算法。这一次,项目获得了一个正式的命名:“天气算法”。
一开始,“天气算法”给出的结果惨不忍睹。它曾预测在撒哈拉沙漠正中央出现彩虹,或在印度洋的中心出现沙尘暴。但在两周的训练后,它就碾压了自己的前辈,不但准确率更高,而且需要的计算单位还更少。气象学家们被狠狠地扇了一巴掌,然而比名誉扫地更可怕的是,他们丢了工作。
程序员们隔着屏幕拍手庆贺。
就在这时,粮食公司找了上来。
古希腊的哲学家曾预测当年风调雨顺,橄榄丰收,于是事先租下了所有的榨油机,并在橄榄收获季大赚一笔。而当代的粮食公司做着差不多同样的事,只是规模和赌注都大了许多。他们希望这个预测软件能够提供未来三个月的天气变化,好让粮食公司可以决定在什么时间用什么价格下注。
新手程序员乐观地认为这只是对现有软件的再应用,而老程序员则意识到事情没那么简单。要预测二十四小时后的天气,只需要就特定区域的气象数据进行建模,但要预测三个月后的天气,就需要将全球气候变化都纳入模型中统一考量。“天气算法”是局部的、片面的、不完整的,要预测长期变化,就必须换成整体化的思考方式。
为了说明这一点,一个擅长3d建模的程序员用粮食公司提供的天气数据做了一个全球的气候模型,只要戴上vr头盔,就能看到一个巨大的地球,这里风起云涌,那里电闪雷鸣。冰岛的火山爆发让整个欧洲上空笼罩着一片淡淡阴云并经久不散;上升的气温让北极的冰山融化,冰架断裂,冰山一路向南飘移;低温洋流形成的恢宏暗影横跨整个太平洋;洋流的末端,飓风成形进而横扫整个美国东部。
部分构成整体,而整体涵盖部分。现在是未来的缩影,而未来是现在的延伸。
论坛沉默了整整两个星期,然后一名程序员上传了自己的算法。这个注定被载入史册的算法开始平淡无奇,那名程序员简单地将其命名为“气候算法”。他声称使用了粮食公司提供的历史数据进行了训练,气候算法已经能够预测未来三个月的天气数据。然而,立刻就有好事者发现,这个算法居然预测一周后纽市会下一场鳟鱼雨。
物理学家们不相信算法能从混沌中找到精确,随即撰写了大量论文嘲笑程序员们的愚痴。但还没等论文刊载出来,鳟鱼就已从天而降,躺在曼哈顿的马路上奄奄一息。于是他们也丢了工作。
人们并不关心有物理学家丢了工作,因为绝大多数人一辈子也没见过一个活生生的物理学家。但挥舞着天气算法的大棒,在全球粮食市场兴风作浪的粮食公司,则是另一回事了。物理学家开始和气象学家争抢登上媒体平台的机会,控诉粮食公司为非作歹、程序员们助纣为虐。
这当然引起了绝大多数程序员的反感。于是在很短的一段时间里,气象学家和物理学家们使用的任何软件,从大型机里的数据处理软件到手机上运行的小游戏都极容易崩溃。
粮食公司们并没有开心多久。气候算法的设计理论很快发表在ieee的会刊上,甚至连用来训练算法的天气数据集都被人放到了github上——毕竟,程序员是这个世界上最缺乏理解、又最需要理解的群体。
各家软件公司纷纷抢入风口。在几个月的封闭开发后,各种大同小异的气候算法如雨后春笋般冒了出来。天气不再是无法解释的谜团,它变成了可以购买的订阅服务;变成了被免费推送的信息流;变成了直击眼球的垃圾短信。跟所有那些很重要,但泛滥到似乎没那么重要的东西一样,气候算法失去了人们的关注。风停了。一些公司破产,一些硬件设备被抛售,一些被逼着加班的程序员重获自由。
幸运的是,人类对算法的需求是无止境的。这一次轮到了大型仓储式超市。
超市经营者一直对市场占有率、商品流转率等数据斤斤计较,他们想知道顾客们到底想买什么、为什么买、怎么买,以便向顾客们推销更多商品,减少乏人问津却不得不设置的货架面积。他们向程序员们提供了某家超市三十万注册会员的全部信息,这些信息包括顾客访问商店的频次、购买的物品清单、使用信用卡还是现金付账、是否兑换了免费的停车券、是否在超市内的快餐店进餐等;而后又提供了通过非法途径获得的顾客的社保号、驾照编号、家庭住址。
程序员们首先尝试在这些纷繁芜杂的信息中建立关联,而最后得出的结果不过是在尿布边放啤酒、卫生巾边上放酵素减肥商品之类的建议。这令超市经理们开始担心这些投在gpu、内存条和水冷模块上的费用毫无意义。虽然这些电脑部件的价格因为天气算法竞争的崩盘而跌了不少,但超市经理可能是全世界最讨厌固定资产和折旧的一群人。
程序员们不得不去寻求新的解决方案。
他们在超市门口架设了一台摄像机进行人脸分析。每当有一名顾客来到超市,算法会自动将顾客的信息纳入数据库,或与数据库中已经存在的用户信息进行匹配。根据匹配的结果,算法将对他或她将要购买的商品进行预测。每天超市关门后,算法将在比对当天数万名顾客的预测结果和实际购物情况后,对算法进行修正,并在第二天开门前,按照修正后的算法再次进行预测。如是反复进行了三个月,算法对常客需求的预测准确率达到了百分之九十六,对非常客需求的预测准确率达到了百分之七十六。
但超市经营者需要的不是等顾客到超市就递过去一袋已经准备好的商品,而是尽可能让同样的一批人花更多的钱,买性价比更低的东西,并始终不渝地购买。这让程序员们感到束手无策,此前的算法只负责预测,不负责改变。算法不会告诉你掀起风暴的那只蝴蝶到底在哪里,到底是一只巴黎翠凤蝶还是一只黛安娜闪蝶;更不会告诉你从蝴蝶翅膀到风暴间到底有多少环节,它们如何一一改变,直至催生飓风。而超市经营者提出的要求则无异于让算法找出这只蝴蝶,让它在合适的时间、合适的地方扇动翅膀,掀起风暴。
一部分程序员更因此退出了项目,他们坚定地认为算法应当受人指挥,而非指挥人。剩下的程序员们挠了挠头,提出购买更大、更快的计算机。这得到了论坛成员们的一致赞同(就连那些退出项目的程序员都赞同了)——所有工作了十年以上的程序员都明白这么一个道理:与其绞尽脑汁向代码要效率,不如坐等硬件升级换代。按照摩尔定律,那些一直困扰着你的性能问题,自然会被更快的cpu和更大的内存解决。而同时,采购硬件是一个漫长的过程,程序员们由此获得了额外的时间来解决性能之外的问题。
一个大型计算中心在加州的荒芜海岸边拔地而起。拔地而起这个形容可能并不准确,因为所有的计算机都位于海底,拔地而起的是为设备供电的太阳能电池板和输电设备。至此程序员们已没有理由再推脱了,只能把算法丢进去,并祈求计算之神保佑。
计算中心运行了整整一个月。算法吞噬了所有用户信息、货架调整记录、定价和销量的历史数据,运算排出的大笔热量,导致这一区域的海水温度上升了零点一度,甚至部分延缓了季风季节的到来,让太平洋另一侧的安达曼海的渔民们获得了丰收,也让天气算法的预测准确度再次下跌了百分之零点一。
最后,运算得出了一个意义无法辩明的关系链。这个被命名为“超市算法”的新玩意儿给出了一条前所未有的复杂建议,从货架间距、物品的摆放顺序,再到价格标签的变化规律统统包含在内。其烦琐程度让超市经营者们无比信服,并立刻推动执行。位于纽约市郊区的一座大型超市进行了全面改造,引入了全自动的分货上架设备,以及能够快速调整价格的电子价签,超市重新开张后一个月内,净利润由原先的百分之零点五上升到了百分之三,并随着算法的不断调整和更新,一路朝着百分之五高歌猛进。
于是,超市经理们也加入了失业大军。
政客们终于注意到了这个小小的软件开发项目(对政客们来说,所有的软件项目都是小小的)。他们发来询问,能否在竞选领域引入算法。
部分程序员们退出了项目。他们并不介意算法为顾客买什么东西提出建议(因为大多数人确实需要建议),但非常介意算法为选民如何投票提出建议(选择哪一种可乐显然不如选择哪一个总统候选人重要)。而那些认为投票和买可乐一样重要,或者一样不重要的程序员接下了这个活儿。因为只要稍微研究一下就能发现,这些政客提出的需求只是对现有算法的简单复用。毕竟竞选与超市管理没有什么差别,其目的都是让顾客花更大的价钱买更廉价的东西,并且越买越多、越买越自信,不过是一种用钱买,一种用选票买。
程序员们开始给算法喂各种各样的数据,一部分数据,即民众的经济状况、消费情况,在为超市提供支持时已经获得过了,甚至连去除脏数据的工序都省了;而另一部分数据,即所有选民的政治立场、投票记录、犯罪记录、受教育程度、完整的报税清单、生育记录、亲缘关系和社会关系则由政客们提供。经过行政机器长达两个世纪的维护和整理,这些数据已非常精确而完备。导入的步骤并没有花多少时间,可生成的结果却出了问题。
竞选经理发来一封热情洋溢的邮件,称赞算法给出的建议非常明智,几乎是他们所能想象出来的、能够满足绝大多数选民意愿的最稳妥选择。但一个无可辩驳的稳妥选择却是毫无意义的。竞选者们需要的是在整个竞选过程中,能持续不断地获得最大关注和最多支持的无数个选择。
程序员们这才意识到问题所在,竞选不同于超市。
当顾客进入超市时,其购物欲望与其面对的货架摆放将直接导向结果——放进购物车或不放进购物车,这是个一次性判断。而竞选是一个持续演进的动态过程,是一个信息与反馈不断交织、直至最后以投票方式得出结论的长期过程。算法需要在这个长期的动态过程中,反复多次向选民提供信息,不断强化印象,直至选民投出那神圣的一票。
作者“《银河边缘》编辑部”的其他小说