本日我們將沿著第 2 次更新,看到 verifier 給出的 1 分經過 advantage 與 response log probability;這一步的 gradient norm 是 256.815,裁切後真的送進 AdamW。這確認了訓練程式能把學習訊號傳到權重;模型是否因此更會解題,還得讓各個 checkpoint 回到同一批沒看過的題目上比較。
這次訓練會先來決定什麼是「最好」?我們依序使用 50 道 prompts,每題抽 8 個 rollouts,完成一組後更新一次。我們沒有只保留最後一步:除了起點的 Base,第 10、20、30、40、50 次更新後都各存一份 checkpoint,也就是同一趟連續訓練在不同時間留下的權重快照。
為什麼每 10 次更新存一次?Raschka 原始 Chapter 6 實驗要觀察的是訓練前段可能出現的 early gain。如果只留下 Base 與最後一步,「一路退化」和「曾經進步、後來又跌回去」都只剩同一個終點,前段發生過什麼便無從判斷。
我在訓練前先把挑選規則固定下來:五個訓練後 checkpoint 之中,先選開發集答對題數最多的版本;如果平手,留下較早的一份。選出代表之後,再拿它和 Base 比較。這是兩個不同的判斷,因為五個退化版本照樣能選出冠軍,冠軍卻可能落後訓練前的模型。
開發集(development set)共有 256 道內部數學題,在任何模型開始作答前便已凍結,也沒有和 50 道 training prompts 重疊。Base 與五個 checkpoint 使用相同 prompt、最多 512 個輸出 tokens 與 greedy decoding,每題只生成一份 response,不靠多抽幾次再挑中正解。這批題目負責 checkpoint selection;另外保留的 final heldout,等模型先通過這一關才會開啟。
評估時,「數學答對」和「交出指定格式」分開計算。答案分數檢查 final answer 是否與 reference 等價;沒有方框時,就沿用事前固定的規則,取 response 最後出現的數字。格式分數只記錄輸出有沒有符合 boxed-answer contract。學會輸出 \boxed{...} 會提高格式分數,數學分數仍由方框裡的答案決定。
這個區分是可以改變結論的,Base 答對的 41 題中,有 16 題沒有符合嚴格格式;若改成「沒有方框就算錯」,Base 只剩 25 題,第 10 次更新的 32 題便會看似進步 7 題。這 7 題是計分契約製造的差距,因此本日仍以答對題數選 checkpoint,格式另外報告。
六個模型狀態在同一批 256 題上的結果如下:
模型狀態 答對題數 符合嚴格格式 輸出 tokens
訓練前 Base 41/256 186/256 12,679
更新 10 次 32/256 247/256 2,584
更新 20 次 19/256 34/256 1,989
更新 30 次 18/256 254/256 2,865
更新 40 次 19/256 252/256 3,449
更新 50 次 14/256 255/256 1,903
可發現五個 checkpoint 全部低於 Base,都沒有勝過 baseline。依照固定規則,第 10 次更新以 32 題成為訓練後最佳 checkpoint,仍比 Base 的 41 題少 9 題;換成 pass@1,兩者是 12.50% 與 16.02%。「訓練後最佳版本」只代表它贏過另外四份訓練後權重,整張表的第一名仍是 Base。
曲線中間還反彈了一題。第 20、30、40、50 次更新分別答對 19、18、19、14 題,第 40 次雖然比前一個 checkpoint 多答對一題,仍比 Base 少 22 題。第 10 次更新已是整段訓練的最高點,事前決定觀察的五個時間點沒有出現 early gain;如果只保存最後一步,拿到的反而是這條曲線上答對最少的版本。
真正容易誤讀的是格式分數。如果改用這一欄,第 50 次更新會以 255 題勝出;若偏好最少的輸出 tokens,同一個 checkpoint 也會勝出,但它只答對 14 題。Base 到第 50 次更新的格式通過數從 186 增至 255,總輸出長度從 12,679 tokens 縮到 1,903,正確題數則從 41 降至 14。選哪一欄,就等於先決定「最好」究竟指什麼。
格式變化也不是平滑前進:第 10 次更新已有 247 題符合嚴格格式,第 20 次卻掉到 34 題,之後又回到 254、252 與 255 題。答對題數沒有跟著這次劇烈變化走,第 20 與第 30 次更新分別答對 19 與 18 題。格式、長度與數學正確性,在變化曲線上是三個不同的測量結果。
訓練時的平均 reward 0.0375 對應的是另一批資料與抽樣條件,我們可以注意到 reward 有所變化,但作答正確的題數卻沒有跟著反應。Training reward 來自 50 道 training prompts、temperature 0.8、top-p 0.9 抽出的 400 個候選,而且 policy 在過程中持續改變;開發集則固定 256 題與 greedy decoding,每個模型狀態各回答一次。前者描述訓練途中抽到多少個正解,後者才是六個 checkpoint 在同一條件下的比較。
把三種數字放回各自的問題,就能更理解其代表的意義:training loss 回答 optimizer 是否正在更新,training reward 記錄候選有多少通過 verifier,開發集答對題數才告訴我們保存下來的模型能不能解出新題。。
評估前,我也把五個 checkpoint 重新載入,用固定 probes 比對儲存前後的 logits,最大絕對差都是 0.0。權重檔案與版本載入無誤之後,這條下降曲線就是本次評估得到的結果。
這次比較使用的是內部開發集,結論範圍是本地這套模型與 reward 設計。五個 checkpoint 全部低於 Base,因此分離的 500 題 final heldout 與 MATH-500 繼續保持未開封,一題都沒有送進模型。
第 10 次更新因此被留下來做後續診斷,Base 仍是目前較好的模型。Day 22 的「答對者得一分」的設計的確讓權重變動;完整 checkpoint curve 顯示的是,這次權重移動沒有換來更多正確答案,伴隨它出現的反而是更短、格式更固定的回答。