万物算法

THE ALGORITHMS FOR EVERYTHING.

dhew

程序员的终极梦想到底是什么

dhew,科幻作者,热血中年。虽出道甚早,但沉迷游戏以致荒废十年,不后悔,感谢游戏。如今在做自己的游戏(非科幻游戏),同时写作,写科幻小说。代表作《基因战争》。

那天我酒喝多了,好奇地问在场的一位程序员哥们儿:“这个社会对程序员有那么多的误解,你们是怎么坚持下来的?”

那哥儿们估计也喝多了,就给我讲了那个所有程序员都知道的故事。

一开始,只是有人想做个预报天气的软件。这人当然是个程序员,叫什么名字不重要。重要的是,他不想做那种给天气预报配点小清新照片就完事的手机应用。他想从零开始,从气温、风向、风速和云图入手,推测出接下来二十四小时的天气变化。他想要做个预报天气的软件。

程序员们很像手工匠人,天生喜欢从无到有做点什么东西出来。这个程序员也不例外。他从气象学的基本理论开始构建一个算法,我们姑且把它称为算法A吧。就像所有刚刚通过调试的软件一样,算法A出师不利:上线运行那天,气象局预报下午有雨,而算法A预报天晴。

程序员大多对自己开发的软件坚信不移,这名程序员也不例外,于是他被雨淋了个透湿。在反复审视自己的作品后,他把问题锁定在了算法上。并不是算法有问题,而是依据气象学的数学表达本身就不完备。但他没能力把这门科学再往前推进一步。他把源代码上传到Github ,并开了一个帖子,向其他程序员求助,有人回复说,没办法了,上机器学习吧。

和大众想象的不一样,程序员们对机器学习抱着一种爱恨交加的复杂感情。爱的是它让全世界的程序员们都出了次风头,恨的是它完全不符合程序员们习惯的思考方式。

机器学习的原理和小学生做数学习题的方式颇有共通之处。计算机做一道题,看一下答案,如果错了,就重做。它可能并无解题思路,甚至对题目想要考验的知识一无所知,但如此反复几百万遍后,计算机会得出一个正确率最高的解题方法,然后用这个方法快刀斩乱麻般解决所有类似问题。但问题在于,计算机无法向你解释这个方法到底是什么。它就在那里,你知道它存在就行了。就像一个魔法师的帽子,程序员们能从里面掏出兔子来,却无法解释这个帽子到底是连通了异次元还是怎么的。

引入机器学习后,算法的准确率大幅提升,气象局预测下雨时,算法预测为下冰雹;气象局预测天晴时,算法预测为高温警报。虽然看起来只是在气象局的结果上叠加了一个正态分布,但程序员知道这个算法已经踏上了正确的道路。训练三周后,算法在预测的即时性和准确度上就已经超过了气象局。程序员欣喜地将软件放到网上,为所有人免费提供未来二十四小时的天气预测,并在预测结果上加入了“更精准,更及时”的标题。气象学家们上电视宣称这是气象学理论推动了社会的进步和发展,而程序员只是适逢其会。

看完节目的程序员愤怒地将算法的代码开源了。立刻就有同仇敌忾的程序员跟进并重写了代码,剔除了依据气象学理论加入的基本原则和预测方法,直接使用机器学习由零开始构筑新的算法。这一次,项目获得了一个正式的命名:“天气算法”。

一开始,“天气算法”给出的结果惨不忍睹。它曾预测在撒哈拉沙漠正中央出现彩虹,或在印度洋的中心出现沙尘暴。但在两周的训练后,它就碾压了自己的前辈,不但准确率更高,而且需要的计算单位还更少。气象学家们被狠狠地扇了一巴掌,然而比名誉扫地更可怕的是,他们丢了工作。

程序员们隔着屏幕拍手庆贺。

就在这时,粮食公司找了上来。

古希腊的哲学家曾预测当年风调雨顺,橄榄丰收,于是事先租下了所有的榨油机,并在橄榄收获季大赚一笔。而当代的粮食公司做着差不多同样的事,只是规模和赌注都大了许多。他们希望这个预测软件能够提供未来三个月的天气变化,好让粮食公司可以决定在什么时间用什么价格下注。

新手程序员乐观地认为这只是对现有软件的再应用,而老程序员则意识到事情没那么简单。要预测二十四小时后的天气,只需要就特定区域的气象数据进行建模,但要预测三个月后的天气,就需要将全球气候变化都纳入模型中统一考量。“天气算法”是局部的、片面的、不完整的,要预测长期变化,就必须换成整体化的思考方式。

