當然,如果非要套用某種神秘學設定,被這兩位計算機鼻祖序列零級別的真神祝福,或許真不是什麼好事——畢竟在這個領域,真神帶來的「污染」也是極其可怕的。
第一個被「污染」的是小周。
「我想把匹配引擎的核心算法從決策樹改成圖神經網絡。」
他說話的時候眼睛亮得嚇人,聲音沙啞,但每個字都咬得極其清晰,像是已經在腦子裡反覆推導了無數遍.
「現在這套決策樹模型雖然能跑,但特徵維度一旦超過兩百維,分類邊界就會退化。我們做的簡歷解析本質上是非歐幾里得空間的結構化數據,用圖神經網絡天然適配。我昨晚在GitHub上翻到一篇今年三月剛發的論文,作者是MIT的,他們用圖注意力網絡做語義角色標註,在標準測試集上把準確率從九十一推到了九十六。我復現了一下他的核心思路,套在我們的簡歷特徵圖上跑了一遍,F1值直接跳了零點零四。」
何博士把咖啡杯擱回桌上,杯底磕在桌面上的聲音在安靜的辦公室里格外清晰。
他沒說話,只是走到小周的工位前,彎腰看屏幕上的代碼。
看了大概兩分鐘,他直起腰,摘下眼鏡用襯衫下擺擦鏡片——這是他遇到難題時的習慣動作,但此刻他擦鏡片的頻率比平時快了至少一倍。
「你這個圖的節點定義用的是雙向注意力還是單向?」
「雙向,而且加了殘差連接。單向的話長距離依賴會衰減,簡歷里有些關鍵信息隔了好幾段話還互相呼應——比如教育經歷和項目經驗里的技術棧——雙向注意力能把這層關係抓出來。」
「殘差連接加在哪一層?」
「每一層。標準的Transformer架構是六層編碼器加殘差,我壓縮到四層,因為簡歷文本的複雜度遠低於自然語言通用場景,層數多了反而過擬合。但每層都保留了殘差連接,保證梯度回傳的時候不會在深層衰減。」
何博士重新戴上眼鏡,沉默了片刻,然後轉過身看向陳啟明:「他這套方案,如果放在一個月前讓我審,我會打回去讓他重寫。不是思路不好,是工程量太大——圖神經網絡的訓練開銷比決策樹高一個數量級,標註數據不夠的話精度反而會崩。但現在我們的標註數據已經積累了多少?」
「上周剛過五萬條,加上上周你從省人才市場調過來的那批歷史簡歷,夠用了。」陳啟明從白板前走過來,手裡還捏著馬克筆,他低頭看了屏幕上的代碼,眉頭先是皺了一下,然後慢慢舒展開來,最後變成了一種複雜的、介於讚嘆和警惕之間的表情,「小周,你什麼時候開始看圖神經網絡論文的?」
「上個月……不對,好像是上個禮拜。我也記不太清了。」
小周撓了撓後腦勺,手指在鍵盤上懸停著,屏幕上的代碼光標還在自動補全提示框裡一跳一跳的,「反正就是最近,每天晚上睡不著就翻論文看,看著看著就覺得很清晰,以前看同一篇論文覺得像天書,現在看一遍就能在腦子裡把公式推出來。然後我就在想,既然圖神經網絡能做語義標註,那為什麼不能做簡歷匹配?簡曆本身就是一個天然的屬性圖——求職者是節點,工作經歷、教育背景、技能標籤全是屬性邊。把匹配問題轉成圖上的連結預測問題,比用決策樹硬懟特徵維度優雅多了。」
陳啟明把馬克筆丟進筆筒里,拉過一把椅子在小周旁邊坐下。他盯著屏幕上的代碼一言不發地看了好幾分鐘,然後轉頭看了眼何博士。何博士沖他微微點了點頭,那個幅度極小,但陳啟明看懂了——可行。
「做原型驗證。」陳啟明的聲音恢復了平時的沉穩,但攥在膝蓋上的手指關節微微發白,「先跑小規模測試,樣本量控制在兩千份簡歷以內,把圖神經網絡和決策樹的F1值做對比。三天之內我要看到對比數據。如果F1值真的能拉開零點零四以上的差距,這一輪架構疊代我們就換方向。」
小周用力點了點頭,手指已經敲上了鍵盤。
他的動作極快,快到旁邊的後端工程師小張探頭看了一眼,低聲嘟囔了一句,『這手速打電競都夠用了」。
但小周顯然不是在亂敲——屏幕上的代碼一行接一行地往下鋪,函數命名清晰,注釋寫得比平時任何一次提交都規範,而且幾乎沒有停頓。每一個變量名的命名風格都跟團隊原有的代碼規範完全一致,導入包的順序按照標準庫、第三方庫、本地模塊排得整整齊齊。這種代碼規範,換做平時至少要在代碼審查環節反覆改三四遍,但他這次一次就過了。
陳啟明起身去接水的時候路過印表機,發現紙槽里已經堆了厚厚一疊論文列印稿。
最上面那篇正是MIT那篇圖注意力網絡論文,旁邊用紅筆畫滿了密密麻麻的批註,批註的筆跡有粗有細,細的是小周前天寫的,粗的是他昨天凌晨又加上的補充。
翻到最後一頁,空白處寫了一行歪歪扭扭的鉛筆字——「可以拆掉編碼器第三層,用一個全連接層代替,特徵損失可控在零點零一以內。」字跡潦草,顯然是在半睡半醒之間寫的,但邏輯沒有任何漏洞——何博士今天上午驗證過這個簡化方案,結果完全吻合。
小周的變化並不是一夜之間發生的。起先是坐在他對面的後端工程師小張發現,小周午休時不再趴在桌上補覺,而是戴著耳機盯著屏幕,手指在觸摸板上飛快地滑動,嘴角掛著一絲若有若無的弧度。小張以為他是在摸魚刷視頻,趁接水的工夫繞到他背後瞄了一眼,屏幕上密密麻麻全是代碼——但那不是他們正在開發的那套智能招聘系統,而是一個完全陌生的項目。
「你這寫的是什麼?」小張把腦袋湊近了些,屏幕上花花綠綠的代碼高亮晃得他眼睛發花,但他勉強認出了幾個關鍵詞:頂點著色器、紋理映射、骨骼動畫。
「一個vtuber的實時渲染管線,閒著沒事寫著玩的。」小周頭也沒抬,手指依舊在鍵盤上敲得飛快,屏幕上一個穿著蓬鬆洋裝的卡通少女正在一個素色的虛擬背景里緩慢轉動,裙擺的物理引擎模擬得極其自然,每一幀的光影渲染都精確到了耳環的反光點。
小張端著水杯愣了好一會兒,然後拉開椅子坐下,用一種白天見鬼的眼神看著小周。「你不是只會寫後端嗎?上次前端小李讓你幫忙調個CSS你都嫌麻煩,什麼時候學起實時渲染了?」
「沒學。」小周終於停下手裡的代碼,自己也低頭看著屏幕上那個正在自動旋轉的卡通少女,表情比小張還困惑,「就昨天刷到一個vtuber的直播切片,覺得好玩,然後腦子裡突然就開始往外蹦這些渲染管線的架構。我也不知道這些東西是從哪來的——就好像我本來就會,只是之前忘了。」
小張把這當成程式設計師特有的凡爾賽,沒再多問。