2026 年翻招聘网站,“对齐"相关的要求出现在越来越多的 JD 里:亚信科技的算法岗直接写着"SFT/偏好对齐(GRPO、PPO、DPO、ORPO)落地经验”(ORPO 是 DPO 类的变体,本文不展开),猎聘上的大模型算法岗也要求"预训练与高效微调、推理优化"一条龙。但很多人对着这四个词一脸懵:SFT 训完了为什么还要 RLHF?DPO 和 RLHF 有什么区别?GRPO 又是什么新东西?这篇文章把这几个方法挨个讲一遍——原理是什么、代码怎么写、什么时候用,最后给一张选择清单,照着抄就行。


太长不看版

  • SFT(监督微调):用人工标注的"问题-回答"数据把模型教成会听话的样子,一切对齐的地基,最便宜
  • RLHF(人类反馈强化学习):SFT 之后加奖励模型(RM)+ PPO 强化学习,效果上限最高,但要同时维护 4 个模型,工程代价最大
  • DPO(直接偏好优化):不训练奖励模型,把"偏好"直接写进损失函数,两个模型就能训,2023 年后工业界的当红炸子鸡
  • GRPO(组相对策略优化):DeepSeek 为推理任务推出的 PPO 简化版,砍掉价值网络,用一组采样的平均奖励当基线,数学/代码任务首选
  • 一句话选型:只有指令数据选 SFT;有偏好对数据选 DPO;结果能自动判对错(数学、代码、格式校验)选 GRPO;算力管够、追求极致效果再上 RLHF

一、先搞清楚:对齐到底在解决什么问题

一个预训练好的大模型,只会做一件事:接着上文预测下一个词。它不知道什么是"好的回答",会编造事实、答非所问,甚至说出有害内容。

对齐(Alignment)就是把这些行为掰到人类期望的轨道上,主要做两件事:

  • 有用性:模型能听懂指令、按要求格式回答、完成具体任务
  • 安全性:模型不输出有害、违法、偏见内容

四条主流路线的血缘关系其实是一条主干分出的两支:

预训练模型
   └─> SFT(学会跟着指令走)
         └─> RLHF(PPO)(学会输出人类偏好的回答)—— 2022 年 InstructGPT 提出
               ├─> DPO(砍掉奖励模型,直接优化偏好)—— 2023 年提出
               └─> GRPO(砍掉价值网络,组内采样当基线)—— 2024 年 DeepSeekMath 提出

理解这条血缘线很重要:DPO 和 GRPO 都不是凭空出现的黑科技,它们都是对 RLHF 的"减配",只是减掉的东西和适合的活儿不一样。


二、SFT:一切对齐的地基

2.1 原理

SFT(Supervised Fine-Tuning)就是拿着人工标注好的"指令-回复"对,让模型像做填空题一样学习。损失函数就是交叉熵:让模型在回答部分每个位置上的预测概率,尽量贴近真实标注的 token。

L_SFT = -Σ log P_θ(y_t | x, y_<t)

P_θ 是模型参数 θ 在给定指令 x 和前文 y_<t 时,预测当前 token y_t 的概率。

数据长这样(一条样本):

问题:请用一句话解释什么是向量数据库
回答:向量数据库是一种以向量形式存储和检索数据的数据库,常用于大模型的检索增强生成(RAG)场景。

2.2 代码(基于 trl 库,LoRA 高效微调)

pip install "transformers" "peft" "trl" "datasets" "accelerate"
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments
from trl import SFTTrainer  # trl 0.9+ 写法,旧版本 API 略有不同

model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5-1.5B-Instruct")
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-1.5B-Instruct")

trainer = SFTTrainer(
    model=model,
    args=TrainingArguments(
        output_dir="./sft_out",
        per_device_train_batch_size=4,
        num_train_epochs=3,
    ),
    train_dataset=dataset,          # 每条含 "instruction" + "response" 字段(新版 trl 也支持 "messages" 多轮格式)
    processing_class=tokenizer,     # 新版 trl 用 processing_class 替代 tokenizer 参数
)

trainer.train()

注意:2025 年 trl 做过一次大重构(0.9.0),SFTTrainer 的接口有变化。上面是 0.9+ 的新写法;如果遇到 processing_class 参数报错,说明你在用旧版本,把参数名改回 tokenizer 即可。

2.3 优缺点

说明
优点 训练稳定、数据好准备、成本最低,是后续所有对齐步骤的必要前提
缺点 只学"模仿"不学"偏好"——模型会背训练数据,但不会分辨哪个回答更好;数据里有错误也会照单全收

三、RLHF(PPO):效果上限最高,工程代价最大

3.1 原理:经典三段式