为了说明这一点,一个擅长3D建模的程序员用粮食公司提供的天气数据做了一个全球的气候模型,只要戴上VR头盔,就能看到一个巨大的地球,这里风起云涌,那里电闪雷鸣。冰岛的火山爆发让整个欧洲上空笼罩着一片淡淡阴云并经久不散;上升的气温让北极的冰山融化,冰架断裂,冰山一路向南飘移;低温洋流形成的恢宏暗影横跨整个太平洋;洋流的末端,飓风成形进而横扫整个美国东部。

部分构成整体,而整体涵盖部分。现在是未来的缩影,而未来是现在的延伸。

论坛沉默了整整两个星期,然后一名程序员上传了自己的算法。这个注定被载入史册的算法开始平淡无奇,那名程序员简单地将其命名为“气候算法”。他声称使用了粮食公司提供的历史数据进行了训练,气候算法已经能够预测未来三个月的天气数据。然而,立刻就有好事者发现,这个算法居然预测一周后纽市会下一场鳟鱼雨。

物理学家们不相信算法能从混沌中找到精确,随即撰写了大量论文嘲笑程序员们的愚痴。但还没等论文刊载出来,鳟鱼就已从天而降,躺在曼哈顿的马路上奄奄一息。于是他们也丢了工作。

人们并不关心有物理学家丢了工作,因为绝大多数人一辈子也没见过一个活生生的物理学家。但挥舞着天气算法的大棒,在全球粮食市场兴风作浪的粮食公司,则是另一回事了。物理学家开始和气象学家争抢登上媒体平台的机会,控诉粮食公司为非作歹、程序员们助纣为虐。

这当然引起了绝大多数程序员的反感。于是在很短的一段时间里,气象学家和物理学家们使用的任何软件,从大型机里的数据处理软件到手机上运行的小游戏都极容易崩溃。

粮食公司们并没有开心多久。气候算法的设计理论很快发表在IEEE 的会刊上,甚至连用来训练算法的天气数据集都被人放到了Github上——毕竟,程序员是这个世界上最缺乏理解、又最需要理解的群体。

各家软件公司纷纷抢入风口。在几个月的封闭开发后,各种大同小异的气候算法如雨后春笋般冒了出来。天气不再是无法解释的谜团,它变成了可以购买的订阅服务;变成了被免费推送的信息流;变成了直击眼球的垃圾短信。跟所有那些很重要,但泛滥到似乎没那么重要的东西一样,气候算法失去了人们的关注。风停了。一些公司破产,一些硬件设备被抛售,一些被逼着加班的程序员重获自由。

幸运的是,人类对算法的需求是无止境的。这一次轮到了大型仓储式超市。

超市经营者一直对市场占有率、商品流转率等数据斤斤计较,他们想知道顾客们到底想买什么、为什么买、怎么买,以便向顾客们推销更多商品,减少乏人问津却不得不设置的货架面积。他们向程序员们提供了某家超市三十万注册会员的全部信息,这些信息包括顾客访问商店的频次、购买的物品清单、使用信用卡还是现金付账、是否兑换了免费的停车券、是否在超市内的快餐店进餐等;而后又提供了通过非法途径获得的顾客的社保号、驾照编号、家庭住址。

程序员们首先尝试在这些纷繁芜杂的信息中建立关联,而最后得出的结果不过是在尿布边放啤酒、卫生巾边上放酵素减肥商品之类的建议。这令超市经理们开始担心这些投在GPU、内存条和水冷模块上的费用毫无意义。虽然这些电脑部件的价格因为天气算法竞争的崩盘而跌了不少,但超市经理可能是全世界最讨厌固定资产和折旧的一群人。

程序员们不得不去寻求新的解决方案。

他们在超市门口架设了一台摄像机进行人脸分析。每当有一名顾客来到超市,算法会自动将顾客的信息纳入数据库,或与数据库中已经存在的用户信息进行匹配。根据匹配的结果,算法将对他或她将要购买的商品进行预测。每天超市关门后,算法将在比对当天数万名顾客的预测结果和实际购物情况后,对算法进行修正,并在第二天开门前,按照修正后的算法再次进行预测。如是反复进行了三个月,算法对常客需求的预测准确率达到了百分之九十六,对非常客需求的预测准确率达到了百分之七十六。

