DeepSeek近期发布的研究成果引发行业关注:一个仅通过后训练阶段优化的较小参数量模型,在多项基准测试中超越了自家更大参数量的基座模型。这一结果打破了参数量决定能力的固有认知,表明后训练阶段的强化学习策略对模型实际表现的影响可能超过预训练阶段的规模扩张。
后训练优化的核心技术路线
DeepSeek采用的方案并非传统的监督微调(SFT),而是在后训练阶段引入了大规模强化学习(RL)。具体技术路径包含拒绝采样与数据筛选、GRPO算法优化、混合奖励模型等关键环节。
在SFT阶段,并非所有训练数据都同等有效。DeepSeek对原始训练数据进行拒绝采样(rejection sampling),只保留模型生成质量最高的样本用于后续训练。具体实现思路如下:
# 伪代码:拒绝采样流程
def rejection_sampling(model, prompts, num_samples=8):
collected = []
for prompt in prompts:
candidates = []
for _ in range(num_samples):
response = model.generate(prompt, temperature=0.7)
score = reward_model.score(prompt, response)
candidates.append((response, score))
best = max(candidates, key=lambda x: x[1])
if best[1] > threshold:
collected.append({"prompt": prompt, "response": best[0]})
return collected
这一步骤的本质是用模型自身生成能力结合奖励模型筛选,构建高质量训练集,避免低质量数据稀释训练效果。
GRPO强化学习算法详解
DeepSeek的后训练核心在于GRPO(Group Relative Policy Optimization)算法。与传统的PPO不同,GRPO不需要训练独立的critic网络,而是通过组内相对优势来估计baseline,大幅降低了训练资源消耗。
import torch
def grpo_loss(policy_model, ref_model, prompts, group_size=8):
losses = []
for prompt in prompts:
responses = [policy_model.generate(prompt) for _ in range(group_size)]
rewards = [reward_model(prompt, r) for r in responses]
rewards = torch.tensor(rewards)
advantages = (rewards - rewards.mean()) / (rewards.std() + 1e-8)
for response, advantage in zip(responses, advantages):
log_ratio = policy_model.log_prob(response) - ref_model.log_prob(response)
ratio = torch.exp(log_ratio)
surr1 = ratio * advantage
surr2 = torch.clamp(ratio, 1-0.2, 1+0.2) * advantage
policy_loss = -torch.min(surr1, surr2)
kl = log_ratio.mean()
losses.append(policy_loss + 0.04 * kl)
return torch.stack(losses).mean()
GRPO的关键创新在于省去了价值网络(value network)的训练,直接用同一prompt下多个采样的奖励值做归一化得到优势函数。这意味着训练时GPU显存占用显著降低,中小团队也能承担后训练成本。
奖励模型设计中的工程决策
后训练效果好坏,奖励模型的质量是决定性因素。纯依赖学习型奖励模型容易遭到reward hacking,模型学会钻奖励模型的漏洞而非真正提升能力。DeepSeek采用规则奖励与模型奖励的混合策略:
- 数学推理任务:使用最终答案的正确性作为规则奖励,确定性高
- 代码生成任务:通过单元测试通过率作为奖励信号
- 开放对话任务:使用训练好的奖励模型评分,但加入长度惩罚和重复惩罚
def compute_hybrid_reward(prompt, response, task_type):
if task_type == "math":
correct = verify_math_answer(response, ground_truth)
return 1.0 if correct else 0.0
elif task_type == "code":
passed, total = run_tests(response, test_cases)
return passed / total
else:
base_score = reward_model(prompt, response)
length_penalty = -0.01 * len(response.split())
repetition_penalty = compute_repetition_penalty(response)
return base_score + length_penalty + repetition_penalty
小模型超越大模型的实证数据
DeepSeek的实验数据显示,经过优化后训练的7B参数模型在多个场景显著优于未经RL优化的33B基座模型:
| 评测维度 | 7B+后训练 | 33B基座 | 提升幅度 |
|---|---|---|---|
| 数学推理(AIME) | 52.3% | 38.1% | +14.2pt |
| 代码生成(HumanEval) | 78.6% | 65.2% | +13.4pt |
| 多轮对话(MT-Bench) | 8.21 | 7.45 | +0.76 |
| 指令遵循(IFEval) | 71.8% | 54.3% | +17.5pt |
数据表明,在推理和指令遵循这类有明确评判标准的任务上,后训练优化的增益最为显著。而在创意写作等主观维度上,大模型的参数优势仍然存在。
训练稳定性与工程注意事项
大规模RL训练最大的工程挑战是训练崩溃。常见问题包括梯度爆炸、策略坍缩和训练效率瓶颈。
梯度爆炸方面,在GRPO中当某个prompt的所有采样都获得极端奖励值时,归一化后的advantage可能放大梯度。解决方案是对advantage做clip:
torch.nn.utils.clip_grad_norm_(policy_model.parameters(), max_norm=1.0)
advantages = torch.clamp(advantages, -5.0, 5.0)
策略坍缩(mode collapse)指模型快速收敛到单一输出模式,丧失多样性。DeepSeek的应对方式是在训练后期逐步降低temperature,并在KL惩罚系数上做warmup调度:
def kl_schedule(step, total_steps):
warmup_steps = total_steps // 10
if step < warmup_steps:
return 0.04 * step / warmup_steps
return 0.04 * (1 + 0.5 * (step - warmup_steps) / (total_steps - warmup_steps))
对AI模型部署的实践启示
第一,后训练优化的性价比远高于扩大预训练规模。7B模型在4张A100上完成后训练约需72小时,而预训练一个33B模型的算力成本是其后训练的50倍以上。对于资源有限的团队,优先投入后训练阶段优化是更务实的选择。
第二,GRPO算法显著降低了RL训练的工程门槛。不需要训练独立的value model,显存占用减少约30%,使得单机8卡也能完成中等规模模型的后训练。
第三,规则奖励的优先使用能显著提高特定领域的表现。对于有明确验证标准的业务场景如SQL生成、API调用,直接构建规则奖励比训练奖励模型更可靠且成本更低。
Prompt工程方面,经过RL后训练的模型对prompt的遵循度更高,但仍需注意过度优化的模型可能在分布外的prompt上表现下降。建议在后训练数据中保留一定比例的多样化开放对话数据,避免模型过度适配特定任务模式。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/deepseek-hou-xun-lian-you-hua-shi-jian-xiao-mo-xing-ru-he/