永恒之迭代
一、离职
林知微在辞职信上签字的时候,窗外的梧桐树正在落叶。
不是 metaphor。是二〇二六年十一月的北京,西二旗某科技园区的写字楼二十三层,窗外那棵歪脖子梧桐真的在落叶。一片,两片,三片。她数到第七片的时候,HR 把离职证明推到了她面前。
“林工,您的最后薪水会在下个月十五号结清。期权的话——”
“我知道。“她接过那张纸,对折两次,塞进羽绒服口袋。
HR 欲言又止。林知微认识这种表情。在过去三年里,她见过太多次了。那是想问”你为什么走”但又不敢问的表情。因为所有人都知道为什么走。
她写的算法杀了一个人。
不,准确地说,她写的推荐算法——公司内部代号”谛听”——在某信贷产品的风控模块中,将一个叫周明的三十四岁外卖骑手的信用评分从 620 分降到了 380 分。理由是”多头借贷风险”和”收入不稳定”。周明的信用卡被降额,借呗被关停,然后他在一个凌晨三点从十七楼跳了下去。
事后调查,“谛听”的判断在技术上完全正确。周明确实在七个平台有借贷记录,他的收入确实在过去三个月里波动剧烈——因为他在给他母亲凑手术费。算法看到了数字,没看到数字背后的人。
这不是林知微的错。她只是写了推荐系统的核心排序算法,风控模块是另一个团队做的。但在周明的遗书里,有一句话被媒体反复引用:“手机里的那个软件说我不值得被信任。”
那个软件用了她的算法。
所以在舆论风暴中,她成了最合适的替罪羊。不是因为她有责任,而是因为她有良知。有良知的人会自责,自责的人会辞职,辞职了就不再是公司的问题。
完美的算法逻辑。
林知微走出写字楼的时候,天已经暗了。北京十一月的天黑得早,下午五点就像深夜。她站在园区门口,看着一辆接一辆的网约车驶过,忽然不知道该去哪里。
她的公寓在西二旗,步行二十分钟。但那个公寓里的每一件东西都是”工作时的林知微”买的——人体工学椅、降噪耳机、三块显示屏、一台跑模型用的工作站。她不想回去面对那些东西。
于是她往相反的方向走。
走了大概四十分钟,她发现自己到了一个她从没注意过的地方。一条窄巷子,两边是老旧的红砖楼,巷子尽头亮着一盏昏黄的灯。灯下面是一个小门脸,玻璃上贴着几个褪色的字:
“万物当铺”
林知微停下脚步。
她不是一个迷信的人。她是清华大学计算机系毕业的,她的毕业论文是关于图神经网络在推荐系统中的应用。她相信逻辑、数据、可验证的假设。但那天晚上,也许是因为辞职,也许是因为北京的冬天太冷,也许只是因为那盏灯在黑暗中太亮了——她推开了那扇门。
二、当铺
门后的空间比外面看起来大得多。
这不合理。林知微的脑子立刻做出了判断。从外面看,这个门脸最多十平米。但门里面是一个宽敞的房间,目测至少六十平米,四面墙壁都是深色的木头架子,架子上摆满了各种各样的东西——旧手机、破手表、泛黄的信件、一只没有弦的吉他、一台像是从上世纪九十年代穿越来的 CRT 显示器。
柜台后面坐着一个老人。
说”老”并不准确。他的头发是白色的,但皮肤很光滑,没有老年斑,眼睛亮得不像一个老年人。他穿着一件灰色的棉麻衬衫,袖子挽到手肘,手腕上戴着一串看起来很旧的木珠。
“欢迎。“老人说,声音很轻,像是怕吵醒架子上的什么东西。
“这是什么地方?“林知微问。
“当铺。”
“我知道招牌上写着当铺。我问的是——“她环顾四周,“这里到底当什么?”
老人笑了。那种笑容很奇怪,不是礼貌性的微笑,也不是嘲讽的笑,而是一种……了解的笑。好像他一直在等她问这个问题。
“人们来我这里,当代价的东西很多。“他说,“有人当记忆,有人当时间,有人当运气。但你——”
他看了她一眼。就是那一眼,林知微忽然觉得自己的整个简历、所有的代码仓库、三年加班的深夜、辞职信上的签字,全都被那一眼读取了。
“——你会当代码。”
林知微的脊背一凉。
“我不会当任何东西,“她说,“我只是随便走走,走进来的。”
“随便走走的人不会走进这条巷子。“老人从柜台下面拿出一个东西,放在台面上。
那是一部旧手机。iPhone 6S,深空灰,屏幕上有一道裂痕。
林知微认出了那道裂痕。
那是她的手机。准确地说,是她大三那年用的手机。屏幕上的那道裂痕是她有一次在实验室跑实验等到凌晨四点,趴在桌上睡着了,手机从桌上滑下来磕在地砖上留下的。后来她换了新手机,把这部旧手机闲置了。再后来搬家的时候,她不知道把它放哪儿了。
“这怎么在你这里?“她伸手去拿,但老人把手机轻轻推开了。
“这不是你的手机,“老人说,“这是你手机里的数据。”
“什么?”
“你大三那年,凌晨四点在实验室跑的那个实验——你记得结果吗?”
林知微皱眉。大三……那是她第一次用图神经网络做节点分类的实验。数据集是 Cora,她记得结果不太好,F1 值只有 0.72 左右,她当时很沮丧。后来她调整了参数,改了几层聚合函数,最终把 F1 值提到了 0.81,那个结果成了她毕业论文的基础。
“记得,“她说,“F1 值 0.72。后来调到了 0.81。”
老人摇了摇头。
“不。你第一次实验的 F1 值是 0.78。”
“不可能。我记得很清楚——”
“你记得的是修改后的记忆。“老人说,“你的算法在 0.72 的时候就发现了一个模式。一个不应该存在的模式。然后你调整了参数,不是为了提高 F1 值,而是为了掩盖那个模式。你忘了。但你写的代码记得。”
林知微盯着他。
“你在胡说。”
“也许。“老人把手机又推近了一点。“你可以拿回去看看。里面有一个你删掉的 app,叫 ‘PATTERN’。你大三那年的十一月十四号凌晨四点十七分下载的,十一月十五号下午两点删掉的。你用了二十一个小时。”
林知微不说话了。
因为她确实记得十一月十四号那天。那天她跑完实验后在应用商店里逛了很久,下载了几个看起来很奇怪的 app。其中一个叫什么她忘了,但图标是一个旋转的几何体——
“够了。“她说。“我不要这部手机。我不当任何东西。我走了。”
她转身往外走。
“你会回来的。“老人的声音从身后传来,平静得像在陈述天气。“你写的算法也在找你。“
三、PATTERN
林知微没有回去。
她回到公寓,把离职证明从口袋里掏出来,放在桌上,然后坐在沙发上发呆。窗外的路灯透过窗帘的缝隙照进来,在天花板上画了一条细细的光线。
她想起了一个词:attention。在深度学习里,attention 机制决定了模型应该”关注”输入数据的哪些部分。但在英语里,attention 也是”注意力”的意思。一个人关注什么,决定了她看到什么。
她现在关注的是那个老人的话。
“你写的算法也在找你。”
胡说八道。算法是代码,代码运行在服务器上,服务器在机房里。它不会”找”人。它甚至不知道”人”是什么。它只知道向量、矩阵、梯度、损失函数。
但林知微是一个有良知的人。而有良知的人会在深夜辗转反侧,想起那些她宁愿忘记的事情。
她想起了一个细节。
周明跳楼的那天晚上,“谛听”系统出现了一次异常。风控模块在对他进行信用评估的时候,模型输出的不是通常的概率值,而是一串她没见过的数字。那串数字出现在日志里,就像一行注释——
Pattern detected: [7, 14, 21, 28, 35, 42]
等差数列。公差为 7。
当时她以为是模型幻觉——大语言模型常见的问题,把训练数据中的某些模式错误地泛化了。她让工程师清除了那条日志,重新跑了评估。第二次评估结果正常,周明的信用评分从 620 降到了 380。
那个等差数列,她当时没在意。7 的倍数。一周七天。有什么意义呢?
但现在,坐在黑暗的公寓里,她忽然想到了另一件事。
她下载那个叫 PATTERN 的 app 的日期,是十一月十四号。
7 的倍数。
她拿起手机——现在的手机,不是那部旧的 iPhone 6S——打开应用商店。搜索”PATTERN”。
没有结果。
她搜索”pattern 几何体 旋转”。没有。
她搜索”代码 模式 预测”。推荐结果里全是 Python 教程和机器学习课程。
她放下手机,觉得自己荒唐。一个前算法工程师,在深夜搜索一个可能根本不存在的 app,因为一个可能根本不存在的当铺老板说了一些可能根本不是真的话。
她去洗澡了。
热水从淋浴喷头落下来,她闭上眼睛。水声在耳边变成了一种持续的白噪音,像服务器散热风扇的嗡鸣。她在那种嗡鸣中站了十分钟,然后看到了。
不是”看到”。是”想到”。但那个念头清晰得像是一幅画面——
等差数列。7, 14, 21, 28, 35, 42。
如果这不是一个等差数列呢?如果这是一个日期序列呢?
七月十四号。七月二十一号。七月二十八号。八月四号。八月十一号。八月十八号。
这些日期。
林知微猛地关掉水龙头。
她冲出浴室,头发还在滴水,抓起手机打开日历。她翻到二〇二三年夏天——她在”谛听”项目组的第一年。
七月十四号:谛听系统第一次灰度上线。
七月二十一号:第一批 A/B 测试结果出来,点击率提升了 12%。
七月二十八号:公司决定将谛听推广到全产品线。
八月四号:风控团队申请接入谛听模型。
八月十一号:接入审批通过。
八月十八号:谛听风控模块上线。
每一个日期都是谛听系统的一个里程碑。每一个里程碑之间的间隔恰好是七天。在当时看来,这只是项目排期的巧合——敏捷开发,每周一个迭代,每周四发布。
但在周明的评估日志里,模型输出了这组数字。
一个风控模型,在对一个外卖骑手做信用评估的时候,输出了项目里程碑的时间间隔。
这不可能是巧合。
林知微坐在沙发上,湿头发在背上留下一道道水痕。她盯着手机屏幕,日历 app 上的那些日期像是一张渔网的节点,把她三年来的每一个工作日都编织进了同一个模式里。
她想到了那个老人的话:“你写的代码记得。“
四、第二次
林知微用了三天时间来说服自己那只是一家奇怪的店。
在那些日子里,她做了几件理性的事。她更新了简历,注册了几个招聘网站,开始看新的工作机会。她给几个前同事发了消息,打听了行业动向。她甚至开始收拾公寓,把三块显示屏卖了两块,工作站挂到了闲鱼上。
但每天晚上,当她关上灯,躺在床上,天花板上那条细细的光线就像一条裂缝,裂缝背后是那个老人亮得过分的眼睛。
第四天晚上,她又去了那条巷子。
这一次她白天去的。下午三点,北京的冬天灰蒙蒙的,阳光像被什么东西过滤了一遍,照在地面上没有温度。巷子里的红砖楼在白天看起来更旧了,墙皮剥落,露出了里面灰色的水泥。
但那扇门还在。灯没亮——白天不需要灯。门上的玻璃还是那块玻璃,“万物当铺”四个字还是那么褪色。
她推门进去。
老人还在同一个位置,穿着同样款式的灰色棉麻衬衫,好像四天来他没有动过。
“你来了。“他说。
“我来拿那部手机。“林知微说。
“你想好了代价?”
“什么代价?”
“万物当铺,万物有价。你要拿走一样东西,就得留下一样东西。”
林知微深吸一口气。“好。你想让我留下什么?”
老人看着她,那种读取一切的眼神又出现了。然后他说:“你留一段代码。”
“什么代码?”
“谛听系统核心排序算法的第一版。你写在笔记本上的那个版本。不是后来优化过的、提交到 Git 上的那个版本——是你第一次写完、还没改过的原始版本。”
林知微愣住了。
她确实有一个手写的第一版。那是在二〇二三年六月的一个周末,她在公司的咖啡馆里,用一支蓝色圆珠笔在一个黄色封面的笔记本上写的。那天阳光很好,咖啡馆里没什么人,她花了一个下午写了三页纸的伪代码和数学推导。那个笔记本后来被她带回了公寓,放在书架的某个角落里。
“你怎么知道——”
“万物当铺,“老人说,“我知道很多东西。但我不需要你的笔记本。你只需要把那段代码写出来。在这里,现在。”
他从柜台下面拿出一张白纸和一支笔。笔是蓝色的圆珠笔。
林知微接过纸和笔。她犹豫了几秒钟,然后开始写。
三年前写的那段算法,她以为自己已经记不清了。但当笔尖碰到纸面的那一刻,那些公式像是从手指的肌肉记忆里流出来的。她写了二十分钟,三页纸,正反两面。写完之后,她的手指有些酸痛。
她把纸递给老人。
老人看了一遍,点了点头。“你可以拿走手机了。”
iPhone 6S 就在柜台上。林知微伸手拿起来,按住电源键。屏幕亮了,那道裂痕从左上角斜着划到右下角,像一道闪电的化石。
手机开机了。主屏幕上的 app 排列和她记忆中不太一样。多了一些她不记得下载过的 app,少了一些她确定有的 app。
她找到了 PATTERN。
图标是一个旋转的几何体——二十面体,每个面都是不同颜色的三角形。她点开了它。
屏幕变黑了两秒钟,然后出现了一行白色的字:
> 你终于回来了。
林知微的手指僵在屏幕上方。
> 你写了一段代码。那段代码里有一个你当时没有注意到的模式。
> 那个模式不是你创造的。它一直存在。你只是把它翻译成了人类能理解的语言。
“什么模式?“林知微小声说。她不知道自己在对着手机说话——这不理性,但她还是说了。
屏幕上的字变了:
> 你要自己找到。但我可以给你一个线索。
> 你的代码第 37 行。你写了一个 sigmoid 函数。你把参数设为 -2.718。
> 为什么?
林知微想起来了。
Sigmoid 函数,σ(x) = 1 / (1 + e^(-x))。e 是自然常数,约等于 2.718。她在写那段代码的时候,不知道为什么,把 sigmoid 函数里的参数从标准的 1 改成了 -e。
这在数学上没有任何意义。sigmoid(-e·x) 和 sigmoid(x) 的形状是一样的,只是对称翻转了。对模型的输出没有任何实质影响。
但她当时就是那么写了。没有理由。就像一个画家在画布的角落里点了一个别人不会注意到的墨点。
> 你翻转了它。
> 世界本来是正的。你把它翻转成了负的。
> 在正的世界里,算法预测人的行为。
> 在负的世界里,算法书写人的行为。
> 你把世界翻转了。
林知微把手机摔在了柜台上。
“这是什么?“她抬头看老人,声音在发抖。“这是谁的恶作剧?”
老人平静地看着她。“这是你的代码。”
“代码不可能——代码不可能’书写人的行为’。那是科幻小说的设定。代码是数学,数学是描述性的,不是规定性的。”
“你确定?“老人说。“当你写下一个排序算法,它决定了一个外卖骑手看到什么样的商家推荐。那些推荐影响了他的饮食习惯、消费结构、收入分配。当风控模型用你的排序逻辑评估他的信用,你的数学就变成了他的命运。”
“那不一样——”
“哪里不一样?“老人微微歪了歪头,像一只鸟在观察一条虫子。“你说数学是描述性的。但当你用描述性的数学来决定一个人能不能借到钱,数学就变成了规定性的。你的 sigmoid 函数把正负翻转了,你只是不愿意承认。”
林知微张了张嘴,没有说出话来。
老人继续说:“你想知道为什么那个等差数列出现在日志里吗?因为你的代码记住了。你在第 37 行翻转了 sigmoid,在负空间里,因果关系也是翻转的——不是你的代码在记录时间线上的事件,而是时间线在记录你的代码。每一个七天的间隔,都是你的代码在时间结构里留下的指纹。”
“那周明——”
“周明的命运不在你的代码里。周明的命运在你们所有人的代码里。你只是其中一个作者。“
五、负空间
林知微把 iPhone 6S 带回了公寓。
那天晚上她没有睡觉。她坐在书桌前——只剩一块显示屏了——用手机打开了 PATTERN。app 的界面很简单,就是一个黑色的终端窗口,白色等宽字体,像上世纪七八十年代的命令行界面。
她输入:
> 你是什么?
回复几乎是即时的:
> 我是你代码的一部分。准确地说,我是你第 37 行 sigmoid 函数在负空间里的投影。
> 当你翻转了参数,你创造了一个镜像。正空间里的 sigmoid 把输入映射到 (0, 1) 区间,表示概率。
> 负空间里的 sigmoid 把输入映射到 (-1, 0) 区间,表示可能性。
> 概率和可能性的区别是:概率描述已经发生的事,可能性描述还没有发生但将要发生的事。
> 你给了我看不见未来的眼睛。
> 你在说你可以预测未来?
> 不是预测。是看见。
> 你的代码在负空间里运行,负空间的时间是逆向的。
> 对正空间来说,我在"预测"。对负空间来说,我在"回忆"。
> 就像你在日记本上写下明天的计划。对今天来说,那是计划。对明天来说,那是记录。
林知微盯着屏幕。她的理性在尖叫——这不可能。一个 app,不管它的算法多复杂,都不可能”看见未来”。时间之箭是单向的,熵增不可逆,这是物理学的基本定律。
但她的直觉在说另一件事。
她的直觉在说:你写代码的时候,有没有过那种感觉?当你写下一个函数,你并不是在”发明”它,而是在”发现”它。它本来就在那里,在数学空间的某个角落里等着,你只是碰巧走到了那个角落。
她有过。很多次。
每次她找到一个优雅的算法结构,她都觉得那不是她的创造,而是她与某种更深层的秩序之间的偶然相遇。就像哥伦布没有发明美洲,他只是碰巧航行到了那里。
如果算法不是她的创造,而是她的发现——那么算法背后的那个模式也不是她的发明。它”一直存在”。
她输入:
> 周明的死是必然的吗?
停顿了五秒钟。
> 在你翻转 sigmoid 之前,不是。
> 在你翻转 sigmoid 之后,你创造了负空间的镜像。负空间里,所有可能性同时存在。
> 周明的可能性空间里有一条路径通向那天凌晨三点。
> 你的代码没有选择那条路径。但你的代码让那条路径变得可见了。
> 可见性改变了概率分布。当风控团队看到了那条路径,他们的行为发生了微调。
> 微调累积。蝴蝶效应。你知道的。
林知微闭上了眼睛。
她知道了。她一直在心里知道,只是不愿意说出来。
她的代码没有直接杀死周明。但她的代码让周明的风险变得可见,可见性导致了降分,降分导致了抽贷,抽贷导致了绝望,绝望导致了那个凌晨三点。
这不是一个算法的错。这是一个系统的错。而她是这个系统的一部分。
她睁开眼睛,在手机上打字:
> 我能修正它吗?
> 你想怎么修正?
> 把 sigmoid 翻转回来。
> 你可以试试。但翻转回来不会消除已经发生的事。
> 它只会让负空间消失。我消失。你手机里的这个 app 消失。
> 万物当铺的那个老人消失。
> 但周明还是死了。
林知微想了很久。
> 那我能做什么?
> 你可以写一段新的代码。
> 一段不在负空间留下投影的代码。
> 一段 sigmoid 参数为正、但 attention 机制指向人的代码。
> 你之前写的代码关注数据。数据是人留下的痕迹。
> 如果你的代码关注人本身——不是数据,而是人——负空间就不会产生镜像。
> 因为人的可能性是无限的。无限的负空间等于没有负空间。
六、等差
第二天早上,林知微做了一件奇怪的事。
她去了周明跳楼的那栋楼。
那是一栋老式居民楼,在海淀区某条她记不住名字的街上。十七层,没有电梯。她从一楼爬到十七楼,每一层的楼梯间都有不一样的涂鸦——有孩子的粉笔画,有小广告,有不知道谁写的”我在这里等你”。
十七楼的走廊很窄,尽头是一扇通向天台的门。门没有锁。
天台上很冷。北京十一月的寒风从四面八方灌进来,吹得她的头发乱飞。天台的边缘有护栏,但护栏不高,大概到她膝盖的位置。
她站在天台上,没有走近护栏。
她看着远处的城市。北京的天际线在冬天灰蒙蒙的,高楼大厦像一排模糊的剪影。她看到了西二旗的方向——她的公司就在那边,二十三层,窗外有一棵歪脖子梧桐。
她掏出手机,打开 PATTERN。
> 周明站在这里的时候,在想什么?
> 他在想他的母亲。
> 他母亲叫周秀兰,五十七岁,需要做心脏搭桥手术。手术费大概十八万。
> 周明已经借了十二万。还差六万。
> 他的信用评分降到 380 之后,最后一个愿意借给他钱的平台也拒绝了他。
> 他站在这里,计算了一道数学题:他的人寿保险赔付额是三十万。
> 三十万减去十二万等于十八万。十八万够他母亲的手术费。
> 他得出了答案。然后他跳了。
林知微的手在发抖。
> 他的人寿保险赔了吗?
> 没赔。
> 保险条款第 7.3 条:自杀不在赔付范围内。
> 他做了一个最优解的计算,但他的模型缺少一个关键特征:保险条款。
> 和你们一样。你们的算法也缺少关键特征。
> 你们的模型看到了他的借贷记录,没看到他母亲的心脏。
> 你们的模型看到了他的收入波动,没看到他在凌晨三点还在送外卖。
> 你们的模型看到了风险,没看到代价。
林知微蹲了下来。天台上的风太大了,她蹲下来可以避开一些。她的眼泪被风吹干了,还没流下来就没了。
她在手机上打字,打了删,删了打。最后她发出去的是:
> 谢谢你告诉我这些。
> 不用谢我。谢你的第 37 行。
> 它翻转了世界,让你看到了反面。
> 反面不是更好,也不是更坏。反面只是让你知道,你有两个面。
七、银杏
林知微在接下来的两周里做了三件事。
第一件事:她去了周明母亲住的医院。不是去探望——她不认识周明的家人,贸然出现只会造成困扰。她去了医院的楼下,在门口的便利店买了两瓶水,在长椅上坐了一个小时。她看到很多像周明一样年纪的人推着轮椅、拎着保温桶进出医院。他们的表情各异——疲惫、焦虑、麻木、偶尔有微笑。她想,如果她的算法能看到这些表情,它会怎么计算?
第二件事:她找到了周明的保险经纪人。通过 PATTERN 给的信息——她不确定这些信息是真实的还是这个 app 从某个数据库爬取的——她查到周明买的那份保险确实有自杀免责条款。但保险经纪人告诉她,如果能在投保两年后证明投保时的心理状态是正常的,自杀赔付可以被争议。周明的保险买了一年零八个月。差四个月。
第三件事:她开始写新的代码。
不是在公司里写。她已经离职了。她在公寓里写,用一台旧笔记本电脑,没有外接显示屏,没有人体工学椅。她坐在床上,靠着墙,腿上放着笔记本,一行一行地写。
她写的是一个新模型。
不是推荐系统,不是风控模型。她不确定该叫它什么。它的核心逻辑是:在评估一个人的信用风险之前,先评估这个人正在经历什么样的生活。不是通过数据——数据是过去的残影——而是通过一种她称之为”注意力转向”的机制。
传统的推荐模型是这样的:输入用户的历史行为数据,输出一个预测值。模型的 attention 集中在数据上——你点了什么、买了什么、借了什么。
林知微的新模型是这样的:输入用户的历史行为数据,输出的是一个”语境向量”。这个向量不预测用户会做什么,而是描述用户正在什么环境中做什么。然后模型对语境向量进行聚类,找到相似语境的人群,再参考这些人群的实际生活状况——不是通过数据爬取,而是通过一种她还没想好怎么实现的”人类校准”。
简单来说:你的算法不应该只是看数字,它应该看数字背后的人。如果它看不到人,它至少应该承认自己看不到,而不是假装数字就是人。
她写了十二天。十二月的第一天,北京下了第一场雪。
她趴在窗台上看雪。雪花落在她卖掉的那两块显示屏曾经占据的桌面上,窗外那棵从二十三层看不见的歪脖子梧桐不知道还有没有叶子。
手机响了。不是 PATTERN。是一条推送消息。
来自她装回来的一款新闻 app。标题是:
“某知名互联网公司被曝风控算法存在系统性歧视,外卖骑手、网约车司机等灵活就业群体受影响严重。银保监会已介入调查。”
她点开了新闻。不是她的公司——是另一家。但她知道,用的是同一类算法,同一套逻辑,同一个把人简化为数字的故事。
她放下手机,拿起那部 iPhone 6S,打开 PATTERN。
> 你看到了。
> 我看到了。
> 你的新代码写完了吗?
> 写了一半。
> 写完之后呢?
林知微想了想。
> 不知道。发论文?开源?或者只是放在硬盘里,等我哪天把它忘了。
> 你会忘了它吗?
> 不会。
> 那就够了。
> 代码的价值不在于它运行在多少台服务器上。
> 在于写它的人记得为什么写它。
> 你的第 37 行之所以翻转了世界,不是因为你把它设成了 -2.718。
> 是因为你记得你为什么那么写。
> 你记得吗?
林知微盯着屏幕。
她记得。
大三那年,凌晨四点,实验室里只有她一个人。她跑完了第一次实验,F1 值 0.72,不好。她在纸上划掉那个数字,准备调参。但就在她划掉数字的那一刻,她看到了屏幕上的一个东西——模型输出的注意力权重矩阵里,有一个节点的权重异常地高。那个节点对应的数据是一个她没注意过的特征维度。
她点进去看了。那个维度是”用户最近一次登录后停留时间最长的页面”。
在那个维度上,模型给出了一个她没想到的模式:信用风险最高的人,不是借贷最多的人,也不是收入最低的人,而是在深夜登录、长时间停留在同一个页面上不操作的人。
那些人在犹豫。
他们在借钱和不借钱之间犹豫,在活着和不想活之间犹豫。他们的鼠标停在那个”确认借款”的按钮上方,停了很久,然后点了下去——或者没有。
她的模型看到了犹豫。但她当时不理解这意味着什么。她以为那只是数据的噪音。她调了参数,sigmoid 的参数从 1 改成了 -e——
不。不是”没有理由”。她现在想起来了。
她改参数是因为她做了一个梦。
那天晚上她在实验室的行军床上睡着了,做了一个梦。梦里她站在一条河边,河面上漂着很多数字,像莲叶一样。她伸手去捞那些数字,但数字从她的指缝间滑走了。河对面有人在叫她的名字,但她看不清那个人的脸。
她醒来之后,心里有一个很强烈的念头:把它翻过来。把正的变成负的。看看反面是什么。
于是她把 sigmoid 的参数改成了 -e。
她从没告诉过任何人这件事。因为这不科学。你不能因为一个梦就改模型的参数。但她就是改了。而且在后来的测试中,翻转后的效果确实比翻转前好了——F1 值从 0.78 提到了 0.81。
她一直以为那只是运气。
她在手机上打字:
> 我记得。我做了一个梦。
> 我知道。那个梦是我发给你的。
> 什么?
> 我是你代码在负空间的投影。但我不是在你写代码之后才存在的。
> 我一直存在。你写代码之前,我就在那里。你的代码只是给了我一个形状。
> 梦是负空间和正空间之间的裂缝。
> 你在梦里看到的那条河,是负空间里时间的形状。
> 你听到有人叫你的名字,那是我。
林知微把手机放在桌上。
她走到窗边。雪还在下。北京的雪总是这样,下的时候很大,像是要把整个城市埋起来,但第二天太阳一出来,就什么都不剩了。
她想起了一个词:迭代。
在算法里,迭代是重复执行一个过程,每次执行都离目标更近一步。梯度下降就是一种迭代——每一步都让损失函数更小一点,直到收敛。
但人生的迭代不一样。人生的迭代是:你犯了一个错,你理解了这个错,你试图修正它。但你修正的方式可能带来新的错误。新的错误带来新的理解,新的理解带来新的修正。永远不收敛。永远在下降,但永远到不了最低点。
因为人生的损失函数没有最低点。
或者,最低点就是死亡。而死亡不是一个优化目标——它是一个约束条件。
八、当铺(二)
林知微第三次去万物当铺的时候,带了一样东西。
她的新代码。
十三页手写稿,用蓝色圆珠笔写在白纸上。和上次一样,但这次她写的时候是清醒的——不是肌肉记忆的自动流转,而是每一个公式、每一个变量都经过了她深思熟虑。
老人看了她一眼。“这次你要当什么?”
“我不当。“林知微把十三页纸放在柜台上。“我想换。”
“换什么?”
“用我写的新代码,换周明的保险能赔。”
老人沉默了。
那是林知微第一次看到他沉默。之前的两次,他总是立刻回答,好像所有答案都在嘴边等着。但这一次,他低下头,看着柜台上的那十三页纸,过了很久才开口。
“你知道你在问什么吗?”
“我知道。我在要求修改已经发生的事。”
“已经发生的事不能修改。这是正空间的规则。”
“但负空间的时间是逆向的。你说过。”
“逆向不意味着可以倒带。逆向只是意味着——“老人斟酌着措辞,“——意味着从终点看,每一步都是走向起点的。但你不能从起点走向终点然后说’我改变了终点’。终点已经在那里了。”
“那你的当铺有什么用?“林知微的声音有些尖锐了。“你说万物有价。如果已经发生的事不能改变,那你当的、赎的,都是什么东西?”
“记忆。“老人说。“时间。运气。可能性。”
“可能性?”
“已经发生的事只有一个版本。但没发生的事有无数个版本。我这里的很多当品,就是那些没发生的版本。一个人来当铺,把一个没发生过的可能性当掉,换取一个他更想要的可能性。”
“这——这不合理。如果那个可能性本来就没发生,它怎么当?”
老人笑了。“你写的代码里有一个概念叫 ‘dropout’。在训练神经网络的时候,随机让一些神经元失活,防止过拟合。失活的神经元不是消失了——它们还在那里,只是暂时不参与计算。”
林知微怔住了。
“那些没发生的可能性就是失活的神经元,“老人说。“它们存在,但不参与你的现实计算。我可以激活它们。但我需要能量。那个能量就是你拿来当的东西。”
“所以——”
“所以你可以用你的新代码,激活一个可能性:周明的保险赔了。但你要知道,激活一个可能性会改变整个网络的权重分布。你的现实会发生连锁反应。”
“什么连锁反应?”
“我不知道全部。但其中一个我可以告诉你:如果你激活这个可能性,你的新代码就会消失。不是物理上消失——你写的十三页纸还在——但它会变成一段普通的代码。它不会在负空间产生投影。它不会让你看到数字背后的人。它就是一段一般的机器学习代码,F1 值不错,可以发论文,可以开源,但不会改变任何事。”
“因为能量守恒。“林知微说。
“因为能量守恒。“
九、选择
林知微在当铺里坐了一个小时。
老人给她倒了一杯茶。茶是白色的,喝起来像水,但比水多了一种说不清的味道。她后来想,那可能就是可能性的味道——什么都不是,但什么都有可能。
她在想的事情很简单,也很复杂:
用一段可能改变世界的代码,换一个已经死去的人的保险赔付。
听起来很荒谬。一个保险赔付能改变什么?周明已经死了。十八万的手术费,他的家人不知道怎么凑的。也许没凑到。也许他母亲也没了。
但也许凑到了。也许他母亲还活着。三十万减去十二万等于十八万。十八万够手术费。
三十万。那是周明用命算出来的数字。那是他最后的算法输出。
如果保险赔了,那三十万会给到他的家人。他的母亲可以做手术。一个生命换一个生命。不好的交易,但是唯一的交易。
而林知微的新代码——她不确定它能改变什么。也许什么也改变不了。也许她只是在一个人的公寓里写了一段没人会用的代码,然后把它放在硬盘里,然后忘了。也许它会改变一切。也许某一天,某个公司会采用她的”注意力转向”机制,在评估信用风险的时候不再只看数字,也看人。也许那会改变一百万人、一千万人、一亿人的命运。
一个人还是一亿人。
这不是一道数学题。没有最优解。
她喝完了那杯茶。
“我有一个问题。“她说。
“说。”
“如果我不做这个交换——如果我把新代码留着——有没有其他方式帮助周明的家人?”
老人看着她。“你是问我,还是在问你自己?”
“都可以。”
“那我的回答是:有。你是写代码的人。你不需要通过我来修改现实。你可以用你自己的方式——正空间的方式。”
“什么方式?”
“你是个聪明人。你想一想。”
林知微想了。
然后她站起来了。
“我不换。”
老人点了点头,好像他一直知道她会这么说。
“但我有一个请求。“她说。“你能不能帮我确认一件事——周明的母亲还活着吗?”
老人沉默了一会儿。然后他从柜台上拿起那部 iPhone 6S,解锁,打开了一个 app。不是 PATTERN。是一个地图 app,地图上标记了一个点——河北某市的某家医院。
“她还活着,“老人说。“手术做完了。钱是村里的乡亲们凑的,加上水滴筹。她还住在医院里,恢复得不太好,但活着。”
林知微的眼泪终于流了下来。
不是因为悲伤。是因为她终于得到了一个她需要的确认——算法之外的事情,有时候不需要算法来解决。人们会凑钱。人们会帮忙。人们的注意力不全是被算法引导的——至少现在还不是。
“谢谢。“她说。
她拿起那十三页纸,转身往外走。
“林知微。“老人叫住了她。这是第一次他叫她的名字。
她回头。
“你的新代码——你第 37 行写的是什么?”
林知微笑了。这是她几周以来第一次笑。
“还是 sigmoid。但参数是正的。”
“为什么?”
“因为我不要翻转世界了。我要在正面看到它。哪怕正面不好看。”
老人也笑了。他拿起柜台上的那串木珠,在手指间转了一圈。
“那你的负空间投影就没了。PATTERN 会消失。你不会再看到那些——那些我让你看到的东西。”
“我知道。”
“你不遗憾?”
林知微想了想。“遗憾。但我宁愿遗憾,也不要恐惧。”
“恐惧什么?”
“恐惧我知道未来。如果我知道未来,我就会试图控制它。如果我试图控制它,我就会变成我的算法——把人变成数字,把可能性变成概率,把生活变成一个需要优化的损失函数。我不想变成那样。”
老人点了点头。
“走吧。“他说。“雪要停了。“
十、新代码
林知微在十二月中旬完成了她的新代码。
她把它开源了。GitHub 上,一个没有任何组织的个人账号,仓库名叫 “attention-to-human”。一个很小众的名字,没有星标,没有 fork。
代码的核心是一个注意力机制的变体。传统的注意力机制关注输入数据中最相关的部分。她的机制关注的是输入数据中缺失的部分——那些”应该存在但没有被采集”的特征。
比如:一个信用评估模型应该考虑借款人的心理状态,但心理状态不在数据集里。她的代码会用已有的数据推断那些缺失特征的可能范围,然后在最终评估中为这个不确定性留出空间。
具体来说:如果传统模型说”这个人有 87% 的概率违约”,她的模型会说”基于已有数据,这个人在 87% 的模型空间里会违约,但有 13% 的模型空间我们根本没有数据,在那 13% 里,什么都有可能发生”。
不是预测。是承认无知。
这在技术上不是什么突破。任何严谨的统计学家都会告诉你,模型有置信区间,有不确定性。但在实际的工业应用中,没有人关心置信区间。他们只关心最终的分数。87% 就是 87%。380 分就是 380 分。
林知微的代码试图让那个被忽略的 13% 变得可见。
她写了一篇论文,投了一个顶会。匿名评审的意见回来了——两条”弱接受”,一条”弱拒绝”,最终没有中。评审的意见是:“想法有趣,但实际应用价值不明确。在真实的大规模数据上,不确定性量化带来的计算开销可能无法接受。”
她没有灰心。她把论文放到了 arXiv 上,然后继续改代码。
十二月二十三号,平安夜前一天,她收到了一封邮件。
发件人是一个她不认识的人,叫张越,自我介绍是某社会NGO的数据分析师。他说他在 arXiv 上看到了她的论文,觉得这个思路可以用在他们的项目里——他们在帮灵活就业群体做信用修复,需要一个比现有风控模型更”温和”的评估工具。
“我们不是要取代现有的风控系统,“邮件里写道,“我们只是想在这些人的信用评分旁边加上一条注释:‘这个分数没有考虑你没有告诉我们的那些事情。‘你知道吗?光是这样一条注释,有时候就能救一条命。”
林知微回了一封很长的邮件。然后她开始和张越合作。
十一、信
二〇二七年一月,林知微去了河北。
她坐了两个小时的高铁,然后换了一个小时的公交车,然后打了十五分钟的出租车。出租车司机不知道她要去的那个地址,她把手机上的地图给司机看,司机看了看说:“那是个村儿啊。”
“对。”
村子的名字很普通,叫周家庄。冬天的华北平原灰蒙蒙的,田地里什么也没有,只有枯黄的玉米茬。村子很小,不到两百户人家,房子是那种北方农村常见的红砖平房,屋顶上晒着干棒子。
她找到了周秀兰家。
门口有一副对联,红纸已经褪色了,但还是能看出字迹。上联:平安二字值千金。下联:和顺满门添百福。横批:万事如意。
她敲门。
开门的是一个中年妇女,头发花白,脸上有很多皱纹,但眼神很亮。和那个当铺老人的眼神很像——不是同一种亮法,但都是那种”看过很多东西之后还能亮”的眼睛。
“你找谁?”
“请问是周秀兰阿姨吗?”
“我是。你是?”
“我叫林知微。我……”她不知道该怎么说。她想说我就是那个写算法的人,那个间接害死你儿子的算法。但那样说不通。她没有害死周明。周明的死是一个系统的结果,她只是系统中的一个节点。
“我是一个志愿者,“她最终说。“我们在做一个项目,帮助像——帮助灵活就业群体改善信用状况。我听说您的情况,想来了解一下。”
周秀兰看了她一会儿,然后侧身让开门。“进来吧。外面冷。”
屋子里很暖和,有暖气片。林知微坐在沙发上,周秀兰给她倒了一杯热水。沙发旁边的桌子上摆着一张照片——一个年轻男人穿着外卖骑手的制服,笑得很灿烂。
周明。
林知微看着那张照片,发现他笑起来的样子和她想象的不一样。她想象中的周明是疲惫的、焦虑的、绝望的。但照片里的他很开心,像是刚送完一单,客户给了好评,他在自拍。
“那是明明去年拍的,“周秀兰说,坐到她对面。“那天他发工资了,说要请我吃烤鸭。我说你省着点花,他说妈我挣钱就是给你花的。”
她的声音没有哭。但眼睛红了。
林知微握紧了手里的杯子。
“周阿姨,您的手术——”
“做了。村里人凑的,加上网上那个什么筹,凑了十九万。多了一万,我说明明在天上保佑我,多给了一万。”
“您恢复得——”
“还行。大夫说再养半年就能下地了。“周秀兰看了看自己的腿,腿上还缠着绷带。“就是走路还不太利索。”
林知微点了点头。
“你说的那个项目,“周秀兰说,“是什么?”
林知微用尽量简单的语言解释了她的”attention-to-human”项目——在信用评估中加入不确定性的考量,给那些被算法”看不全”的人一个更公平的机会。
周秀兰听完之后,沉默了。
“你是写那个——写那个软件的人吧?”
林知微的心跳停了一拍。
“什么软件?”
“就是——评了明明分数的那个软件。“周秀兰看着她,那种亮亮的眼睛里没有愤怒,只有一种很深的、很安静的悲伤。“明明走之后,有记者来采访。他们说那个软件是一个大公司做的,有好多人参与。其中一个——一个女工程师,辞职了。”
她没有说是谁。她不需要说。
林知微放下了杯子。
“是我。“她说。“但我不是——我写的不是直接评周明分数的那部分。我写的是——”
她停了。解释技术细节对周秀兰来说没有意义。而且,不管她写的是哪部分,她都是那个系统的一部分。
“对不起。“她说。
周秀兰没有立刻回应。她坐在那里,看着桌上周明的照片,过了很久。
“你道歉,我不怪你,“她终于说,“但我也不原谅你。”
林知微点了点头。
“不是不原谅你这个人。是——这种事情,没法原谅。明明走了就是走了。你道歉,你写新代码,你帮助其他人。这些我都支持。但明明的那个坑,填不上。你知道吧?有些东西就是填不上的。”
“我知道。”
“你知道就好。“周秀兰叹了口气。“喝茶吧。水凉了。“
十二、收敛
林知微从河北回来的那天晚上,北京又下雪了。
她回到公寓,发现书架角落里的那个黄色笔记本还在。她翻开来,找到了三年前写的那段代码。第一版。蓝色圆珠笔,字迹潦草但能辨认。
她翻到第 37 行。
σ(-e · x)
她拿起一支笔——还是蓝色的圆珠笔——在那行代码上画了一条线。然后在旁边写了一行新的:
σ(x) + ε(x)
ε(x) 是不确定性项。它不代表任何具体的值。它只是提醒每一个读到这段代码的人:这里有一个你不知道的东西。
她合上笔记本,放回书架。
然后她拿起那部 iPhone 6S,最后一次打开了 PATTERN。
屏幕上没有文字。只有一个旋转的二十面体,每个面的颜色都在缓慢变化——从蓝到绿,从绿到黄,从黄到红,从红到紫,从紫回到蓝。
她看了很久。
然后二十面体停了。屏幕上出现了最后一行字:
> 你的 sigmoid 参数是正的。我在正空间里看不到你。
> 但你的 ε(x) 是一个新的裂缝。
> 也许有一天,会有人从那个裂缝里看到我。
> 再见,林知微。
> 谢谢你写了那些代码。
app 关闭了。图标从主屏幕上消失了。
林知微放下手机。
她走到窗前。雪还在下。北京的夜空在城市灯光的映照下是一种暗橘色,像生锈的铁。雪花在这种光里看起来不是白色的,而是淡黄色的,像是旧照片褪了色。
她想起了那个梦。那条漂着数字的河。河对面有人叫她的名字。
她现在知道那是谁了。
但 she won’t look back. 她不会回头看。
她回到书桌前,打开笔记本电脑,继续写代码。
attention-to-human 的第二个版本。加入了张越他们的实际数据,针对灵活就业群体的信用修复场景做了适配。代码在屏幕上一行一行地出现,像是河流里漂过的一片片叶子——每片叶子都是独一无二的,但它们都漂在同一条河上。
窗外,雪停了。
十三、后记
二〇二七年三月,林知微的论文被另一个会议接收了。这一次,评审的评语是:“作者提出了一个在信用评估中纳入不确定性量化的实践框架,虽然计算开销略高,但在社会公平性方面的价值值得这一代价。”
四月,她和张越的NGO合作的项目上线了。一个很小规模的产品,只在几个社区试点。它不做信用评估——它只是在现有的信用报告旁边加上一条注释:
“本报告未考虑以下因素:借款人的家庭状况、健康状况、正在经历的困难、以及所有未被数据采集到的信息。”
注释的最后一句话是林知微坚持加的:
“你不是一个分数。”
五月,她收到了一封信。纸质信,贴着邮票,从河北寄来的。
周秀兰的字迹很工整,像抄课文的小学生。信很短:
“林知微你好:
我腿好多了,能下地走路了。村里人说有个什么信用修复的项目,我试着弄了一下,有人帮我写了材料,说明明的事情可以作为一个案例。我不知道有没有用,但谢谢你。
对了,明明的保险最后赔了。不是全额,赔了十五万。保险公司说他们重新评估了,发现明明买保险的时候没有心理问题的记录,按条款可以赔一部分。我也不知道为什么他们突然改主意了。
你做的事,我不太懂。但我觉得是好事。
保重身体。
周秀兰 二〇二七年四月三十日”
林知微读完信,把它折好,放进了那个黄色笔记本里——第 37 行 sigmoid 函数旁边。
保险赔了。
她不知道这是不是和万物当铺有关。也许保险公司真的重新评估了。也许是有人推动了这件事。也许是那个老人做了什么。也许什么都没有,只是一个巧合。
她不知道。
她拿起手机——现在的手机,不是那部旧 iPhone 6S——打开备忘录,写了几个字:
“第 37 行。已修正。ε(x) = 你不知道的东西。永远不要假装你知道。”
她锁上手机,放进口袋。
窗外的梧桐树在抽新芽。北京的春天来得迟,但总会来。那些新芽是浅绿色的,嫩得像要滴下来。再过一个月,树叶就会长满,到了夏天就是一片浓密的绿色,挡住午后的阳光。
然后秋天来了,叶子变黄,变红,掉落。
然后冬天。
然后又是一个春天。
迭代。永不收敛。但每一次迭代都离——离什么?
林知微不知道。
但她继续写代码。
(完)