但超市经营者需要的不是等顾客到超市就递过去一袋已经准备好的商品,而是尽可能让同样的一批人花更多的钱,买性价比更低的东西,并始终不渝地购买。这让程序员们感到束手无策,此前的算法只负责预测,不负责改变。算法不会告诉你掀起风暴的那只蝴蝶到底在哪里,到底是一只巴黎翠凤蝶还是一只黛安娜闪蝶;更不会告诉你从蝴蝶翅膀到风暴间到底有多少环节,它们如何一一改变,直至催生飓风。而超市经营者提出的要求则无异于让算法找出这只蝴蝶,让它在合适的时间、合适的地方扇动翅膀,掀起风暴。

一部分程序员更因此退出了项目,他们坚定地认为算法应当受人指挥,而非指挥人。剩下的程序员们挠了挠头,提出购买更大、更快的计算机。这得到了论坛成员们的一致赞同(就连那些退出项目的程序员都赞同了)——所有工作了十年以上的程序员都明白这么一个道理:与其绞尽脑汁向代码要效率,不如坐等硬件升级换代。按照摩尔定律,那些一直困扰着你的性能问题,自然会被更快的CPU和更大的内存解决。而同时,采购硬件是一个漫长的过程,程序员们由此获得了额外的时间来解决性能之外的问题。

一个大型计算中心在加州的荒芜海岸边拔地而起。拔地而起这个形容可能并不准确,因为所有的计算机都位于海底,拔地而起的是为设备供电的太阳能电池板和输电设备。至此程序员们已没有理由再推脱了,只能把算法丢进去,并祈求计算之神保佑。

计算中心运行了整整一个月。算法吞噬了所有用户信息、货架调整记录、定价和销量的历史数据,运算排出的大笔热量,导致这一区域的海水温度上升了零点一度,甚至部分延缓了季风季节的到来,让太平洋另一侧的安达曼海的渔民们获得了丰收,也让天气算法的预测准确度再次下跌了百分之零点一。

最后,运算得出了一个意义无法辩明的关系链。这个被命名为“超市算法”的新玩意儿给出了一条前所未有的复杂建议,从货架间距、物品的摆放顺序,再到价格标签的变化规律统统包含在内。其烦琐程度让超市经营者们无比信服,并立刻推动执行。位于纽约市郊区的一座大型超市进行了全面改造,引入了全自动的分货上架设备,以及能够快速调整价格的电子价签,超市重新开张后一个月内,净利润由原先的百分之零点五上升到了百分之三,并随着算法的不断调整和更新,一路朝着百分之五高歌猛进。

于是,超市经理们也加入了失业大军。

政客们终于注意到了这个小小的软件开发项目(对政客们来说,所有的软件项目都是小小的)。他们发来询问,能否在竞选领域引入算法。

部分程序员们退出了项目。他们并不介意算法为顾客买什么东西提出建议(因为大多数人确实需要建议),但非常介意算法为选民如何投票提出建议(选择哪一种可乐显然不如选择哪一个总统候选人重要)。而那些认为投票和买可乐一样重要,或者一样不重要的程序员接下了这个活儿。因为只要稍微研究一下就能发现,这些政客提出的需求只是对现有算法的简单复用。毕竟竞选与超市管理没有什么差别,其目的都是让顾客花更大的价钱买更廉价的东西,并且越买越多、越买越自信,不过是一种用钱买,一种用选票买。

程序员们开始给算法喂各种各样的数据,一部分数据,即民众的经济状况、消费情况,在为超市提供支持时已经获得过了,甚至连去除脏数据 的工序都省了;而另一部分数据,即所有选民的政治立场、投票记录、犯罪记录、受教育程度、完整的报税清单、生育记录、亲缘关系和社会关系则由政客们提供。经过行政机器长达两个世纪的维护和整理,这些数据已非常精确而完备。导入的步骤并没有花多少时间,可生成的结果却出了问题。

竞选经理发来一封热情洋溢的邮件,称赞算法给出的建议非常明智,几乎是他们所能想象出来的、能够满足绝大多数选民意愿的最稳妥选择。但一个无可辩驳的稳妥选择却是毫无意义的。竞选者们需要的是在整个竞选过程中,能持续不断地获得最大关注和最多支持的无数个选择。

程序员们这才意识到问题所在,竞选不同于超市。

当顾客进入超市时,其购物欲望与其面对的货架摆放将直接导向结果——放进购物车或不放进购物车,这是个一次性判断。而竞选是一个持续演进的动态过程,是一个信息与反馈不断交织、直至最后以投票方式得出结论的长期过程。算法需要在这个长期的动态过程中,反复多次向选民提供信息,不断强化印象,直至选民投出那神圣的一票。

幸好在解决天气问题时,程序员们已经找到了解决问题的办法。他们结合了“天气算法”和“超市算法”,获得了一个新的、能够在一个动态系统内主动给出操作建议、从而影响远期结果的算法,并毫无创意地将这个算法命名为:“竞选算法”。

