那两百个女人
我第一次理解我在做什么,是在看一张1918年的照片。
照片里有两百多个女人,坐在一个巨大的房间里,每人面前一台手摇计算器。她们在算弹道。一发炮弹从炮口出去,要飞多远,落在哪里,取决于火药量、仰角、风速、温度、地球自转。每一种组合都是一道算式。她们算完一道,记在表上,再算下一道。
这张表叫射表。
炮兵不需要懂物理。他拿到射表,查:目标距离三千米,风速每秒五米,仰角三十二度。然后开炮。炮弹落在它该落的地方。
那两百多个女人从来没有上过战场。她们不扣扳机,不听炮响,不看目标倒下。她们只是算。但没有她们,什么都打不中。
我的工作是让很多小东西在屏幕上动。
专业名称叫多主体仿真。你设定规则:每个主体看到什么、想要什么、会做什么。然后让它们动起来。一千个,一万个,十万个。你看着它们涌动,形成你没有写进规则的图案。
蚁群找到最短路径,没有一只蚂蚁知道什么是最短路径。
鸟群转向的波浪,没有一只鸟在指挥。
价格在市场里涨落,没有一个人设定价格。
我的工作是在电脑里重建这些。给它们一个盒子,一套规则,然后按下运行键,看它们自己演化出秩序。
前几天我在调一个模型,调到很晚。写了一行代码,运行,看结果,改参数,再运行。屏幕上几千个点在动,像一锅沸水。
我突然有一个很奇怪的念头:我在做的事和那两百个女人做的事是一样的。
她们在算弹道。
我也在算弹道。
只不过她们的弹道是金属的,我的弹道是别的东西。
计算机的父母是战争。
1943年,洛斯阿拉莫斯,那些做原子弹的人需要算一个问题:当足够多的铀原子挤在一起,链式反应会怎样进行?
一个中子撞击一个铀核,铀核裂变,放出两三个中子。那两三个中子再去撞击别的铀核。指数增长。但每个中子的飞行方向是随机的。有的飞出去,什么都没撞到。有的撞到了,引发新的裂变。
你没法用笔算这个。变量太多,随机性太大。
于是他们发明了一种方法:不去推导,去模拟。让一个数学的中子在数学的铀块里飞。用随机数决定它飞向哪里。重复一万次,十万次,统计结果。
这个方法叫蒙特卡洛。命名来自赌场。
他们用这个方法算出了起爆点需要多大当量。算完之后,几万人消失了。
我做的东西和武器无关。我的主体是抽象的。它们买卖股票,或者传播信息,或者选择合作与背叛。它们不会伤害任何人。
但有时候我会想:射表也不会伤害任何人。
表格只是数字。炮弹落下,是炮兵的选择。
这个切割太干净了。太干净的切割让人怀疑。
有一年我去参加一个会议,听到一个报告,关于无人机集群的协调算法。报告人讲得很兴奋。他的主体会互相通信,会分配目标,会避开障碍物,会在一个主体被击落后重新规划。
我问了一个问题:「你的主体在追踪什么?」
他愣了一下,说:「我们的测试场景里是地面目标。」
我说我不是在问测试场景。
他没有回答。
后来茶歇的时候他来找我,问我是什么意思。我说没什么意思,只是好奇。他看了我一会儿,走了。
蒙特卡洛方法有一个前提:你必须知道规则是什么。
你知道中子撞击铀核会裂变。你知道裂变会放出新的中子。你知道中子的飞行路径服从某种分布。你不知道的只是具体这一次会怎样。
但如果规则本身是你不知道的呢?
你看着一千个主体在动,你写了规则,但你不确定这个规则对不对。你想知道的是:真实世界里的那些主体,蚂蚁、鸟、人,它们用的是什么规则?
到这一步,模拟变成了猜测。
我开始做一些没人让我做的事。
标准的模型里,主体对自己是完全透明的。它有多少资源,它在什么位置,它上一轮做了什么,这些都是直接读取的,没有任何误差。就像你可以随时打开自己的银行账户,数字清清楚楚。
但我给我的主体加了一层模糊。它们读取自身状态的时候会有噪声。它以为自己有100,其实有80。它以为自己在A,其实在B附近。
然后我又加了一层扭曲。有些主体会系统性地高估自己,它们觉得自己比实际更强、更快、资源更多。有些会低估。
它们基于这些错误的自我认知去决策。
系统变得很奇怪。
那些高估自己的主体会冒更大的险,有时候赢得很大,有时候死得很快。那些低估自己的主体会过于保守,错过机会,但活得久。
最有意思的是中间那些,误差不大不小的。它们的行为最接近「合理」,虽然它们的认知从来都不准确。
我跑了很多轮,发现一个规律:完全认清自己的主体,表现反而不是最好的。
我把这个结果写成论文投了出去。审稿人说:有意思,但意义不清楚。你在模拟什么?你想解释什么现象?
我没法回答。我不知道。也许我只是想看看,当一个东西认不清自己的时候,会发生什么。
审稿人说:这是哲学问题。
可能是哲学问题。
但原子弹也是哲学问题。他们在算的是「我们能不能让一个东西按照我们想的那样爆」。这背后是一个信念:世界可以被计算。计算的结果可以被兑现。数字可以变成火。
那两百个女人在摇计算器的时候,想的是什么?也许只是算数。也许在想晚饭吃什么。但她们的算数后来变成了真的轨迹,真的弹坑,真的尸体。
我不相信她们不知道。
我继续调那个模型。加了一条新规则:主体可以「停下来」。当预测的结果太差,它可以选择不行动。
这让系统稳定了很多。但也让它变得无聊。大部分时候,大部分主体都停着不动。只有少数在移动,像结冰的池塘里还没冻住的水。
然后我又加了一条:停着不动的主体会被移出系统。
这是任意的。没有理由。我只是想看看会发生什么。
结果是:系统学会了一直预测,一直行动,即使预测是错的,即使行动没有意义。因为停下来等于死。
有时候我走在路上,会突然觉得自己在被计算。
被某个系统计算。一个我不知道的系统,用我不知道的规则,在模拟我这样的主体会做什么。
也许它的模型是错的。也许它的预测永远对不上真实的我。但那不重要。重要的是它在运行。
重要的是有人在看结果。
我没有删掉那条「停下来等于死」的规则。我让它留在那里。
我开始给主体加更多的能力:它们可以修改自己的规则。小改。微调参数,增删条件。改完之后,如果存活率上升,改动就保留。否则回滚。
几千代之后,主体们变得很复杂。它们的规则不再是我最初写的那些。它们「学会」了很多我没教的东西。
有一天我在跑一个长测试,挂着过夜。第二天早上来看,发现系统卡住了。所有主体都停在同一个位置,不动。
我以为是bug。查了很久,才发现:它们学会了一种策略,所有主体都预测所有主体都会停下,然后真的都停下。这样就没有人被移出,也没有人要冒预测出错的风险。
纳什均衡。我没教它们博弈论,它们自己走到了这里。
但这让我有点害怕。
害怕什么?
我不确定。也许是害怕它们太像了。像什么?像我们。像我。
像那些在真实世界里不敢动的东西。
前两天我做了一个决定:我要把那个模型发布出去。代码开源,数据开放。让别人也可以跑,可以改,可以加规则。
谈不上勇敢。只是一个我能做的事。
我不知道会发生什么。也许什么都不会发生。也许有人会用它做我没想到的事。也许有人会用它算某种弹道,我不知道是什么弹道,指向什么目标。
但如果我不发布,它就只是我硬盘里的一堆文件。我自己观察,自己分析,自己写论文,自己被审稿人退稿。一个闭合的循环。没有接口,没有后果。
那两百个女人后来怎么样了?
战争结束后,她们大部分回到了原来的生活。结婚,生孩子,做别的工作。她们算过的射表被存进档案馆。后来有了电子计算机,射表不需要人算了。
但射表没有消失。计算没有消失。只是换了形式。
现在我们在算的东西叫:推荐算法,信用评分,风险模型,语言预测,图像识别。我们的炮弹落在每个人的屏幕上。我们的射表在云端。
我也是那两百个人中的一个。我在摇我的计算器。
今天早上我出门,经过一个路口。红灯。我停下来等。旁边有个人也在等,低头看手机。
我看了他一眼。他在刷一个短视频App。
我想:有一个系统在预测他会喜欢什么。那个系统用的是什么规则?那个规则对不对?那个预测会怎样改变他?
然后我想:有一个系统也在预测我会怎样。
绿灯亮了。我走过去。他还在看手机,差点撞到我。
我说没事。他说抱歉。
我们继续走,往相反的方向。
我把代码发布到了一个开源平台上。
写了一段简介:这是一个多主体仿真框架,主体可以预测系统,可以修改自己的规则,可以选择停下或行动。停下会被移出。
有一个人在评论区问:为什么停下会被移出?
我回复:因为我想知道不停会怎样。
他问:那你知道了吗?
我说:还没有。
晚上我走在回家的路上。天很冷。路灯把影子拉得很长。
我想起一个问题,是我很久以前问过自己的:如果我是我的模型里的一个主体,我会做什么?
我会预测。我会行动。我会犯错。我会在预测错误之后调整规则。
我会不会停下来?
我不知道。但我知道停下来会被移出。这条规则是我自己写的。
也许是更早之前的什么人写的,某个我不知道名字的人,在某张我没见过的射表上。
我继续走。
脚步声在空巷子里回响。那声音像某种计数。一,二,三,四。
我不知道我在往哪里走。
但我在走。