三階段跑完,照 Day 7 的表格跑完整評測。結果是:
微幅提升。而且幅度小到我無法宣稱它是有意義的。
| 階段 | CyberMetric | SecQA | iPAS |
|---|---|---|---|
| 基線 | 【填入實測】 | 【填入實測】 | 【填入實測】 |
| CPT 後 | 幾乎持平 | 幾乎持平 | 幾乎持平 |
| SFT 後 | 小幅提升 | 小幅提升 | 幾乎持平 |
| 蒸餾後 | 小幅提升 | 小幅提升 | 幾乎持平 |
| 總 delta | 個位數百分點以內 | 個位數百分點以內 | 接近零 |
花了幾天的訓練時間、幾週的資料準備,換來一個在統計上勉強能說是「有提升」的結果。
今天這篇是這 30 天最不好寫的一篇,但也是我認為最值得寫的一篇。
在檢討原因之前,要先誠實回答一個問題:這個提升,是真的提升,還是雜訊?
多選題評測的分數波動可以用一個簡單的估算:如果題庫有 N 題、正確率約 p,那麼分數的標準誤差大約是 √(p(1-p)/N)。
代入實際數字之後我得到的結論很不舒服:
也就是說,我只能宣稱其中一組有微弱的、可能是真實的提升。另外兩組,我不能宣稱任何東西。
我把這段算式寫出來,是因為我看過太多技術分享跳過這一步。「我們的模型提升了 3%」如果沒有附上題數與誤差估計,那句話是沒有資訊量的。
面對這個結果,我列出三個可能的原因,然後逐一調查。
怎麼驗證:看 loss 曲線、看 perplexity、看抽樣輸出。
結論:排除。 loss 正常下降,held-out perplexity 確實降低,而且最關鍵的證據是——模型的輸出行為明顯改變了。SFT 之後它會照格式寫報告了,蒸餾之後它會在資訊不足時表達不確定了。這些變化都是真的。
模型學到了東西。只是 benchmark 沒有測到。
這是主要原因。
回頭看我訓練了什麼:
三個階段,沒有一個階段的訓練目標對應到 benchmark 在測的東西。
多選題 benchmark 測的是「你知不知道這個資安事實」。而我從 Day 1 就說了,知識落差不是我要解的問題,我要解的是行為落差。
那我為什麼還用這組 benchmark?
因為它們是現成的、公認的、可以拿出來講的。我在建基線的時候,選了「業界都在用的評測」,而不是「測我真正在乎的事情的評測」。這是一個舒適的錯誤——用大家都認可的尺,量一個那把尺量不到的東西。
這是次要但真實的原因,而且是 Day 6 那篇的來源。
我把大量 CVE 描述、標準文件內容餵進了 CPT。這些是事實類資料,模型只會記成模糊印象,不會變得能準確作答。而且它們吃掉了訓練預算,排擠了真正該學的東西。
更難堪的是:因為標準文件同時是某些評測題目的來源,我的訓練資料與評測資料之間可能存在重疊。這代表就算分數上升,我也不能完全確定是模型變強。
而事實是——分數幾乎沒上升。 也就是說,即使在可能有洩漏的情況下,模型也沒能把那些內容轉換成答題能力。這反而是對「事實類資料不適合放進 CPT」最有力的證據。
三個理由。
第一,因為分階段評測讓我能追出原因。 如果我只在最後跑一次評測,我會得到一個爛分數然後完全不知道發生什麼事。Day 4 那個「每階段存 checkpoint 並各跑評測」的決定,在這裡回本了。
第二,因為這個結果本身就是這個專案最重要的發現。 它不是失敗,它是一個結論:在這個場景,微調不是提升知識問答分數的手段,而是提升格式服從與判斷收斂的手段。而後者,現有的 benchmark 測不出來。
第三,因為誠實地講失敗,比包裝一個漂亮的數字有用。 如果我今天寫的是「經過三階段微調,模型在 CyberMetric 上提升了 X%」,然後不提題數、不提誤差、不提另外兩組沒動——那篇文章會比較好看,也會比較沒有價值,而且是不誠實的。
這是明天與後天要回答的。簡單預告:
明天先把原因分析得更透一點:微調 delta 小,到底是資料的錯、評測的錯,還是任務本來就該交給 RAG?
🛡️ Instagram: @aid3fend — AI 資安實戰紀錄,歡迎追蹤交流。