“竞选算法”的上线,除了导致大批竞选经理失业外(没人真正喜欢竞选经理),还将竞选彻底变成了金钱游戏。那些能够租用大型计算中心运行算法的竞选者天然具有优势。而当所有参选者都希望租用计算中心以获得算法支持时,计算中心的租用价格自然水涨船高。于是,很多参选者从算法中获得的第一条建议,是放弃寻求算法的支持,把省下来的钱拿去投放广告。这一建议的明智之处立刻获得了所有人的理解和认同,进一步加强了参选者对政治算法的渴求。

于是,全球所有的互联网用户都不得不面临这样的窘境——只要有大型竞选开锣,用于支持整个互联网运转的计算资源,就立刻被“竞选算法”剥去一大半;而剩下的计算资源经过垃圾邮件、黄色视频、在线游戏和购物网站的盘剥后,只剩下“指甲盖”大小的一丁点。幸好绝大部分互联网用户只需要视频、游戏和购物,而剩下的那些,没有互联网也能生存。

第一位依赖算法竞选的政客登上总统宝座后立刻推动立法,禁止在政治领域内应用算法。这一立法虽然获得了政客们的一致支持,却只导致了政治算法的完全地下化。由于资源配置的不公开和不透明,在大选期间租用计算中心的价格如火山爆发般攀升。互联网能够使用的计算资源被进一步挤占,差点连那“指甲盖”大小的一丁点都不复存在。这让习惯了利用冗余资源跑一点自己的小项目的程序员们不得不反思这样一个问题:算法的存在,到底意味着什么?

一部分程序员不再相信“算法是中立的”,因为算法是一个威力巨大的武器,什么人会需要威力巨大的武器呢?当然是邪恶之人。为邪恶之人铸造武器的人,当然也是邪恶的。

另一部分程序员认为,前者纯粹是漫画看多了。粮食公司利用算法操纵粮食市场,农民也可以借助算法对抗天气灾害;政客们凭借算法登上权力顶峰,选民也可以使用算法厘清竞选黑幕。程序员无法决定什么人、为什么使用算法,但可以决定用算法来解决什么问题。

还有一部分程序员发出无情的冷笑——你们真的能决定用算法来解决什么问题?

这让所有人都陷入了沉默。

说实话,成形的算法已经不是任何人都能理解的了。它像一个由无数根小钢棒构成的黑箱子,上面有一个小孔,从小孔里丢下一个小钢球,小钢球一边朝下坠落,一边撞击小钢棒并改变方向,直至最后落进“大雾”“鳟鱼雨”“在泡椒凤爪边上放啤酒”“针对亚裔移民投放一个与教育有关的广告”之类的小格子里。程序员们只是设计了这样的一个黑箱子,然后让算法自己去调整钢棒。他们也不知道每一根钢棒的具体位置,更不知道算法是如何调整这些钢棒的。从引入机器学习让计算机自行生成算法那一刻起,程序员们就已经无法理解自己的造物了。

但它毕竟是我们创造出来的。不是吗?

最后,一小部分程序员跳了出来。他们认为开发一个算法的真正意义,不在于这个算法的运行机制到底是什么,也不在于要用这个算法去解决什么问题,而在于这个算法本身所具有的可能性。这种对可能性的探索,才是这个项目的真正意义所在。

就好像一座山在那里,难道因为你不知道为什么会有这座山、不知道登上山顶会怎样,所以就不去攀登了吗?

虽然程序员们可能是世界上离登山最远的一群人。但这个观点却得到了全体程序员的一致赞同。在一片欢呼中,程序员们提出了一个宏伟的计划,要开发一个囊括世间万物的算法,将物质的流转、人的取舍都放入这个巨大的黑箱。他们不再纠结于一个不可知的黑箱是不是对程序员尊严的挑战,也不再考虑是否会有人使用这个黑箱为非作歹。他们认为,只要把这个黑箱做出来,剩下的事都可以之后再考虑。

这个“万物算法”的项目,开始通过邮件组、博客、论坛在程序员间传播,并逐渐变得清晰起来。

当然,这个算法不会去预测原子在碰撞五十次之后的位置之类的问题。一方面,现有计算资源的总和都不足以解答这个问题,另一方面程序员需要的是在不可预测之上的可以预测,是基于混沌系统之上的规则和结论。

这个项目不考虑从微观态反推宏观态,而是直接向宏观世界寻求规律。

