第四周的周三下午,项目组办公室里的暖气开的比往常热了一些,大概是因为服务器持续运转给房间额外增加了温度。
五个人挤在墙角那台服务器前面,苏清月站在中间握着鼠标,把最后一批标注数据拖进了验证文件夹。屏幕上的进度条走完了最后一段绿色的路程,弹出导入完成的提示框,她松开鼠标转过头来,说了一句:五万一千张,全部标完了。
身后四个人同时长长地呼出一口气,像憋了很长时间才终于被允许释放的气流,在安静的小房间里持续了好几秒。
可以了。
苏清月退后半步,把位置让出来,转向站在旁边一直没说话的孙雨萌,孙雨萌,交给你了。
孙雨萌推了一下眼镜。她往前走了半步站到了那台服务器前面,在键盘上敲了几行指令。屏幕上跳出了一个训练脚本的界面,参数栏里密密麻麻排列着几十行数字,光标在最底下的执行键旁边安静地闪动着。她深吸了一口气,把手指搭在回车键上方停了一下,然后按了下去。开始了。
屏幕上的代码开始滚动起来。第一行是数据加载的提示,第二行是预处理状态,第三行跳出了一个进度条,从0.0%开始缓慢地向右延伸。孙雨萌看着那个进度条确认它已经开始往前走了,才退后半步,在自己的椅子上坐了下来。训练跑起来之后项目组暂时闲了下来。第一天的上午没有人说话。赵一鸣坐在自己的工位上对着天花板看了半小时,又把手机拿起来刷了两分钟然后放下了。小王把桌角那堆咖啡罐收拾了一遍又摆回了原来的位置。林笑笑打开了自己手机里的笔记软件翻了翻,又关上了。
孙雨萌每隔二十分钟刷新一次训练界面,屏幕上那个进度条每次刷新时都往前走了一小段。她盯着进度条旁边那个剩余时间预估——从58小时开始慢慢往下跳,到第一天结束的时候停在了30小时。
第二天上午,孙雨萌推开门的时候眼睛里带着明显的疲惫。她昨晚回去了,但大概没有睡好。她走到服务器前面刷新了一下界面,剩余时间那行已经跳到了12小时。她看了一眼,然后在椅子上坐下来,等。赵一鸣进来的第二句话是问她跑完了吗,她说还没有,赵一鸣在自己工位上坐下来,把手机在手里翻了两圈又放下了。小王端着一杯新泡的咖啡,靠在暖气片旁边站着,目光时不时地飘向服务器屏幕上那个跳动的进度条。林笑笑翻开一本旧杂志,翻了两页把杂志合上了。
第三天早上六点五十一分,苏清月的手机在床头柜上震了一下。她伸手把手机拿起来,屏幕上是孙雨萌发的消息——跑完了。误差0.38毫米。她看着那行字,坐起来靠在床头。过了一会儿她打字回过去:比目标多了0.08。别急,再调调。你先睡会儿。孙雨萌的消息回的很快:我不困。苏清月又打了几个字:你眼睛是红的。去睡四个小时再调。急来的参数跑不出好结果。孙雨萌那边隔了很久才回了一个字:
中午苏清月去项目组办公室的时候,门是虚掩着的。她推开门走进去,看见孙雨萌趴在桌子上,脸埋在自己的胳膊里睡着了。她的眼镜摘下来放在键盘旁边,屏幕亮着,训练参数的界面还留在她睡前的状态,几行修改了一半的代码停在编辑窗口里。苏清月走过去把外套脱下来轻轻披在她肩膀上,然后在她旁边的椅子上坐了下来。她往屏幕上方的日志窗口扫了一眼,又把孙雨萌改过的那几行参数从头到尾看了一遍。她的手指在键盘上轻轻敲了几下,把两个超参数的值从默认的基准线上微微向左右各调了一格,然后重新启动了一次简化的验证训练,在确认日志开始滚动之后把屏幕亮度调低了一些,然后站起来。
晚上七点,孙雨萌醒了。她动了一下肩膀,发现身上多了一件外套,抬头看了看旁边已经空了的椅子。她坐直了,把外套叠好放在桌角,目光落在屏幕上那个已经跑完了的验证结果上——训练误差那一栏显示的数字是0.33。在0.33的旁边有一个自动生成的对比数据,前一次跑的版本误差是0.38。她盯着那个数字看了好几秒,才转头看了一眼旁边空着的工位上苏清月用过的那台电脑。她吸了一下鼻子,发了一条消息:苏主任你——
对面回得很快:调了两个参数。你再试试别的方向。
孙雨萌看着那条回复,在椅子上坐了很久。她重新看着屏幕上那个0.33的数字,眼眶边缘热了一下,她低头用手背蹭了一下眼窝,又把眼镜重新戴上了,打字问她:苏主任,你调了多少次才能这么快?
以前在霍普金斯调过几百次。参数该往哪个方向走,看损失曲线的形状就知道了。熟能生巧。
那你怎么不直接调好?
苏清月的消息隔了一小会儿才弹出来。内容不长,但每个字都端端正正地放在句子里:我调了你还学什么。
孙雨萌坐在屏幕前面看着那行字,没有说话。她低头把桌角那件外套拿起来重新叠了一下放回椅背上,然后坐回自己的工位前,把刚才苏清月调整过的那两个参数值记了下来,旁边标了它们在新验证中的表现曲线走向。她在笔记本上写了一行:0.33。差0.03。
她掏出手机发了一条朋友圈。消息很短,配了那张0.33的截图,截图里参数调整前后的对比曲线清晰可见。第四周。我导师帮我调了参数,然后说我调了你还学什么。我好想哭但又在笑。她发出去了。
底下第一个评论来自林笑笑,只有两个字:我懂。
第二个评论来自顾言深:0.33了?
孙雨萌看着那个问号,回了一条:你怎么知道?
顾言深的消息很快弹了出来:她跟我说的。
孙雨萌看着那条回复,把手机放在桌面上。屏幕没有锁,窗外的路灯从门缝挤进来在那张训练结果截图上落了一道窄窄的亮光。她重新把目光转回服务器屏幕,右手放在鼠标上,开始逐行检查当前版本的损失曲线变化趋势,在下一次训练开始之前手动调整另外两个参数尝试缩小那段距离。她知道自己那行好想哭又在笑的真实含义——她想哭是因为0.33跟0.38之间的那段距离是她自己没有走到的,她笑是因为苏清月调的那两个参数之后把路指到了她面前,剩下的那0.03毫米是她自己的路了,等她走过去,那段距离就会变成她自己的东西。她的手指在键盘上敲了第一行新参数,确认保存之后按下了执行键。屏幕上的进度条重新开始向前移动,从0.0%的位置再次出发。这次她坐在屏幕前面没有离开,窗外的路灯完整地经过了从亮到亮的整个周期,在她身后墙角投下了一道从来没有移动过的灰色影子。那道影子的边缘均匀而稳定,边缘的清晰度在那个0.33的数字旁边被窗外的光磨过之后,显得比周围任何一道线条都要分明一些。她觉得自己能走完最后那0.03毫米。路上还有几版参数要跑,可能还有几夜,还有几次短暂的睡眠和几次从代码窗口抬起头来的时候发现窗外天已经亮了。但她确信只要她继续调,继续跑,继续验证,等下一版结果出来时那个数字会变得更小一些,再小一些,一直走到误差归零的起点。