周三清晨,我被手机震动唤醒——不是闹钟,是一条算法生成的天气提醒:
“今日降水概率73%。建议:带伞,提前出门。PS:衬衫备用方案已就绪。”
发件人:楚惟舟。
我盯着那条消息看了十秒,直到屏幕自动变暗。窗外天色灰白,云层低垂,确实像要下雨。73%,这个数字有点眼熟。我翻身下床,从包里翻出那个灰色文件夹,找到第一页右上角的手写0.73。
概率与准确率,在他眼里或许都是需要优化的参数。但把这两个数字并列在一起时,却产生了一种奇异的、近乎诗意的共振。
我提前二十分钟到达公司。前台女生递给我一杯热美式:“楚总交代的,说实习生需要咖啡因续航。”
纸杯温烫,杯套上印着一行小字:“残差项:0.5kcal”——大约是这杯咖啡的热量偏差值。我几乎能想象他下单时盯着营养成分表,精确计算咖啡因与糖分平衡的样子。
工位上已经亮着三块显示屏。左边屏幕滚动着实时数据流,中间是代码编辑器,右边——是那个蝴蝶模型的测试界面。一只简约的线条蝴蝶停在中央,翅膀随着预测准确率微微振动:0.74,比昨天高了0.01。
“早。”
声音从斜后方传来。楚惟舟站在两排工位之间的过道上,手里端着同款美式,但杯套已经被整齐地撕掉,露出纯白杯身。
“楚总早。”
“楚惟舟。”他纠正,走近了几步,“模型收敛速度比预期快。你调整了学习率?”
“昨晚试了自适应算法。”我点开历史记录,“不过现在卡在0.74附近,有平台期。”
他俯身看向屏幕,手臂擦过我的椅背。距离近到我能看清他锁骨下方那道疤痕的全貌——大约三厘米长,边缘平滑,像是很久以前被什么锋利的东西划过。
“特征交叉不够。”他伸手,指尖在屏幕上虚划,“这里,和这里,应该引入二阶交互。单靠一阶特征太浅。”
他的手指修长,指甲修剪得一丝不苟。指关节处那道细小的旧伤在显示屏冷光下更明显了。
“那道疤,”我脱口而出,随即意识到越界,“抱歉,我不该——”
“十五岁时拆无人机留下的。”他直起身,语气平淡得像在陈述一个实验参数,“锂聚合物电池起火,我用螺丝刀撬外壳时划伤的。”
“拆无人机?”
“想改它的飞控算法。”他喝了口咖啡,“那时候觉得,如果无人机能更智能地避开鸟类,就不会有那么多候鸟撞上风力发电机。”
我怔住。这不是我想象中的答案——不是精英教育的什么高光时刻,而是一个少年试图用技术保护鸟类的、近乎笨拙的努力。
“后来呢?”我问。
“后来发现,完美的避障算法需要消耗太多算力,续航会缩短。”他看向窗外,侧脸在灰色天光里显得有些模糊,“有时候,最优解并不存在,只有妥协方案。”
雨就在这时落了下来。先是零星几点敲在玻璃上,然后迅速连成一片,把世界浸泡在水幕里。
办公区的灯光自动调亮了一档。楚惟舟收回目光,看向我的屏幕:“继续。在损失函数里加个惩罚项,对,像这样——”
他弯下腰,手指在键盘上敲击。我僵在原地——他的手臂几乎环过我,雪松的气息裹挟着极淡的咖啡香,将我包围。键盘声清脆而有节奏,像某种加密过的心跳。
“好了。”他输入最后一行代码,按下回车。
蝴蝶的翅膀振动频率突然加快。准确率数字开始跳动:0.745,0.751,0.759……最终停在0.763。
“你看,”他说,声音就在我耳畔,“有时候需要引入一点非线性。”
他直起身,拉开距离。空气重新流动起来,我这才发现自己一直屏着呼吸。
“下午跟我去个地方。”他转身离开前说,“穿舒服点的鞋子。”
“什么地方?”
“蝴蝶效应的第一现场。”
雨在午后转为细雨。楚惟舟开车,一辆低调的深灰色电动车。车内一尘不染,中控屏上显示着实时能耗曲线。他开车时很安静,只有雨刷规律地摆动。
我们驶离科技园区,穿过隧道,进入一片老城区。街道变窄,梧桐树枝叶交错,在挡风玻璃上投下晃动的影子。最终车停在一栋五层旧楼前,门口挂着牌子:“清河社区学习中心”。
“这是……”
“你模型里数据样本#0471,”他熄火,“那个考进区重点的孩子,就在这里上过课。”
我愣住。文件夹里的数据突然有了声音、颜色和气味——楼道里飘来的粉笔灰味,墙上贴着孩子们稚嫩的画,某扇门后传来断断续续的钢琴声。
一位中年女性迎出来:“惟舟来了?这位是……”
“林晚,我的实习生。”他介绍时语气自然,“她正在优化推荐算法,想看看实际使用场景。”
“林老师好!”几个孩子从教室里探出头,眼睛亮晶晶的。
我被那声“老师”叫得手足无措。楚惟舟嘴角似乎弯了一下,很浅。
我们走进一间计算机教室。八台旧电脑嗡嗡作响,屏幕上运行着在线的教育平台——正是灵犀科技旗下公益项目的界面。
“每周二四六开放,”负责人李老师介绍,“但设备太老,有时候推荐课程加载很慢。孩子们会急。”
我看向楚惟舟。他正蹲在一台电脑前,检查机箱后的线缆。炭灰色针织衫的袖子蹭到了灰尘,他眉头微蹙,却并没有立刻擦拭。
“带宽不够,内存也老化。”他站起身,“下周我让人送几台二手服务器过来,可以做本地缓存。”
“那很贵吧……”
“折旧资产,财务上已经摊销完了。”他说得轻描淡写,然后转向我,“现在你明白了吗?”
“明白什么?”
“为什么算法需要优雅。”他看着屏幕上缓慢旋转的加载图标,“因为在这里,每多等一秒,都可能有一个孩子失去兴趣。优雅不是美学,是仁慈。”
窗外雨声渐沥。一个大约七八岁的男孩跑过来,手里举着一幅画:“楚哥哥你看!我画的蝴蝶!”
画纸上的蝴蝶翅膀不对称,颜色涂出了边界,但眼睛处用银色水笔画了两个夸张的光点,像星星。
“为什么蝴蝶眼睛会发光?”楚惟舟接过画,问得认真。
“因为它在夜里也要看路呀!”男孩理直气壮。
楚惟舟顿了一下。然后,很慢地,他笑了。
不是那种礼节性的微笑,而是眼角微微弯起,琥珀色瞳孔里映出孩子雀跃的脸。那个笑容让他瞬间脱去了所有“总裁”的壳,变回那个会为了鸟类去拆无人机的少年。
“有道理。”他说,把画仔细卷好,“谢谢你的画,我会好好保存。”
回程路上,雨停了。夕阳从云层裂缝中涌出,把湿漉漉的街道染成金色。车内播放着极简的钢琴曲,音符像雨滴一样干净。
“为什么带我来这里?”我终于问出口。
楚惟舟目视前方,手指在方向盘上轻轻敲击,像在调试某个看不见的参数。
“算法工程师最容易犯的错误,”他说,“是把数据点看作纯数字。但每个样本背后,都是一个具体的人,在具体的生活里挣扎或欢笑。”
他停顿,等红灯变绿。
“我想让你记住这种‘具体’。这样当你调参时,会知道0.1%的准确率提升,可能意味着某个孩子多了一分考上理想学校的概率。”
我看向窗外。街边便利店亮着暖黄的灯,一个母亲牵着孩子的手走出来,孩子手里举着彩虹色的棒棒糖。
“那个画蝴蝶的孩子,”我说,“可能就是未来的某个样本。”
“可能。”他点头,“但更重要的是现在——现在他相信蝴蝶夜里会发光。这种相信本身,就是黄金。”
车驶回公司地库。停稳后,他没有立刻解安全带。
“今天的工作,”他转向我,“我会记为‘田野调研,提升模型人文感知’。算加班费。”
“我不需要——”
“需要。”他打断我,语气不容置喙,“你的时间有价值,我的决策也需要成本核算。这是规则。”
我哑然。这个人,一边带我去看蝴蝶发光的童话,一边严谨地计算着加班费。
“最后一个问题,”我鼓起勇气,“为什么是我?”
车库里光线昏暗,仪表盘的微光映在他侧脸上。他沉默了很久,久到我以为不会得到答案。
“因为,”他最终开口,声音低得像在自言自语,“在遇见你之前,我的算法里没有‘残差项’这个概念。”
“残差项?”
“模型预测值与真实值的偏差。”他解开车锁,“理论上应该趋近于零。但最近我发现,有些偏差无法消除,反而……让整个系统变得更鲜活。”
他推门下车,背影消失在电梯厅的方向。
我坐在逐渐冷却的车里,回味着那句话。手机震动,一条新的系统通知:
“蝴蝶模型准确率突破0.77。检测到新型特征交互模式,建议命名为:Cross_LW(林晚交叉项)”
我盯着那行字,直到屏幕暗下去。
原来这就是残差项——那些理性框架无法解释的偏差,那些计划之外的蝴蝶,那些夜里发光的眼睛。