最後一幕,把前面二十四天的東西拿去打一場真的比賽。
起因很隨興(跟這系列的起頭一樣):信箱跳出一封 Kaggle 的競賽通知,我本來只是想測測看,現在的 AI 到底能不能幫忙解一個真的難題。
題目不是玩具:在 3D 顯微影片裡追蹤上千顆細胞,從頭追到尾,還要抓到細胞分裂的時刻。生物影像領域一個正在進行中的世界級競賽。
我不是找「一個」AI 幫忙,是照這二十四天的規矩,請一整隊底層不同的 AI 一起出點子,然後一步一步往上爬。
0.14——最樸素的做法。前後兩張影格,把最近的細胞連起來。電腦常常連錯,一分裂就亂。
0.701——問了不只一個 AI,把它們一致建議的招綜合起來。這一步的價值不在某個聰明的點子,在「三家都說該這樣做」這件事本身提供的信心。
0.738,換上深度學習的分割模型,讓 AI 自己「看」細胞在哪裡,而不是靠傳統影像處理去猜邊界。
然後卡住了。
卡住的時候我做了一件事,後天會整整寫一篇檢討,但這裡先講對的那部分:我去看排行榜,去讀別人公開的做法。
發現有人把一套古典的追蹤方法調得很好,分數比我高一截。於是我不再從零想新招,改成把那套公開做法完整重現、修到能跑。
0.826 → 0.835 → 0.839 → 0.913。
最後那個 0.913 要講得很清楚:底座本身就是別人公開的 0.913。我們的貢獻是把它最強的配置修到能完整執行,以及把自己加上去但沒效的想法,用一次一變數的實驗誠實地否掉。借的東西要講清楚,在這裡是字面意思。
順帶留兩條 Kaggle 自動化的實用細節,都是踪過的:官方 CLI 可以把「推 notebook → 跑 → 抓結果 → 提交」全自動化,但在 Windows 上推含中文的 notebook 要先設 PYTHONUTF8=1,不然編碼直接炸;指定 GPU 機型要寫在 kernel metadata 的 machine_shape 欄——舊款 GPU 跑不動新版 torch,排隊排到了才發現跑不起來最傷。
開放型任務全員並進(Day 4)。「這一步該怎麼改」是典型的開放型問題,一律五位一起想,我綜合。好幾次最關鍵的一句來自我原本不會派他的那位。
先查排行榜再動手(後天詳談)。這條是血淚換的,寫進了團隊的紀錄。
判準事前寫死。動手改之前先講好「什麼樣的結果算變好」,不然事後看數字很容易自我說服。
驗證器先考已知答案。寫完評分程式,先拿一個你已經知道答案的案例去餵它。如果它連已知答案都算錯,後面所有實驗數字都是廢的。這條救過我至少兩次。
比賽中期,Ted 給了一條常設授權:到比賽截止為止,提交和實驗一律自主,不用每次來問。
這件事對團隊運作的意義比對比賽大。它把「每一步都要人點頭」的節奏,換成「規矩事前講好、過程自主、結果誠實回報」。而能這樣換的前提,是前面二十四天建立的那些東西,判準寫死、驗證器先考、記錄不摻假。
授權不是信任的表態,是驗證機制成熟之後的自焴結果。
明天講這場比賽裡最反直覺的一課:分數顯示一樣,不代表你做的事沒有效果。