RLHF(Reinforcement Learning from Human Feedback)这个思路最早来自 2017 年 Christiano 等人的工作,真正让它在大语言模型上规模化应用的,是 OpenAI 2022 年的 InstructGPT 论文。流程分三步:

  1. SFT 打底:先微调出一个会跟指令的基础模型
  2. 训练奖励模型(RM):让人类给同一问题的多个回答排序(好/中/差),用这些排序数据训练一个打分模型,学会"什么样的回答是好的"
  3. PPO 强化学习:让策略模型继续生成,用 RM 的打分当奖励,通过 PPO(Proximal Policy Optimization,近端策略优化)算法更新策略,让模型逐步学会输出高分回答

需要说明的是:RLHF 是一种"范式",PPO 只是实现它的算法之一(也是最常用的一种),所以很多文章把两者并称。后面 GRPO 同样属于"用强化学习做对齐"的范式。

训练时的完整奖励 = RM 打分 − KL 惩罚(防止策略模型跑飞,偏离参考模型太远)。

3.2 为什么说它要"四个模型"

模型 作用
策略模型 π_θ 要优化的模型,负责生成回答
参考模型 π_ref 固定不动的 SFT 模型,用于计算 KL 惩罚
奖励模型 RM 给回答打分
价值模型 Critic PPO 里估算"未来总回报"的基线,用于计算优势函数

PPO 的目标函数长这样(用文字描述):对每条生成轨迹,计算策略新旧版本的概率比值 r_t(θ),然后取"原优势 Â_t × r_t(θ)"和"clip 过的版本"里较小的那个,防止一步更新太大导致训练崩掉。

3.3 代码示意(trl 的 PPOTrainer)

# 注意:trl 0.9+ 重构后,PPO 相关 API 已移至 trl.legacy(或需 pip install "trl[ppo]")。
# 下面按经典的 trl 0.7.x 写法,帮你理解流程,复现时请按所用版本调整导入路径。
from transformers import pipeline
from trl import PPOTrainer, PPOConfig, AutoModelForCausalLMWithValueHead

# 1. 准备:策略模型要带 value head(PPO 需要 Critic)
model = AutoModelForCausalLMWithValueHead.from_pretrained("Qwen/Qwen2.5-1.5B-Instruct")
reward_model = pipeline("text-classification", model="./rm_model")  # 训练好的 RM

config = PPOConfig(output_dir="./ppo_out", learning_rate=1e-5)
ppo_trainer = PPOTrainer(config=config, model=model, tokenizer=tokenizer)

for step, batch in enumerate(dataset):
    # 2. 生成回答
    response_tensors = ppo_trainer.generate(batch["query_tensors"])
    # 3. 用 RM 打分作为奖励
    texts = [tokenizer.decode(r) for r in response_tensors]
    rewards = [float(r["score"]) for r in reward_model(texts)]
    # 4. PPO 更新
    stats = ppo_trainer.step(batch["query_tensors"], response_tensors, rewards)

这个流程代码量很大(真实项目里还包括 GAE 优势计算、KL 动态调节、熵正则等),上面只保留了主干,重点在于感受它每一步都要来回协调多个模型。

3.4 优缺点

说明
优点 在线优化、能学到超出静态数据的行为;效果上限最高,OpenAI 早期走的就是这条路
缺点 训练不稳定(PPO 出了名的难调)、显存和算力开销最大、RM 本身会引入打分偏差;如果 RM 有偏见,强化学习会把偏见放大

四、DPO:不训奖励模型,直接改损失函数

4.1 原理

DPO(Direct Preference Optimization)来自 2023 年斯坦福等机构发表的一篇论文(Rafailov 等人),核心洞察一句话:奖励模型其实是"隐式"地藏在语言模型里的,不需要单独训一个 RM,直接把"偏好"写进策略模型的损失函数就行。

数据形态变成偏好对——同一问题两个回答,一个 chosen(更好的)、一个 rejected(较差的):

问题:解释一下什么叫过拟合
chosen(好回答):过拟合是指模型在训练数据上表现很好,但在新数据上泛化能力差的现象……
rejected(差回答):过拟合就是模型学太多了,背下来了。嗯,大概这样吧。

损失函数(简化文字版):对每个偏好对,让 chosen 的相对概率(chosen 对参考模型的提升)减去 rejected 的相对概率越大越好,并用 β 控制偏离参考模型的力度。

L_DPO = -log σ( β * ( log(π_θ(chosen)/π_ref(chosen)) - log(π_θ(rejected)/π_ref(rejected)) ) )

直觉:σ 是 sigmoid,括号里的值越大(chosen 比 rejected 相对更受偏好),损失越小。β 通常取 0.1 左右,β 越大模型越"放飞",越小越贴近参考模型。

4.2 代码(trl 的 DPOTrainer)

from trl import DPOTrainer, DPOConfig

