iT邦幫忙

2026 iThome 鐵人賽

DAY 18
0

4^6 = 8^n,那麼 n 是多少?這道的解法之一是把兩邊改寫成 2 的次方,就會得到 2^12 = 2^(3n),所以 n=4。我們的 Qwen3-0.6B-Base 模型也能完成這樣的推導,最後交出 \boxed{4},順利通過 final-answer verifier。

只是它的完整輸出跟你我推理的脈絡不同,而且是從另一個數字開始的:

$n=3$
To solve the equation 4^6 = 8^n ...
...
12 = 3n
n = 4
\boxed{4}

如果資料集只保存 problemresponsecorrect=true,開頭那個 3 很容易被「最後答案正確」一起被混入看似合格的推理軌跡中。Verifier 的判定並沒有錯,畢竟它只負責檢查抽取出的 final answer;真正危險的是我們把這個有限的判定,擴張成「整段 reasoning 都是對的」。

前幾天的鐵人賽內容都在增加 inference-time compute,模型權重始終沒有改變。從 Day 18 開始,我們要準備真正送進 SFT 的資料,一旦錯誤軌跡成為 training target,模型便會被要求逐 token 模仿它。候選答案選錯只影響一道題,教師資料的錯誤則可能被寫進 checkpoint,兩者的代價完全不同。

在 Sebastian Raschka 的 reasoning-from-scratch 實作脈絡裡,可由答案檢查器判斷的數學題會成為後訓練的重要材料。本日將沿用這個敘事軌跡,資料 lineage、quarantine、格式修復與切分契約則是我們加上的工程擴充。目標不是蒐集看起來像解答的文字,而是讓每一筆 supervision 都能回答:題目從哪裡來、由哪個模型生成、哪一部分被驗證、為何被選中,以及它有沒有誤觸 evaluation data。

來源只使用 frozen G3 training split。當中共有 10,985 題,我們以固定 namespace 對 row ID 做 SHA-256 排序,取前 2,048 題;validation 不參與生成或選擇,MATH-500 也繼續封存。這種選法並不會取到「最具代表性」的數學題,作用是讓同一份設定每次都會得到完全相同的 source rows,又不必依賴檔案當下的排列順序。

每道題由固定版本的 Qwen3-0.6B-Base 推理模型生成四個候選答案,seeds 固定為 2801 到 2804,sampling 使用 temperature 0.7、top-p 0.95、top-k 50 與 256-token 上限。Reference answer 不會出現在 prompt,完整文字生成後才交給 verifier。正式 run 全程使用 RTX 3090 Ti、CUDA 與 bfloat16,總計處理 946,832 個 input tokens、產生 1,370,383 個 output tokens,peak allocated VRAM 為 6,210,343,936 bytes。

最後的資料分布列表是:

source tasks                         2,048
GPU-generated candidates             8,192
final-answer verified candidates       855
tasks with at least one verified       499
frozen reasoning examples              400
train / calibration                 320 / 80
validation generations                    0
sealed-test inference                     0

Candidate-level 的通過率是 855/8,192,也就是 10.44%;把每題四次機會合在一起,則有 499/2,048 題至少出現一次合格答案,約 24.37%。這兩個比例回答不同問題:前者描述一個隨機候選有多常答對,後者描述這批 source tasks 有多少能為資料集提供至少一筆可用候選。多抽樣提高了收集到正解的機會,仍沒有替中間步驟背書。

若同一題有多個候選通過 verifier,凍結規則選擇 sample ID 最早的一筆,不在看完文字後挑一份最漂亮的解答。資料量上限也事先固定為 400,因此 499 道可用題裡有 99 道被記為 verified_but_outside_frozen_capacity。它們並沒有答錯,只是超出本次預先決定的訓練規模;保留這個理由,讓我們在事後檢查時,才不會讓未入選資料看起來像被 verifier 否決。

Quarantine 總共有 8,985 筆紀錄,其中 6,443 個候選答案錯誤、759 個落入 verifier 尚不支援的表示式、135 個找不到可抽取答案;另有 1,549 筆 task-level 紀錄表示該題四次都沒有合格候選答案,再加上前述 99 筆容量外資料。這個總數比 8,192 個 candidates 還大,是因為它同時保留 candidate-level 與 task-level 的淘汰原因,並非憑空多生成了 793 份答案。

一筆凍結 example 也不能只留下最後文字,實際 schema 至少保留下列層次:

source
  dataset / revision / row_id / problem hashes / license
teacher
  model revision / sample_id / candidate hash / device
verification
  final-answer result / method / pre-repair format
  intermediate_steps_independently_verified = false
targets
  answer_only / trajectory / process_structured_proxy
  format_repaired

這裡最重要的欄位那個 false,因為400 筆 examples 全部通過 final-answer verifier,但獨立通過 step verification 的數量仍是 0。並非我們少做勾選,而是目前的證據顯示;只要沒有人工 process label 或逐步 verifier,就應該把它寫進 record,而不是讓讀者從 correct=true 自行猜測。

格式也必須與內容分開處理,400 筆被選中的 trajectories 裡,有 375 筆沒有以規定的 boxed answer 收尾,管線使用 deterministic append_canonical_boxed_line_v1 補上一行標準答案,同時留下 format_repaired=true。這項 repair 只讓 target 符合輸出契約,不會刪除前文的錯誤,也不會把開頭的 n=3 改成 n=4。修過格式的 reasoning,依然只是 answer-verified reasoning。

每筆 example 因此保留三種 target。answer_only 只有 canonical final answer;trajectory 保存原始完整輸出與必要的 boxed-line repair;process_structured_proxy 再以 deterministic 規則把同一段文字切成 Step 1Step 2。最後一種名稱則留下 proxy,畢竟加上編號也不會讓推理語句獲得新的證據。

凍結後的 400 題沒有 normalized-problem duplicates,再用另一個固定 namespace 分成 320 筆 train 與 80 筆 calibration,兩邊沒有交集,也不與 validation 或 sealed test 重疊。Manifest 保存 candidates、examples、quarantine 與兩個 split 的 hashes;source ledger 分開記錄原始資料集、wrapper、teacher model 與各自授權;dataset card 則說明用途與限制。這些看似行政性的檔案,會在最後方便我們掌握 checkpoint 究竟模仿過哪些文字?

所以,我們在今天鐵人賽中保留的不只是 400 筆可做為 gold standard 的解法,而是 400 筆來源可追溯、final answer 可驗證、限制也明確保存的 synthetic examples。文章開頭的指數題的推理軌跡依然從 n=3 開始,最後才抵達 n=4,而我們最終也沒有將其稱為逐步正確。教師資料值得信任的地方,在於我們能精確說出哪些推理過程已有充分證據去支持、哪些還沒有,而不是真的搞到每一行都像教科書。


上一篇
Adaptive compute—困難題目要想多久?
系列文
模型真的會推理嗎?30 天從 Base Model 打造可驗證的小型推理模型18
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言