Day 23 的 checkpoint curve 留下一個問題:訓練後表現最好的第 10 次更新答對 32 題,Base 卻答對 41 題,後面四份 checkpoint 也都沒有讓答題數能趕上 baseline。我們最能先懷疑出錯之處是 verifier 是否把錯答案算成正解;然而訓練 contract 只有在 final answer 正確,而且依要求輸出正確格式時才給 1 分,錯誤答案仍然是 0。這次的 1 分沒有給錯,模型卻往答對更少題的方向移動了。
讓我們檢視那答錯的 9 題,Base 與第 10 次更新回答的是同一批 256 道開發集題目,因此可以逐題配對:
Base 錯,更新 10 次後仍錯 204
Base 錯,更新 10 次後答對 11
Base 對,更新 10 次後答錯 20
Base 對,更新 10 次後仍對 21
第 10 次更新救回了 11 題,也讓原本答對的 20 題變錯,兩邊相減正好是 -9。回答內容朝兩個方向改變,只是在這批題目上,誤判的次數比改對的更多。
格式往相反方向移動,同一個配對裡,有 66 題從不符合嚴格格式變成符合,只有 5 題由符合變成不符合,淨增加 61 題。模型的輸出確實受訓練影響,但這樣的變化是反應在格式表現上,而非數學正確性。
這個 -9 題的 paired bootstrap 95% interval 是 -7.81 到 0.78 個百分點,exact McNemar p=0.1496。區間跨過 0,還不足以把這次結果延伸成穩定的母體退化;即使先不看 interval 與 p-value,第 10 次更新在眼前 256 題上仍比 Base 少答對 9 題。失敗並不是統計門檻憑空製造的。
50 次更新,真正產生比較的只有 5 組。
每道 training prompt 都抽 8 個 rollouts,再用同組內的 0 與 1 算 advantage。完整紀錄可以分成三種情況:
44 組:0/8 答對 advantage 全為 0
1 組:8/8 答對 advantage 全為 0
5 組:對錯並存 產生非零 gradient
400 個 rollouts 一共答對 15 個,但其中 8 個集中在唯一一組全對的題目;那一組沒有較差的候選可以比較,最後仍是 zero gradient。真正參與相對學習的正解只剩 7 個,分散在第 2、4、27、43、47 次更新。其餘 45 組無論全錯或全對,都沒有告訴 policy 同一道題裡哪條 trajectory 應該增加機率。
只看平均 reward 0.0375,會把 15 個正解都算成同一種成功;放回 group-relative advantage 之後,其中 8 個並未形成學習方向。Reward 記錄「抽到了幾個正解」,非零 gradient 才記錄「同一道題裡出現了可比較的好壞」。
在我們的紀錄中,錯誤的方框答案仍然拿 0 分,但所有拿到 1 分的 trajectory 都必須以 \boxed{...} 交出正確答案。Advantage 接著乘上整段 response 的 log probability,方框、推理文字與數學答案一起被增加機率;verifier 並沒有指出是哪幾個 tokens 讓這次作答成立。
7 個真正參與相對學習的正解,各自處理不同數學題,方框格式卻完全共通。第 10 次更新因此同時出現「格式淨增加 61 題、正確題數淨減少 9 題」並不奇怪:固定外觀比不同題目的解法更容易形成重複訊號。這是由 reward contract 與觀察結果支持的解讀,還不是逐 token 的因果證明。
這套預先固定的訓練配方使用 sequence-summed response log probability,每條回答有多少 tokens,就累加多少個 token log probabilities;它也沒有使用長度正規化、KL 或 policy-ratio clipping。當混合對錯的題目只有 5 組,少數 rollouts 便承擔了整趟訓練的 policy-gradient 方向,loss 裡缺少一項明確把更新後 policy 拉回 Base 附近的約束。
Sequence sum 並不會單獨決定回答一定變短,因為正、負 advantage 的 trajectory 都可能很長;但它讓 response length 直接參與每條 trajectory 的梯度尺度。本次只完成這一套配方,沒有 response mean、加入 KL 或更大 group size 的對照,所以它們目前都是下一輪消融要檢查的候選機制。
輸出變短,是另一條同時發生的曲線。把同一批 256 題的輸出長度放回來看,變化在第 10 次更新時已經出現:
模型狀態 總輸出 tokens 平均 中位數 最大值
訓練前 Base 12,679 49.5 8 512
更新 10 次 2,584 10.1 7 512
更新 50 次 1,903 7.4 7 44
第 10 次更新的總輸出量只剩 Base 的 20.4%,中位數卻只從 8 降到 7。較長輸出的尾端先大量消失,多數短回答的長度則相近;到了第 50 次更新,最長回答也只剩 44 tokens。長回答本來就不保證正確,但在題目、prompt、解碼方式與 token 上限全部相同時,這麼大的分布變化又伴隨答對題數從 41 降到 14,把它稱為「模型變得更簡潔」會漏掉真正的代價。
第 50 次更新同時有 255 題符合嚴格格式,本次訓練最後留下的具體形式是:答案更短,更常迅速交出方框,數學正確性卻沒有跟上。Sequence sum、稀疏的正解、缺少 KL 約束與單一 seed 都可能參與其中;要分辨各自的作用,需要改動一項設定後重新訓練,建構完整的 ablation 實驗。
目前能確定的是,本地這次 RLVR 訓練只從 5 組題目取得非零 policy gradient,並在開發集上同時出現輸出長度塌縮與正確題數下降。分離的 500 題 final heldout 與 MATH-500 仍然沒有送進模型,因為打開更多測試題不會替已經失敗的開發結果補出原因。
這次 verifier 發揮應有的職責:錯誤答案沒有拿到 1 分,真正稀缺的是能讓同組候選分出高下的正解,400 個 rollouts 最後只有 7 個正解反應在對錯並存的組別裡。換言之,即使我們能確保評分或模型答對後能拿到的獎勵分數,依然得確認這些答案何時出現,又是在和哪些答案比較?