# 小模型怎麼學會解數學題？

> 讓 1.5B 的小模型模仿 DeepSeek-R1 的解題過程，用監督式微調學會反思和驗算。看資料怎麼篩、怎麼訓練、怎麼評分。

- 作者：Michael Kuo（https://mk-ai-notes.pages.dev/about/）
- 發布日期：2026-11-02（2026-11-02T20:04:00+08:00）
- 原文網址：https://mk-ai-notes.pages.dev/posts/ep04-math-reasoning/
- 分類：一人公司工作流＋學習系列（https://mk-ai-notes.pages.dev/category/workflow/）
- 系列：動手學大模型 12 問 第 5 篇／共 12 篇（https://mk-ai-notes.pages.dev/series/dive-into-llms/）
- 標籤：微調、數學推理、DeepSeek
- 閱讀時間：約 9 分鐘（約 1296 字）
- 參考來源：https://github.com/Lordog/dive-into-llms/tree/main/documents/chapter4

![小模型怎麼學會解數學題？](https://mk-ai-notes.pages.dev/og/ep04-math-reasoning.png)

---

## 一句話回答

讓小模型「抄大模型的解題筆記」。這章拿 DeepSeek-R1 寫好的詳細解題過程當教材，用監督式微調（Supervised Fine-Tuning，SFT）訓練 Qwen2.5-Math-1.5B，讓它學會一步步推理、反思和驗算。這種「用強模型的輸出教弱模型」的做法，叫資料蒸餾（Data Distillation）。

## 為什麼值得知道

很多人以為模型會不會推理只看參數多大，其實訓練資料同樣重要。

- **成本**：大模型慢又貴，小模型若能學到部分推理能力，比較有機會放在自己的伺服器上。
- **看懂新聞**：近年常聽到「某某小模型蒸餾自 R1」，這章就是在示範那是什麼意思。
- **方法可以搬**：「篩資料 → 格式化 → 微調 → 自動評分」這條流程，換成其他任務也是同一套思路。

## 白話原理

想像一個數學底子不錯、但不會寫解題過程的學生。你給他一本頂尖老師的詳解，裡面還寫著「等一下，這裡好像算錯了……」。學生反覆模仿，就會養成回頭檢查的習慣。

對應到這章：

| 比喻 | 實際內容 |
|---|---|
| 頂尖老師 | DeepSeek-R1，會寫很長的思考過程 |
| 詳解本 | DeepMath-103K 資料集裡 R1 的解題過程 |
| 學生 | Qwen2.5-Math-1.5B 基座模型 |
| 模仿練習 | SFT：讓模型學著逐字產生同樣的回答 |
| 考試 | MATH500 測試集，對答案算正確率 |

有兩個重點：

1. **學的是「過程」不只是「答案」**：訓練資料把 R1 的推理包在 `<think>` 標記裡，模型學到的是思考的樣子。
2. **基座模型本來不會對話**：Qwen2.5-Math-1.5B 是沒經過指令微調的基座模型，只會接著文字往下寫。微調後才有基本的「聽題目、回答」能力。

## 教程裡實際做了什麼

工具是 Hugging Face 的 **Transformers**、**Datasets**，推理用 **vLLM**，全部放在一個 Jupyter 筆記本 `sft_math.ipynb` 裡。

1. **下載資料**：DeepMath-103K 約有 10.3 萬題高難度數學題，每題附難度標註和 R1 的三條推理路徑。原文特別提到，這份資料已和主流數學測試集去重，避免「考古題洩題」。
2. **篩選資料**：只留下最終答案是純數字的題目，方便之後自動對答案。
3. **整理格式**：每題取第一條 R1 解答，用模型的對話模板（chat template）包成「使用者問題＋助理回答」，回答開頭加上 `<think>`。
4. **長度篩選**：R1 的回答平均約 5,000 個 token，筆記本只保留長度小於 4,096 的樣本，配合模型的長度上限。
5. **訓練**：以 BF16 精度微調，學習率 1e-6、訓練 3 輪，用 Transformers 的 Trainer 執行。
6. **生成**：用 vLLM 對 MATH500 的 500 題作答，同樣在提示後面加 `<think>` 引導模型先思考；溫度設 0，也就是每次都選機率最高的字。
7. **評分**：用規則抽出答案裡 `\boxed{}` 的內容，再用比對函式判斷和標準答案是否相等，算出正確率。

訓練參數的設定大致如下（摘自原教程第 4 章筆記本，有刪節）：

```python
TrainingArguments(
    per_device_train_batch_size=4,  # 顯存不足時改成 1
    gradient_accumulation_steps=16,
    num_train_epochs=3,
    learning_rate=1e-6,
    bf16=True,
)
```

原文觀察到，微調後的模型有了基本的指令遵循能力，明顯會反思（常出現「confirm」），也會寫程式驗算。

**硬體需求**：原文寫明至少要 **40GB 顯存**的 GPU，筆記本實際用的是單張 80GB 的 A100；磁碟至少預留 50GB，放模型、資料和訓練存檔。原文沒有公布微調後的正確率數字，要自己跑出來。

## 動手試試

老實說，完整流程一般筆電做不到，免費版 Colab 的 GPU 顯存也不夠 40GB。可以分段體驗：

1. **只看資料**：在 Colab 或筆電用 Datasets 載入 DeepMath-103K，打開幾題 R1 的解答，看看「反思」長什麼樣子。這一步不需要 GPU。
2. **只玩 tokenizer**：載入 Qwen2.5-Math-1.5B 的 tokenizer，用對話模板把一題包起來印出，理解模型實際看到的格式。
3. **整套訓練**：要租有 40GB 以上顯存的雲端 GPU（例如 A100）。筆記本註解建議顯存不夠時把 batch size 調成 1、開啟 gradient checkpointing，但能不能在更小的卡上跑完，原文沒有保證。

建議先抽一小部分資料試跑，沒問題再跑全量。

## 常見誤解

- **「蒸餾就是把大模型壓縮成小模型」**：這章不是直接壓縮權重，而是用大模型產生的「文字資料」來訓練小模型。
- **「小模型學完就跟 R1 一樣強」**：它學到的是推理習慣，能力上限還是受模型大小限制，正確率要用測試集實測。
- **「評分就是看答案字串一不一樣」**：數學答案有很多寫法（分數、小數、化簡前後），要用專門的比對函式判斷。

## 延伸閱讀

- 原教程第 4 章：https://github.com/Lordog/dive-into-llms/tree/main/documents/chapter4
- DeepMath-103K 資料集：https://huggingface.co/datasets/zwhe99/DeepMath-103K
- Qwen2.5-Math-1.5B 模型：https://huggingface.co/Qwen/Qwen2.5-Math-1.5B

> 本文整理自上海交通大學《動手學大模型》第 4 章，原教程：https://github.com/Lordog/dive-into-llms/tree/main/documents/chapter4。內容由 MK 以自己的話解說，如有錯誤歡迎留言指正。

---

本系列整理自上海交通大學《動手學大模型》公益教程（https://github.com/Lordog/dive-into-llms），以自己的話解說，非官方內容。

引用本文請附原文網址：https://mk-ai-notes.pages.dev/posts/ep04-math-reasoning/（作者：Michael Kuo）