就连那些从未接触机器学习的程序员,也被这个计划所吸引。抛开职业分野(是的,程序员也是有职业分野的)和知识鸿沟(是的,程序员并不是都会修电脑),他们单纯地对这个项目感到好奇,并寄望于通过这个项目为自己的职业生涯赋予意义。他们相信万物算法的开发成功,意味着程序员们终于能坦然面对身边纷繁芜杂的现实世界,毕竟除了他们,没有谁能将整个世界握在手中,而又不为人所知。

为了推进这个计划,程序员开始攫取一切能弄到手的运算资源。他们以各种名义向全球所有计算中心提交运算任务。在所有色情网站和垃圾页游上植入木马以获得观看者的本地计算资源。他们甚至违背原则发送了大量的垃圾邮件,将许多贸然点开链接的用户的电脑变成并网计算用的肉鸡 。只是,在是否挤占在线游戏服务器的问题上,他们发生了争论。部分程序员以退出整个计划作为威胁,才为《魔兽世界》留下了百分之五十的运算性能。

于是,几乎所有的计算机——埋在水底的超级计算机、咖啡馆里的苹果笔记本、亚马逊的在线服务器,甚至连高中生们课间偷偷打开的手机,都被卷进这一宏大而近乎无止境的运算中。它们耗费的电能和额外制造的热量,不但让一些运行不良的电网走向崩溃,更让天气算法的远期预测结果出现了接近百分之十五的偏差。

计算机运行速度变慢、总是断网、视频疯狂卡顿之类的抱怨充斥了整个互联网。而程序员对此缄默不语,或者以此为由要求建造更多更大的计算中心。一部分从程序员转行的产品经理注意到前同行们的疯狂举动,然而在他们得出结论或发出警报前,就已经被灭了口。当然不是物理毁灭,只是他们登入的网站被断开连接,发出邮件被告知收件人不存在,打电话总不在服务区。他们在绝望中拍下的“疯狂程序员想要统治整个世界”的警告视频,倒是被几名程序员传到了网上,作为人畜无害的程序员屡次被迫害的证明供人一笑。

计算似乎永无休止,害得全球互联网在崩溃边缘擦擦蹭蹭数次。当程序员们开始怀疑自己是否不小心按下了那个毁灭世界的按钮时——算法生成了。程序员们按照其不同的宗教信仰,对这一刻进行了描述,从“hello world” 到“越过长城,走向世界” ,从“我是alpha,也是omega” 到“天上地下,唯我独尊”,从“Armageddon ”到“42” ,不一而足。然而直到这时,他们才发现了一个尴尬的问题:

我们要用这个算法干什么?

当然,它能回答一些诸如“明年的总统会是谁”“南美的雨林会不会在五十年内消失”“未来十年东京的房价走势如何”之类的问题,但程序员们其实并不真正关心这些问题。

经过了争辩、论战、不记名投票、刷票、加入防作弊机制并重新投票后,第一个提交算法的问题是:“什么是最好的编程语言?”

算法回答:“请定义好。”

在长久的争论后,程序员们放弃了这个问题。

第二个提交给算法的问题是:“现存的哪些编程语言会在二十年内被抛弃?”

算法回答:“全部。”

程序员们再次沉默。部分程序员建议投票决定是否干掉这个算法,而一些不死心的程序员则提出了第三个问题:

“现存什么编程语言寿命最长?”

算法回答:“汇编。”

于是,大多数程序员都投票赞成干掉这个算法。只有少数经常跟底层打交道的觉得这个算法仍有存在价值。

第四个问题是:“为什么汇编语言寿命最长?”

这个问题,显而易见,是那些不使用汇编语言的程序员提出的。

算法回答:“教学。”

在其他程序员的哧哧笑声中,汇编语言的使用者们也投下了赞成票。

于是,这个诞生没多久的万物算法,在回答了四个问题后就被关闭了,其核心代码被压缩成一个大小为32.17T的压缩包,所有被挤占的计算资源都还给了计算中心、个人电脑、游戏机和手机。互联网松了口气,又开始苟延残喘。

程序员们又开始响应需求——绝大部分是一些被重复过无数次的、没有挑战的需求,例如电脑蓝屏了、网络连不上了、这个页面要改一下、新的苹果手机无法适配了之类的。一小部分是尝试解决某个特殊领域内已经被解决过但解决方案并没有被放到网上的问题。只有很小一部分,是关于效率的提升、资源的最优化配置,关于生产力的解放。

程序员们坦然接受了这一切。

他们从未想过要解开那个压缩包。

他们曾登上世界之巅,所以能心平气和地走在马路上。

本文为《银河边缘》中文版专发篇目。