从 1.56% 到 62.9%:SFT 推理微调优化实战
读完这篇文章,你将用监督微调(SFT)把一个 1.5B 规模的数学模型在 GSM8K 上的零样本推理正确率从 1.56% → 62.9%,同时把输出格式遵循率从 18.9% → 100%。我们将完整走通数据集下载、Prompt 架构、训练配置和评估方法,所有代码均来自本仓库 alignment 文件夹,保证可复现与透明。
本文将深入剖析 llm-from-scratch 仓库中 alignment 模块,展示 SFT 的完整流程。
引言
大语言推理模型常见的两个痛点:一是“答不对”,二是“答不规范”。前者意味着推理链条断裂或迁移失效,后者则让后续评估与系统对接步步惊心。
在这篇 How‑to 指南里,我们用 GSM8K 的标准数据与明确的评估规则,让 Qwen/Qwen2.5-Math-1.5B 通过 SFT 后,能力迁移到不同的数据集上, 学会“思考→作答”的结构化输出:不仅更常答对,也更懂规范。结果来自实测,正确率由 1.56% 提升到 62.9%,格式遵循由 18.9% 提升到 100%.
为什么零样本推理和“格式遵循”都很难?
- 零样本推理难在“迁移”:模型虽见过大量文本,但缺少对“分步算术、单位处理、等式化简”的系统化经验,容易在多步推理或细节规范上出错。
- 格式遵循难在“约束学习”:即使模型知道答案,若不按系统约定的输出协议(例如必须有
<think>...</think> <answer>...</answer>),评估与下游解析都会失败。 - 两者耦合:不遵循格式会直接“判零分”,即使答案正确;而缺少分步推理(think)又会影响最终答案(answer)的稳定性。
一个好比喻:把模型想象成一个聪明但散漫的学生。零样本时,它能“蒙”对少数题;SFT 就像班主任的“规范化带教”,教它先写草稿()再交最终答案(),且必须按卷面格式来——这样既能提高质量,也能让阅卷更可靠。
核心概念与评估口径
- 监督微调(SFT):用标注样本(这里是 GSM8K 的“问题 + 推理过程 + 最终答案”)对模型做下一 token 预测训练。通过标签掩码,只对“推理与答案”部分计算损失,指导模型输出完整的思维链与答案。
- Prompt 架构:我们采用 R1 风格模板,强制输出
<think>和<answer>标签,保证格式可解析:<think> ... </think>:推理过程<answer> ... </answer>:最终答案
- 训练目标(Loss Target):标准自回归语言模型(next-token LM)损失,但只在“回应(think+answer)”区间计算,避免模型学习到重复的“系统提示与问题”的 token 序列。
- 评估指标:
- “推理准确率”:按每条样本的 答案是否正确(数学同值、LaTeX 等价、数值等价,详见 grader)计分 0/1,最后取平均。
- “格式遵循率”:按每条样本 是否包含合法的
<think>...</think> <answer>...</answer>标签计分 0/1,最后取平均。
我们在 alignment/drgrpo_grader.py 中实现了严格的格式检查与宽容但可靠的数学等价判断(符号化、数值化与 LaTeX 解析的组合),是本文准确率与格式遵循的核心评估逻辑。
方案与架构
本文的流水线架构如下:从 GSM8K JSONL 到 Prompt 构造,再到 SFT 训练与 vLLM 推理评估,最后汇总指标(准确率/格式遵循)。