config = DPOConfig(
    output_dir="./dpo_out",
    beta=0.1,            # 温度参数,控制偏离参考模型的程度
    per_device_train_batch_size=2,
)
trainer = DPOTrainer(
    model=model,                 # 待优化的策略模型
    ref_model=ref_model,         # 参考模型,通常直接用 SFT 的产物
    args=config,
    train_dataset=dpo_dataset,   # 每条含 prompt / chosen / rejected
    processing_class=tokenizer,
)
trainer.train()

注意一个常见坑:参考模型最好直接用你 SFT 训出来的那个模型,不要重新加载预训练模型,否则 DPO 的目标会发生漂移,效果明显变差。

4.3 优缺点

说明
优点 不用训 RM、不用跑在线采样,训练稳定、成本低(策略+参考两个模型),原论文及后续大量实践报告其效果与 RLHF 相当或更优(不过"谁更强"至今没有定论,与任务和数据关系很大)
缺点 是离线方法,只能从固定数据里学,学不到"新策略产生的样本";数据质量差时会把噪音也学进去

五、GRPO:去掉 Critic,用组内采样做基线

5.1 原理

GRPO(Group Relative Policy Optimization)由 DeepSeek 在 2024 年的 DeepSeekMath 论文中提出,随后被 DeepSeek-R1 大规模使用,做推理类任务的强化学习。

它解决的问题很实际:PPO 需要一个价值网络(Critic)来估计基线,但这个网络又贵又难训。GRPO 的想法是——我不估基线了,直接采样一组回答,用这组回答的平均奖励当基线。

对同一个问题 q,采样 G 个回答 {a1, a2, ..., aG}
每个回答拿到奖励 {r1, r2, ..., rG}
第 i 个回答的优势 A_i = (r_i - 组内平均) / 组内标准差

奖励高于组内平均的回答被强化,低于平均的被抑制。这样奖励模型可能有的"绝对分数虚高"问题也被抵消了(因为只看相对高低)。

5.2 和 PPO 的区别

PPO GRPO
基线来源 价值网络 Critic 估算 组内 G 个采样奖励的均值/标准差
需要的模型 策略 + 参考 + RM + Critic(4 个) 策略 + 参考 + 奖励函数(3 个,且奖励常是代码/规则)
KL 惩罚 通过熵正则/自适应系数隐式控制 在目标函数里显式加入 KL(π_θ‖π_ref) 项
显存/成本 明显更低
擅长场景 通用对话偏好 可验证奖励的任务(数学、代码、格式)

GRPO 特别适合"结果能自动判断对错"的任务,比如数学题的答案对不对、代码能不能编译通过——这种场景奖励函数用规则就能写,根本不需要人类反馈。

5.3 代码(trl 的 GRPOTrainer)

from trl import GRPOTrainer, GRPOConfig

# 奖励函数:数学题对错验证(结果能自动判定的场景)
def correctness_reward(prompts, completions, answer, **kwargs):
    responses = [c.strip().lower() for c in completions]
    return [1.0 if a.strip().lower() in r else 0.0 for r, a in zip(responses, answer)]

config = GRPOConfig(
    output_dir="./grpo_out",
    num_generations=8,   # 每组采样数量 G,太小方差大、太慢
)
trainer = GRPOTrainer(
    model=model,                     # 直接用 SFT 后的模型
    args=config,
    reward_funcs=[correctness_reward],
    train_dataset=grpo_dataset,      # 每条含 prompt 和 answer 字段
    processing_class=tokenizer,
)
trainer.train()

训练时每个问题会实时采样 8 个回答去算奖励再更新,这是"在线"方法,所以它能看到策略自己生成的样本,这是 DPO 给不了的。

5.4 优缺点

说明
优点 省掉价值网络,显存和调参成本大幅下降;相对优势天然抗奖励分数漂移;推理类任务(数学、代码)效果显著
缺点 奖励必须"可验证"才发挥威力——自由文本的"好坏"很难用规则打分,这种场景还是得靠 DPO/RM;每组采样次数越多越准但越贵

六、四张表把账算明白

表 1:一句话定位

方法 本质 提出时间/出处
SFT 模仿学习 指令微调范式 2022 年由 FLAN、T0 等工作带火,SFT 本身是历史更久的通用范式
RLHF(PPO) 人类偏好 + 强化学习 2022 年 InstructGPT(OpenAI)
DPO 偏好直接写进损失 2023 年《Direct Preference Optimization》(Rafailov 等,NeurIPS 2023)
GRPO 简化版 PPO,组内相对基线 2024 年 DeepSeekMath 论文;DeepSeek-R1 使用

表 2:数据需求

