一鱼两吃:为什么 SFT 和 GRPO 可以共用同一批数据

引言

在传统机器学习范式中,我们习惯将"训练集"与"测试集"严格分离,不同训练阶段使用不同数据集几乎是金科玉律。然而,DeepSeek R1 的训练流程(SFT + GRPO)却打破了这一惯例------在两个阶段使用同一批(或高度重叠的)数据,不仅可行,而且是一种极其高效的策略

这背后的核心洞察是:两个阶段利用数据的"维度"不同,训练目标完全互补。

为了便于理解,我们用一个"学生解题"的比喻来拆解这个过程。


第一阶段:SFT------老师讲题,学生"抄写"

数据格式<Prompt, Thinking_Process, Final_Answer>

在监督微调(Supervised Fine-Tuning)阶段,模型扮演的是一个"认真听课的学生"。它看到题目后,会逐字逐句地学习老师提供的标准解题过程

核心目标 :让模型掌握格式与套路 。例如学会使用 <think> 标签、学会分步骤推理、学会组织思维链的语言风格。

内在局限:模型可能只是在"死记硬背"老师的解法,并未真正理解每一步推导的内在逻辑。就像学生能复述老师的板书,却不一定能独立应对变式题。


第二阶段:GRPO------遮住答案,学生"刷题"

数据格式<Prompt, Final_Answer>(丢弃 Thinking_Process)

在强化学习(Group Relative Policy Optimization)阶段,我们依然使用同一批题目,但有意隐去老师的解题过程,只保留最终答案作为评判标准。

训练流程

  1. 仅向模型展示题目 Prompt
  2. 让模型自主生成多条不同的解题路径(Group Sampling)
  3. 仅校验最终答案:与 Final_Answer 一致则奖励,否则惩罚

核心目标

  • 泛化能力:模型可能发现比 SFT 示例更简洁、更巧妙的解题路径------殊途同归,条条大路通罗马
  • 鲁棒性:SFT 只能教会一条路,GRPO 则强迫模型无论选择哪条路径,都必须抵达正确终点

为什么"同数据复用"效果出奇地好?

这种"一鱼两吃"的策略,在 7B 级别的小模型上尤其有效,它精准解决了两个核心痛点:

痛点一:分布漂移(Distribution Shift)

脑子学会了,手却不会动

如果 SFT 阶段使用"高等数学"题目,而 GRPO 阶段切换到"小学算术",模型会陷入困惑:它在 SFT 中学到的微积分符号、极限推导等"招式",在简单算术场景中完全派不上用场。

同数据复用的优势 :确保模型在 SFT 阶段习得的思维链格式、推理语气等"招式",能在 GRPO 阶段立即投入实战。只不过这一次,它需要独立走完全程,以验证自己是否真正"内化"了这些能力。

痛点二:标注成本高昂(Ground Truth is All You Need)

数据标注的经济学:

  • SFT 数据昂贵:需要 DeepSeek R1 等顶级模型生成高质量的思维链(Chain-of-Thought),每条数据的生成成本不菲
  • GRPO 数据廉价:仅需题目与标准答案,无需中间过程

同数据复用的优势:既然为 SFT 已经采集了"题目 + 答案",直接将其复用为 GRPO 的奖励信号来源,是极其划算的选择。无需额外寻找新的带标准答案的题库。


两阶段的本质差异:一张表说清楚

维度 SFT 阶段 GRPO 阶段
数据视角 Prompt + Teacher's CoT Prompt + Ground Truth
学习目标 模仿老师的解题动作 无论什么动作,算对即可
核心能力 格式规范、推理框架 泛化能力、自主探索
类比 跟着老师抄笔记 独立完成课后作业

实操流程:三步走策略

复制代码
Step 1: 准备题库
        收集 1000 道数学题/代码题(含标准答案)
              │
              ▼
Step 2: SFT 阶段
        用 Teacher 模型生成详细解题步骤
        训练 Student 模型学习"怎么思考"
              │
              ▼
Step 3: GRPO 阶段
        仅使用题目 + 最终答案
        训练 Student 模型"自己思考并做对"

结语

DeepSeek R1 的训练范式揭示了一个深刻的洞察:数据的价值不在于数量,而在于如何从不同维度榨取信息。SFT 教会模型"形",GRPO 锤炼模型"神"。同一批数据,前者取其过程,后者验其结果------这正是"一鱼两吃"的精髓所在。

对于资源有限的小模型训练场景,这种策略在数据效率和训练效果之间取得了精妙的平衡,值得从业者借鉴。

相关推荐
TracyCoder1236 小时前
LeetCode Hot100(34/100)——98. 验证二叉搜索树
算法·leetcode
A尘埃6 小时前
电信运营商用户分群与精准运营(K-Means聚类)
算法·kmeans·聚类
power 雀儿7 小时前
掩码(Mask)机制 结合 多头自注意力函数
算法
会叫的恐龙7 小时前
C++ 核心知识点汇总(第六日)(字符串)
c++·算法·字符串
小糯米6017 小时前
C++顺序表和vector
开发语言·c++·算法
We་ct7 小时前
LeetCode 56. 合并区间:区间重叠问题的核心解法与代码解析
前端·算法·leetcode·typescript
Lionel6897 小时前
分步实现 Flutter 鸿蒙轮播图核心功能(搜索框 + 指示灯)
算法·图搜索算法
小妖6667 小时前
js 实现快速排序算法
数据结构·算法·排序算法
xsyaaaan7 小时前
代码随想录Day30动态规划:背包问题二维_背包问题一维_416分割等和子集
算法·动态规划
zheyutao8 小时前
字符串哈希
算法