第7章:Self-Improvement 与 SFT-RL Flywheel
Rejection Fine-tuning、ReST/ReST^EM、STaR、Synthetic Data、Self-play 等自我改进算法,以及 SFT → RL → 采样 → SFT → RL 飞轮的工程模式
DeepSeek R1、OpenAI o3、Claude 4.x 都在用一个反直觉的训练栈:SFT → RL → 用 RL 采样数据 → 再 SFT → 再 RL——一遍遍轮转。这就是 SFT-RL flywheel(自改进飞轮)。本章讲清:为什么 RL 训完还要回去 SFT、Rejection Fine-tuning 怎么做、ReST/STaR 是什么、合成数据怎么不让模型 collapse、self-play 在 LLM 时代的新意——读完你能给自己的模型设计一个长期演进的 roadmap。
📑 目录
- 1. 为什么 RL 训完要回去 SFT
- 2. Rejection Fine-tuning(RFT)
- 3. ReST / ReST^EM
- 4. STaR / Quiet-STaR
- 5. Synthetic Data:模型自造训练数据
- 6. Self-play:agent 互相博弈
- 7. SFT-RL Flywheel 的工程模式
- 8. 警惕:模型崩溃与能力收窄
- 自我检验清单
- 参考资料
1. 为什么 RL 训完要回去 SFT
1.1 RL 训出来的模型有几个”病”
RL 后模型的典型问题:
① 输出风格变怪(过拟合 reward 形态,如疯狂用 boxed)
② Format / 思考链冗长(为了拿满 reward 拉长思考)
③ 在简单任务上"过度推理"
④ Catastrophic forgetting:RL 训练时其他能力可能退化
1.2 SFT 怎么”修复”
把 RL 模型采样的正确+精炼的样本,作为新 SFT 数据:
RL 模型 ──→ 采样 N 个 trajectory
↓
筛选(只留正确 + 简洁)
↓
作为 SFT 数据 ──→ 再 SFT
↓
得到"既会推理又输出干净"的模型
↓
可以再进入下一轮 RL
1.3 经验数据
DeepSeek R1 论文:
- R1-Zero(纯 RL):推理能力强,但输出可读性差,语言混杂
- R1(SFT cold start + RL + SFT clean + RL):推理 + 可读性 + 多语言全好
🌟 关键洞察:RL 是”放大器”,SFT 是”整形器”,两者互相需要。
2. Rejection Fine-tuning(RFT)
2.1 算法
1. 拿当前模型 M(可以是 SFT 或 RL 训过的)
2. 对每个 prompt,采 N 个 response(温度 > 0)
3. 用 verifier 筛选 → 留下"对的"
4. 对正确 response 再加一道筛选:
- 长度 < threshold(精炼)
- 没有 reward hacking 模式
- 多样性(去重)
5. 把筛后的 (prompt, response) 当 SFT 数据训新模型 M'
2.2 数学等价性
RFT 数学上等价于:用一个简单 binary verifier 做的 RL——只是不用 PG 而用 SFT loss。
但实操上 RFT 比 RL 简单 100 倍:
- 不用 critic
- 不用 advantage 计算
- 不用 KL penalty(过拟合靠 epoch 控)
- 训练像普通 SFT 一样稳
2.3 何时用 RFT 而非 GRPO
| 场景 | 推荐 |
|---|---|
| 想”白嫖” RL 能力但不想搞复杂工程 | ✅ RFT |
| 资源受限(单机几卡) | ✅ RFT |
| 有质量数据 verifier | ✅ RFT |
| 需要”emergent capability”(self-correction 等) | ❌ 必须 GRPO |
| 需要 long trajectory 推理能力 | ❌ 必须 GRPO |
🍎 RFT 是 GRPO 的”穷人版”——80% 收益,20% 复杂度。中小团队的入门选项。
2.4 工程实现
def rejection_fine_tuning(
model, prompts, verifier,
n_samples_per_prompt=16,
selection_strategy="best_of_n",
n_epochs=2,
):
sft_data = []
for prompt in prompts:
# 1. 采样
responses = [model.generate(prompt, temperature=1.0) for _ in range(n_samples_per_prompt)]
rewards = [verifier(r, prompt) for r in responses]
# 2. 筛选
if selection_strategy == "best_of_n":
best = responses[rewards.index(max(rewards))]
if max(rewards) > 0.5:
sft_data.append((prompt, best))
elif selection_strategy == "all_correct":
for r, reward in zip(responses, rewards):
if reward > 0.5:
sft_data.append((prompt, r))
# 3. SFT
new_model = sft(model, sft_data, n_epochs=n_epochs)
return new_model
3. ReST / ReST^EM
Reinforced Self-Training, Google DeepMind, 2023-2024
3.1 ReST 算法
Outer loop(grow):
for iter in 1..N:
采样大量数据(用当前模型)
用 verifier 筛(类似 RFT)
Inner loop(improve):
for epoch in 1..K:
SFT on filtered data
ReST 是 “grow + improve” 双层循环——和 RFT 类似,但显式分两层:外层换数据,内层做几个 epoch SFT。
3.2 ReST^EM(EM 算法变体)
ReST^EM 把外层叫 E-step(expectation,采数据 + 筛),内层叫 M-step(maximization,SFT)——让人立刻想起 EM 算法。
理论保证:在某些条件下 ReST^EM 等价于”用 LLM 自己当 reward model 的 RL”。
3.3 与 RFT 的差异
| 维度 | RFT | ReST / ReST^EM |
|---|---|---|
| 迭代 | 单次 | 多次 grow + improve |
| 数据源 | 一次性采完 | 每轮重新采(用最新模型) |
| 目标 | 工程实用 | 理论分析(EM) |
4. STaR / Quiet-STaR
4.1 STaR(2022)
Self-Taught Reasoner
教模型”自己生成思维链”:
1. 给模型(prompt + 答案),让它生成"对应思维链"
2. 思维链能正确推到答案 → 留下
3. 用筛后的 (prompt, 思维链, 答案) SFT
是最早的”模型自造训练数据”探索——后来 reasoning 训练的核心思想。
4.2 Quiet-STaR(2024)
更激进:让模型在每个 token 之前都”安静地”生成 rationale(不输出),然后这个 rationale 帮助预测 next token。如果有用 → reinforce;没用 → 弃。
不需要外部 supervision——纯 self-supervised 学推理。
4.3 工业落地
STaR 思想被 OpenAI o1、DeepSeek R1 间接采用——R1 的 cold start data 就是从一个”小老师模型”用 STaR 风格生成的推理数据。
5. Synthetic Data:模型自造训练数据
5.1 范式
强模型 M_strong ──→ 生成大量(prompt, answer)
↓
filter / verify
↓
作为 SFT data
↓
训弱模型 M_weak → 能力接近 M_strong
或者:
M ──→ 自己生成数据 ──→ 筛 ──→ SFT ──→ M' ──→ 重复
后者就是 self-distillation flywheel。
5.2 真实案例
| 模型 | 合成数据来源 |
|---|---|
| Llama 3 SFT | 部分用 Llama 2 70B 合成 |
| Phi-3 / Phi-4 | 大量 GPT-4 合成 textbook |
| DeepSeek-V3 / R1 | 自己上一代模型生成 |
| OpenAI o1 / o3 | 内部模型生成 reasoning chain |
🍎 2025 一个共识:90% 的 post-training data 是合成的,人类标注只覆盖关键领域 + 安全 + alignment。
5.3 合成数据的”幻觉”风险
合成数据可能含错误事实——模型的”幻觉”被复制到下一代。
防御:
- Verifier 严格筛
- 多样性强制(不同 prompt 模板)
- 与人工高质量数据混合(8:2 ~ 9:1)
- Cross-validation:不同模型生成,互相筛
6. Self-play:agent 互相博弈
6.1 经典思想
AlphaGo / AlphaZero 用 self-play(自己和自己下)在围棋称霸。LLM 时代有类似变体。
6.2 LLM 的 self-play 形态
| 形态 | 例子 |
|---|---|
| 辩论 self-play | 两个 agent 辩论,LLM judge 打分,reward 输方学错在哪 |
| 教学 self-play | 一个 agent 出题,另一个解,出题方根据”难度差”调难度 |
| 博弈 self-play | 多 agent 谈判 / 拍卖,reward 由结果定 |
| Critic self-play | 一个 agent 提建议,另一个 critic 找漏洞 |
6.3 工业案例(rumor)
- DeepSeek R1 据说用了 self-play 阶段(具体方式没披露)
- Anthropic Constitutional AI 部分用了 critic self-play
6.4 风险
- 同质化:两个 agent 都是同一模型,容易陷入局部最优
- 奖励 hacking:一方 hack judge,另一方学 hack 模式
- 算力极贵:每条数据要多次 rollout
7. SFT-RL Flywheel 的工程模式
7.1 完整流水线
┌──────────────────────────────────────────────────────────┐
│ Generation 1: │
│ Base model │
│ ↓ SFT(初始 cold start data,可能来自 stronger 模型) │
│ M1_sft │
│ ↓ GRPO(verifier-based) │
│ M1_rl │
│ ↓ RFT(从 M1_rl 采样 + 筛) │
│ M1_rft │
│ ↓ DPO/RLHF(alignment) │
│ M1_release │
└──────────────────────────────────────────────────────────┘
↓
┌──────────────────────────────────────────────────────────┐
│ Generation 2: │
│ M1_release ──→ 生成 G2 训练数据 │
│ ↓ │
│ Base v2 + G2 data ──→ SFT ──→ GRPO ──→ ... │
│ M2_release │
└──────────────────────────────────────────────────────────┘
↓
(持续迭代...)
7.2 每一阶段的目的
| 阶段 | 目的 | 关键超参 |
|---|---|---|
| Pre-training | 通用语言能力 | 数据质量、token 量 |
| SFT cold start | 给 RL 起手姿势 | 1-3 epoch、混合数据 |
| GRPO | 解锁推理 + emergent capability | LR、KL coef、group size |
| RFT | 整形输出风格 | 筛选 threshold、多样性 |
| DPO/RLHF | 安全 + 风格 alignment | β、偏好数据质量 |
| Release | 上线 | — |
7.3 时间轴示例(假设)
Quarter 1: Generation 1 训练完成
Day 1-7: pre-training data prep
Day 8-30: SFT cold start
Day 31-60: GRPO 主训练
Day 61-70: RFT
Day 71-80: DPO alignment
Day 81-90: 评测、上线
Quarter 2: Generation 2(基于 G1 输出生成新 data)
...
工业级模型每代训练 2-3 个月不等。
8. 警惕:模型崩溃与能力收窄
8.1 Model Collapse(模型崩溃)
一个 2024 年被广泛讨论的现象
如果完全用前代模型合成的数据训新一代,模型会逐代退化:
Gen 1: 多样性 = 1.0
Gen 2(用 Gen 1 数据训): 0.85
Gen 3(用 Gen 2 数据训): 0.65
Gen 4: 0.40
...
最终:模型只会输出特定模式
8.2 解法:数据混合
绝不让合成数据占 100%——必须留至少 10-30% 真实人类数据(网页、书籍、人工标注)。
DeepMind 实验:保留 10% 人类数据可以完全避免 collapse。
8.3 Capability Narrowing(能力收窄)
RL 训练在数学上提升了 50%,但通用对话能力退化 5%——这是能力收窄。
防御:
- 训练 batch 多任务混合(数学 + 代码 + 对话 + 工具)
- 定期跑通用 benchmark(MMLU、AlpacaEval)监控退化
- RL 后跑一遍通用 SFT 数据”补课”
8.4 Diversity Loss(多样性丢失)
RL 鼓励 high-reward 模式,多样性被消除——所有回答开头都是 “Let me think about this…”。
防御:
- Entropy bonus(第 3 章)
- 数据 augmentation:相同 prompt 不同 paraphrase
- Final stage 不用 RL,用 SFT 多样性数据
✅ 自我检验清单
- 为什么 RL 后要 SFT:能列出 RL 模型的 4 个典型问题
- R1-Zero vs R1:能讲清两者的训练流程差异和最终质量差异
- RFT 算法:能默写 5 步流程,并写出代码骨架
- RFT vs GRPO:能给出 RFT 适用 / 不适用的场景
- ReST EM 类比:能解释 grow/improve 对应 EM 的 E-step/M-step
- STaR / Quiet-STaR:能讲清两者各自的 self-supervised 思想
- 合成数据 90%:能列出 4 个用大量合成数据的现代模型
- 合成数据风险:能解释 model collapse 现象,以及”留 10% 真实”的防御
- Self-play 形态:能列出 LLM 时代 4 种 self-play 形态
- SFT-RL flywheel:能画出 Gen 1 → Gen 2 的完整流水线
- 能力收窄 / 多样性丢失:能列出 3 种防御措施
📚 参考资料
论文
- STaR (Zelikman et al., 2022):arXiv 2203.14465
- ReST (Gulcehre et al., 2023):arXiv 2308.08998
- ReST^EM (Singh et al., 2024):arXiv 2312.06585
- Quiet-STaR (Zelikman et al., 2024):arXiv 2403.09629
- DeepSeek R1:arXiv 2501.12948 — RL + RFT flywheel 范例
- Constitutional AI (Anthropic, 2022):critic self-play 早期代表
- Model Collapse (Shumailov et al., Nature 2024):Nature 论文
综述
- Self-Improvement Survey —— 各种综述文章
- The Curse of Recursion: Training on Generated Data Makes Models Forget
实战
- HuggingFace TRL:RFT、ReST 都有 example
- Phi 系列模型 paper(微软):合成数据训练范例
- Llama 3 paper:合成数据 + 真人数据混合策略