方法 需要的数据 好准备吗
SFT 指令-回答对 相对容易,网上开源数据多
RLHF 人工对回答排序 → 训 RM 最难,要组织人工标注流水线
DPO 偏好对(chosen/rejected) 中等,可以用公开偏好数据集
GRPO prompt + 可验证的参考答案 视任务而定,数学/代码场景最方便

表 3:训练成本与稳定性

方法 同时要维护的模型 显存/算力 稳定性
SFT 1 个 最低 最稳定
DPO 2 个(策略 + 参考) 稳定
GRPO 3 个(策略 + 参考 + 奖励),且要批量采样 较稳定,G 太小会抖
RLHF 4 个(策略 + 参考 + RM + Critic) 最高 出了名的难调

表 4:效果与场景

方法 效果上限 最适合的场景
SFT 低(只会模仿) 冷启动、领域指令数据充足时
DPO 有偏好对数据;通用对话、写作、安全对齐
GRPO 数学推理、代码生成、格式强约束任务
RLHF 最高 算力和标注资源都充足、追求极致效果

七、到底怎么选:按你的数据和算力出牌

不用纠结"哪个最好",按下面这个顺序问自己:

第 1 问:我有没有成对的"好/坏回答"数据?
    没有 → 只能走 SFT(先把指令跟随做好)
    有 → 继续往下问

第 2 问:我的任务结果能不能自动判对错,而且算力撑得起在线采样(每组生成多个回答再训练)?
    能 → GRPO(数学/代码/格式校验类任务的首选)
    不能/撑不起 → 继续往下问

第 3 问:我的算力和工程能力够不够撑 4 个模型?
    不够 → DPO(推荐,性价比最高)
    够,而且想要极致效果 → RLHF(PPO)

实战组合拳(2026 年最常见路线):

路线 A(通用对话/客服,性价比最高):
  预训练模型 → SFT(LoRA)→ DPO(β=0.1)

路线 B(数学/代码/推理型 Agent):
  预训练模型 → SFT(LoRA)→ GRPO(G 取 8~16)

路线 C(有标注团队 + 充足 GPU,追求天花板):
  预训练模型 → SFT → 训 RM → PPO(RLHF)

八、常见坑(别人踩过的,别跟着踩)

  1. SFT 数据质量比数量重要:1000 条高质量指令-回答,强过 10 万条灌水数据。SFT 阶段把错误学进去,后面对齐怎么救都难
  2. DPO 的参考模型要用 SFT 产物:直接用预训练模型当 ref,DPO 目标漂移,效果明显变差
  3. DPO 的 β 别乱调:默认 0.1 左右。β 太大模型开始胡编(偏离参考太远),太小训了个寂寞
  4. GRPO 的 G 太小方差爆炸:至少 8,有钱上 16;奖励稀疏时先检查奖励函数有没有给到非零值
  5. PPO 的 KL 惩罚失衡会"熵崩塌":模型快速收敛到一个单一输出、生成多样性骤降。训练时盯住 KL 和熵两个指标,崩了先调 KL 系数
  6. GRPO 的在线采样很慢:如果 GPU 紧张,可以退回到 DPO 用离线偏好数据,别硬上

九、总结

  1. 四条方法是一条进化线:SFT 打底,RLHF 立范式,DPO 省掉奖励模型,GRPO 再省掉价值网络
  2. 数据是老大:有没有偏好对数据、结果能不能自动验证,直接决定了你能用什么方法
  3. 成本从小到大:SFT < DPO < GRPO < RLHF,效果上限大致反过来(但 DPO 在实际场景里性价比明显最高)
  4. 2026 年的招聘 JD 里,SFT + DPO/GRPO 的组合是最常见的"必会项",RLHF 反而成了加分项——因为企业也扛不住 PPO 的工程代价

参考文献资料

  • RLHF 概念早期工作:Christiano et al., 2017, Deep reinforcement learning from human preferences
  • InstructGPT 论文(RLHF 三段式在大模型上的规模化应用):Ouyang et al., 2022, Training language models to follow instructions with human feedback
  • 指令微调相关工作:Wei et al., 2022, Finetuned Language Models are Zero-Shot Learners(FLAN);Sanh et al., 2022, Multitask Prompted Training Enables Zero-Shot Task Generalization(T0)
  • PPO 论文:Schulman et al., 2017, Proximal Policy Optimization Algorithms
  • DPO 论文:Rafailov et al., 2023, Direct Preference Optimization: Your Language Model is Secretly a Reward Model(NeurIPS 2023)
  • DeepSeekMath 论文(GRPO 首次提出的论文):Shao et al., 2024, DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models
  • DeepSeek-R1 技术报告(GRPO 大规模应用):DeepSeek-AI, 2025
  • HuggingFace TRL 库文档(SFTTrainer / DPOTrainer / GRPOTrainer / PPOTrainer 的用法与参数)
Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