这个系列前几篇都在讲「感官」:输入以什么形态进来、音视频怎么对时、想好的话怎么说出口。今天换个话题,讲「教养」——模型怎么学会分辨哪个回答更好。
其实强化学习在前几篇里已经悄悄出场过两次:Qwen2.5-Omni 用 DPO 治 Talker 的幻听,MiniCPM-V 用 RLAIF-V 治看图说瞎话。今天把这条线讲透:从 PPO 到 DPO、GRPO、GSPO,这串字母到底在解决什么问题。
先说清为什么需要它。预训练教会模型接话,SFT 教会模型照着范文答题——这两步都有「标准答案」可抄。但很多要紧的事没有标准答案:同一个问题的两个回答,哪个更有帮助?哪个没撒谎?推理题的一万种解法里,哪种更靠谱?这类信号只有一种形态:试错,然后被打分。这就是强化学习的主场。
一、把强化学习装进一句话
强化学习的教科书三件套,映射到 LLM 上非常直白:「策略」就是模型本身,「动作」就是吐出下一个 token,一整句吐完,「环境」给一个分(可能来自打分模型,也可能来自规则判卷)。
最朴素的更新办法叫策略梯度(REINFORCE):得分高的回答,把生成它的每个 token 的概率都调大一点;得分低的整句调小。听上去合理,但请注意一个别扭的地方——分是整句的,更新是逐 token 的。一句 300 个 token 的回答得了高分,功劳是第 17 个 token 的还是第 250 个的?这道「功劳分配」题,就是接下来所有算法的分歧点,请全程带着它。
二、PPO:经典重装旅
ChatGPT 背后的 RLHF 三部曲,在 InstructGPT 里定型:先 SFT 打底,再训一个奖励模型(人类对回答排序,模型从排序里学会打分),最后用 PPO 让策略在奖励模型的打分下自我改进。
PPO 的两道核心保险,各配一个直觉:
- 小步快跑(裁剪)。每次更新前算一个「新旧策略比率」——新策略生成这个 token 的概率是旧策略的几倍。比率被裁剪在一个窄区间内,一步迈太大就按住。旧策略采的数据只能小心地用,不然容易摔跤;
- KL 锁链(参考模型)。策略随时和一个冻结的参考模型比对,跑太远就拉回来。这是在防奖励破解——打分器总有漏洞,放任不管,模型会学出一堆讨好打分器的怪话。
那「功劳分配」呢?靠一个价值模型(critic)逐位置估「这个局面本来该得几分」,拿实际减去它就是优势 A——比预期好该奖、比预期差该罚。至于 A 具体怎么算出来,等 clip 讲完就拆开看——奖励模型和 critic 这两个打分角色的分工,正是 PPO 最容易搞混的一处。
把裁剪写成公式,核心就一行(省掉了期望和求和号):
L_CLIP = min( r·A , clip(r, 1−ε, 1+ε)·A )
r = π_θ(token) / π_old(token) ← 新旧概率比:这一步的概率涨了几倍
A = 实际回报 − critic 预测 ← 优势:比「本来该得的」好还是差
带一个数走一遍。某个 token(就叫它「的」,下文还会见到它),采样时的旧策略 π_old 给 0.10 的概率,更新中的新策略 π_θ 抬到 0.15,比率 r = 0.15/0.10 = 1.5;取 ε=0.2,裁剪区间就是 [0.8, 1.2]:
- 这一步该奖(A=+2):
min(1.5×2, 1.2×2) = min(3.0, 2.4) = 2.4——涨太猛,被 clip 按到 1.2 倍封顶; - 这一步该罚(A=−2):
min(1.5×(−2), 1.2×(−2)) = min(−3.0, −2.4) = −3.0——这次 clip 没拦,该扣多少扣多少。
这个 min 的不对称正是 PPO 的精髓:只往「过度自信」的方向踩刹车——好事不许一步占太多,坏事该扣就扣足。
现在拆开优势 A,看它到底怎么算。 PPO 里其实有两个打分模型,常被混为一谈,分工却清清楚楚:
- 奖励模型 RM:等一整句说完,才给一个标量总分——「这个回答整体值几分」。真实信号只此一个,而且极稀疏:一整句就一个数,落在最后一个 token 上。
- 价值模型 critic:边生成边给每个 token 估一个预期前景 V——「站在这个位置往后看,最终大概能收多少分」。
每个 token 的即时奖励由此拼出,记作大写 R(免得和小写的比率 r 撞车);KL 缰绳也落在这里:
中间每个 token: Rₜ = − β·log( π_θ/π_ref ) ← 只有 KL 惩罚,别跑偏
最后一个 token: R_T = RM 总分 − β·log( π_θ/π_ref ) ← 额外领到 RM 的整句分
KL 这一项算起来很便宜,只要两个模型对「实际采样出的那个 token」各报一个概率。还是那个「的」:新策略 π_θ 给它 0.15,冻结的参考模型 π_ref 给 0.12——注意 π_ref 不是裁剪里的 π_old。π_old 是上一轮采样时的策略快照,隔几步就换新;π_ref 是训练起点的 SFT 模型,全程不动。同一个「的」,三个模型三个概率:0.10、0.15、0.12。
Rₜ = −β·log( 0.15 / 0.12 ) = −0.05 × 0.223 ≈ −0.011 ← 取 β=0.05
含义就是「偏离出发点的过路费」:在这个位置比参考模型更自信,就交一点税,所以中间 token 的 R 几乎总是个贴地的小负数。训练刚启动时 π_θ 和 π_ref 完全相同,比值恒为 1、log 为 0——这层税是随着策略跑偏才慢慢长出来的。(严格说这是拿单个采样 token 估计 KL 散度,不是真的对全词表求和,那太贵。)
「实际回报」记作 G:从当前位置往后,把这些 R 一路累加(终点那笔 RM 大分也算进去)。优势就是拿它和 critic 的预期一比:
优势 Aₜ ≈ 实际回报 Gₜ − critic 预期 V(sₜ)
一句话说透三者:RM 在终点给一个真分,critic 把这个稀疏的终点分「摊」成每一步的预期,优势 = 实际 − 预期——告诉每个 token「你这一步让最终结果比原本预计的更好还是更差」。而 critic 自己也在同步训练,目标就是让 V 逼近实际回报,跟着 RM 的分数慢慢学会预测前景。(严格说优势还会再经 GAE 做带权平滑,在偏差与方差之间权衡——等数字走完一遍再拆,内核始终是「实际 − 预期」。)
图里那六个优势数,现在带着 R、G、A 三层亲手算一遍。 先把原料摆上桌:一句 6 个 token 的回答(刚才那个「的」就算它的第 2 个 token),RM 判整句 +1.0 分;critic 沿途估的前景是
V = [0.6, 0.6, 0.7, 0.7, 0.8, 0.9] ← 越写越有把握,但直到终点仍偏保守
第一层:即时奖励 R。 没有哪个模型逐 token 吐这个数,它是按上面的配方拼出来的:中间五个位置只有 KL 薄税——刚算过,量级不过 −0.01 上下,为了数字干净先按 0 记(结尾再补回来,结论不变),图里也是这么画的;终点额外领 RM 的整句分:
R = [0, 0, 0, 0, 0, +1.0]
第二层:实际回报 G。 从当前位置往后,把 R 一路累加就是它,倒着扫一遍即可:
Gₜ = Rₜ + γ·Gₜ₊₁ γ 是折扣因子,RLHF 里几乎都取 1,所以就是简单相加
G₆ = 1.0 终点领到 RM 的整句分
G₅ = 0 + 1.0 = 1.0
… 中间没有奖励,这个 1.0 一路原样传回去
G₁ = 1.0
这里最要紧的是 G 和 V 身份完全不同:V 是估计——critic 站在第 t 步、还不知道后面会怎样,猜一个「往后大概能收多少」;G 是事实——句子已经生成完、RM 也打完分了,从 t 往后每一笔收支都是查表可得的确定数字,不需要任何模型再来估。
第三层:优势 A = 事实 − 猜测。 两行相减就完了:
A₁ = G₁ − V(s₁) = 1.0 − 0.6 = +0.4
A₂ = G₂ − V(s₂) = 1.0 − 0.6 = +0.4
…
A = [+0.4, +0.4, +0.3, +0.3, +0.2, +0.1] ← 正是图上那六个数
t₁ 的 +0.4 读作:从第一个 token 起步,最后实际拿到 1.0,比 critic 原以为的 0.6 好了 0.4,这条路径上的选择值得被强化;越往后 critic 猜得越准,A 也就越小。顺带说一句,critic 自己就是这么训的——损失取 MSE(V, G),让猜测去追事实。
(把 KL 税补回去也不改变结构:设每步 −0.01,则 R = [−0.01, −0.01, −0.01, −0.01, −0.01, +0.99],G = [0.94, 0.95, 0.96, 0.97, 0.98, 0.99]——越靠后、还没交的税越少,所以 G 略微递增——A = [+0.34, +0.35, +0.26, +0.27, +0.18, +0.09],整体只是薄薄扣了一层。)
而这组数只是 GAE 的一个端点。 盯着 A 那一行容易生出一个疑问:t₁ 吐完这个 token,critic 的预期还是 0.6、纹丝没动,途中也没领到任何奖励——这一步看起来「什么也没改变」,凭什么照样记 +0.4 的功?这个直觉没错,它对应的正是 GAE 的另一端。
先看单步残差 δ,它只问一件事:走完这一步,「往后能收多少」的估计变了没有——
δₜ = Rₜ + γ·V(sₜ₊₁) − V(sₜ)
└ 这步真拿到的 ┘ └ 走完后的新预期 ┘ └ 走之前的旧预期 ┘
δ₁ = 0 + 0.6 − 0.6 = 0 预期没动,这步没带来新消息
δ₂ = 0 + 0.7 − 0.6 = +0.1 预期被抬高了 0.1
δ₃ = 0 δ₄ = +0.1 δ₅ = +0.1
δ₆ = 1.0 + 0 − 0.9 = +0.1 真分到账,比预计的 0.9 高 0.1(终点之后 V ≡ 0)
GAE 做的事,就是把「往后的 δ」按 λ 折现,加到这一步头上:
Aₜ = δₜ + (γλ)·δₜ₊₁ + (γλ)²·δₜ₊₂ + …
= δₜ + γλ·Aₜ₊₁ ← 实现时不用展开,倒着递推一遍就行
为什么要把后面的也加进来?因为 δₜ 只反映 critic 当场察觉到的变化,而 critic 是估的、可能后知后觉:这一步其实埋了好棋,两步之后预期才涨上来。λ 就是「往后追认几步」的旋钮。取 λ=0.5 倒着算一遍:
A₆ = δ₆ = 0.1
A₅ = δ₅ + 0.5·A₆ = 0.1 + 0.05 = 0.15
A₄ = δ₄ + 0.5·A₅ = 0.1 + 0.075 = 0.175
A₃ = δ₃ + 0.5·A₄ = 0 + 0.088 = 0.088
A₂ = δ₂ + 0.5·A₃ = 0.1 + 0.044 = 0.144
A₁ = δ₁ + 0.5·A₂ = 0 + 0.072 = 0.072
三个 λ 并排看:
| token | V(sₜ) | δₜ | A(λ=0) | A(λ=0.5) | A(λ=1,图里画的) |
|---|---|---|---|---|---|
| t₁ | 0.6 | 0 | 0 | +0.072 | +0.4 |
| t₂ | 0.6 | +0.1 | +0.1 | +0.144 | +0.4 |
| t₃ | 0.7 | 0 | 0 | +0.088 | +0.3 |
| t₄ | 0.7 | +0.1 | +0.1 | +0.175 | +0.3 |
| t₅ | 0.8 | +0.1 | +0.1 | +0.150 | +0.2 |
| t₆ | 0.9 | +0.1 | +0.1 | +0.100 | +0.1 |
- λ=0:递推式第二项被抹掉,A 就是 δ 本身。预期没动的 t₁、t₃ 优势为 0,功劳只记在 V 真正跳升的那几步——正是上面那个直觉。
- λ=1:递推变成
Aₜ = δₜ + Aₜ₊₁,把后面所有 δ 全加上,中间的 V 望远镜式两两抵消,只剩G − V(sₜ),正是图上那组数(拿 t₁ 校验:0 + 0.1 + 0 + 0.1 + 0.1 + 0.1 = +0.4)。 - λ=0.5:夹在中间。t₁ 自己这步没动静(δ₁=0),但后面几步的涨幅被打折追认回来,拿 +0.072——高于 λ=0 的 0,又远低于 λ=1 的满额 +0.4。
这个例子恰好照出 λ 在调什么。 注意这个 critic 是系统性偏低的:实际回报 1.0,它一路只估 0.6~0.9。λ=0 全信 critic 的局部差分,这份系统性低估就完全看不见,t₁ 拿 0、仿佛毫无贡献——这是偏差。λ=1 一路加到终点、直接和事实比,偏差没了,但整句只采样了这一次,这一次的运气也被全额记在每个 token 头上——这是方差。实际训练常取 λ≈0.95,让绝大部分真实信号透进来,同时对末尾的采样噪声做一点衰减。图里画 λ=1,则是为了让「实际 − 预期」这个内核一眼可见。
代价也在这:策略、参考、奖励、价值,四个大模型同时在场,又贵又难调(critic 本身就不好训)。这为后面所有的简化埋下了伏笔。
三、DPO:掀桌子的极简派
DPO 论文的标题就带着挑衅:《你的语言模型,偷偷就是个奖励模型》。它的洞察是:在 KL 约束下,最优策略和奖励函数之间有一个闭式的对应关系——既然如此,何必先训奖励模型、再跑昂贵的采样循环?直接在偏好数据上优化策略就行。
它的损失函数说穿了是一个推拉动作:拿到一对回答(更好的 y⁺,更差的 y⁻),把 y⁺ 相对参考模型的概率抬高,把 y⁻ 压低,系数 β 控制拉扯的力度(也就是允许离参考模型多远)。整个过程就是一次监督学习式的训练,四个模型的舞台瞬间只剩两个(策略 + 冻结的参考)。
把这套推拉写成公式。 出发点是那个闭式对应——KL 约束下的最优策略可以反解出奖励:
r(x,y) = β · log( π_θ(y|x) / π_ref(y|x) ) + 常数
└──── 奖励其实藏在策略里,不用另训 ────┘
奖励不必单独学,它就等于「策略相对参考模型偏移了多少」。代进标准的偏好损失,奖励模型整个消失,只剩策略自己:
L_DPO = − log σ( Δ )
Δ = β·[ log(π_θ(y⁺)/π_ref(y⁺)) − log(π_θ(y⁻)/π_ref(y⁻)) ]
└──── 好句子比坏句子多「偏移」了多少 ────┘
σ 是 sigmoid。带一对回答走一遍。问题「感冒了怎么办?」,标注员挑出一好一坏:
y⁺(对症的建议,标为更好): log π_θ(y⁺) = −42 log π_ref(y⁺) = −45
y⁻(「多喝热水」式敷衍): log π_θ(y⁻) = −60 log π_ref(y⁻) = −58
对数似然都是整句的——每个 token 的 log 概率加总,一句一个数。套公式,β 取 0.1:
y⁺ 的偏移:−42 − (−45) = +3 ← 相对参考模型,好回答被抬了 3
y⁻ 的偏移:−60 − (−58) = −2 ← 坏回答被压了 2
Δ = 0.1 × ( 3 − (−2) ) = 0.5
loss = −log σ(0.5) ≈ 0.47 ← 方向对了,但还没学透,接着推
对照上面那行闭式:β 乘偏移就是各自的「隐式奖励」——y⁺ 挣 +0.3、y⁻ 挣 −0.2,不用 RM,分数直接从策略自己身上读出来。再看 Δ 处于不同阶段时损失怎么变:
- 训练前 π_θ = π_ref,两行偏移都是 0,Δ=0 →
loss = −log σ(0) = −log 0.5 = 0.69,梯度最大,使劲推; - 学好了,Δ=+3 →
σ(3)=0.95,loss = 0.05,几乎满足,梯度趋近 0,不再折腾; - 若模型搞反了、反而更偏好差答案,Δ=−2 →
σ(−2)=0.12,loss = 2.1,惩罚巨大,猛拉回来。
妙就妙在梯度自带一个自适应权重 σ(−Δ):错得越离谱拉得越猛,已经对了就松手。这是 DPO 比朴素「抬一个、压一个」稳的关键。
那道功劳分配题呢?DPO 的答案是根本不摊:它不给回答打分,比较直接发生在整句的对数似然上——好句子的每个 token 被同一股力一起抬,坏句子的每个 token 一起压(论文称之为隐式奖励,定义在序列级——刚才算的 +0.3 与 −0.2 就是它)。记住这个「整句打包」的味道,第五节它会换一副面孔再次出现。
便宜、稳定、好复现,DPO 因此成了工业界的宠儿——而且落地的理由说得很坦白:
- Llama 3 的后训练用 SFT + 拒绝采样 + DPO,论文明说选这条简单路线是因为复杂的强化学习「不稳定且难以扩展」;
- Qwen2.5-Omni 给 Talker 做了一轮 DPO:用「输入 + 一好一坏两段语音」的三元组训练,专治预训练数据噪声带来的幻听和重复——语音也能做偏好对;
- MiniCPM-V 的 RLAIF-V 更进一步,连人类标注都省了:让开源模型当裁判,分治式地检查回答里的每个断言、拼出偏好对,再用 DPO 优化——开源反馈也能把幻觉率打下来。
局限也直白:DPO 是离线的,学的是「这两个候选里谁更好」,没有探索,天花板取决于偏好数据本身的质量与覆盖面。想让模型自己闯出新解法——比如做数学题——还得回到在线试错的路上。
四、GRPO:砍掉裁判的轻装兵
回到在线 RL,最扎眼的开销是 critic:它和策略一样大,还难训。DeepSeek 在 DeepSeekMath 里给出的答案是 GRPO:不请裁判了,让同一道题的一组回答互相当彼此的基准。
做法:同一道题采样 G 个回答,各自拿分,然后减去组内平均、除以组内标准差——高于平均的算优势为正,低于平均的为负。「本来该得几分」不再需要一个大模型来估计,一组同学的平均分就是天然的参照。critic 下岗,显存减半。
组内标准化写成公式,很短:
Aᵢ = ( Rᵢ − mean(R₁…R_G) ) / std(R₁…R_G) ← Rᵢ:第 i 个回答拿到的分
(记号提醒:这里的 Rᵢ 是第 i 个回答的整句总分、G 是组大小,和上一节 PPO 里逐 token 的 Rₜ、回报 Gₜ 是两套符号——各随各的论文,注意别串台。)
带一道题走一遍。「27 × 43 = ?」,采 G=4 个回答,规则判卷只认最终答案:
o₁:拆分配律,27×40 + 27×3 = 1080 + 81 = 1161 ✓ R₁ = 1
o₂:列竖式,进位抄错,得 1131 ✗ R₂ = 0
o₃:不写过程直接报 1163 ✗ R₃ = 0
o₄:先估「约 1160」,再精算得 1161 ✓ R₄ = 1
均值 0.5、标准差 0.5,代入上式:
A = [ +1, −1, −1, +1 ] ← 对的往上推、错的往下压,基线自己算出来
「本来该得几分」由一组同学的均值顶替,一个和策略同样大的 critic 就这么省了。(顺带一个边角:若 4 个全对或全错,标准差为 0、优势全是 0,这道题这一轮就贡献不了梯度——太简单和太难的题都白采,后来 DAPO 的动态采样专门填这个坑。)完整目标其实还是 PPO 那套 clip,只换了两处:优势用组内的 Aᵢ;KL 不再混进每步奖励,挪到损失里单独一项,Aᵢ 算得干净——
J_GRPO = 1/G Σᵢ (1/|oᵢ|) Σₜ min( rᵢ,ₜ·Aᵢ , clip(rᵢ,ₜ, 1−ε, 1+ε)·Aᵢ ) − β·KL
└─ 比率 rᵢ,ₜ 逐 token,优势 Aᵢ 却整句共享 ─┘
盯住最后那行注释,拿 o₁ 体会:那步漂亮的分配律拆解,和顺嘴带出的凑数 token,统统记同一个 +1——打分只到整句;可结算时,每个 token 又各有一个比率 rᵢ,ₜ、各自进 clip。打分是整句一个 Aᵢ,更新却是每个 token 一个 rᵢ,ₜ,两者单位对不上。这个错位,下一节 GSPO 专门来修。
GRPO 真正大放异彩,是和可验证奖励(RLVR)组队之后。数学和代码这类任务不需要打分模型:答案对不对,规则一判便知。DeepSeek-R1 的奖励就两条——答案正确性(判对才给分)与格式合规(把思考过程写进 <think> 标签);他们还刻意不用逐步打分的过程奖励模型,理由是模型迟早学会讨好它(奖励破解)。就在这套朴素信号下,R1-Zero 从基座模型直接开始纯 RL 训练,长思维链自己长了出来,训练中途甚至出现了论文里那个著名的「aha moment」——模型突然学会回头检查自己的推理。
但功劳分配那道题,GRPO 只答了一半:组内相对分解决了「该得几分」,可这个分还是整句的,而更新用的新旧比率仍是逐 token 的。GSPO 的论文点破了后果:每个位置只有一个采样,token 级的重要性比率起不到修正分布的作用,只会带进噪声;噪声随回答变长不断累积、又被裁剪机制放大——序列一长、模型一大(尤其 MoE),训练就容易崩,以至于 MoE 上要靠 Routing Replay 这类补丁续命。
五、GSPO:把单位对齐到整句
Qwen 团队的 GSPO 把这最后一块补齐,思路一句话:奖励是整句的,重要性比率也应该是整句的。它把新旧策略的比率定义在序列似然上(做了长度归一化),裁剪也在序列级进行——一句话要么整体被接受,要么整体被按住,不再让几百个 token 各自掷骰子。
序列比率写成公式,和 GRPO 并排一比就懂:
GRPO(逐 token): rᵢ,ₜ = π_θ(tokenₜ) / π_old(tokenₜ) 每个 token 一个比率
GSPO(整句): sᵢ = ( π_θ(整句 yᵢ) / π_old(整句 yᵢ) )^(1/|yᵢ|) 整句一个,再开 |yᵢ| 次方
那个 1/|yᵢ| 次方是长度归一化——相当于取几何平均,把整句似然比折回「每 token」的尺度,长短句才可比。
为什么这一下就稳?把上一节的 o₁ 接过来算,设它只有 4 个 token(真实回答长得多,短了好算):
逐 token 比率:r = [1.05, 0.97, 1.50, 0.96] ← 多数贴着 1.0 小抖,第 3 位蹦高
GRPO:4 个比率各自进 clip(ε=0.2 → 区间 [0.8, 1.2])
1.50 单独被按到 1.2,其余三个原样通过——同一句话,内部步调不一
GSPO:先连乘,再开 4 次方
s = (1.05 × 0.97 × 1.50 × 0.96)^(1/4) ≈ 1.467^(1/4) ≈ 1.10
整句一个 1.10,没出裁剪区间——配上组里给它的 A₁=+1,整体被温和推高
单个位置的蹦高,被其余位置的小抖摊薄了。回答越长这个效应越可靠:100 个 token 的比率连乘再开 100 次方,正负抖动相互抵消,结果紧贴 1.0——一句话掷一个骰子,而不是一百个各掷各的。反过来,GRPO 的 100 个比率各自进 clip,蹦高的位置一被裁就搅乱整次更新,回答越长、抖动累积越凶。
目标函数也随之清爽,Σₜ 那层逐 token 求和没了:
J_GSPO = 1/G Σᵢ min( sᵢ·Aᵢ , clip(sᵢ, 1−ε, 1+ε)·Aᵢ )
计分是整句(Aᵢ),结算也是整句(sᵢ),单位终于对齐。
论文报告的效果:训练比 GRPO 更稳、更高效,MoE 不再需要 Routing Replay,这些收益进入了 Qwen3。
到这里可以把主线收拢了。同一道「整句的分怎么摊给 token」的题,四种答案:PPO 花大价钱雇 critic 逐 token 分功;DPO 绕开打分,在整句似然上直接对比——最早交卷的「句子级」答案;GRPO 用组平均省掉裁判,但计分和更新的单位错着位;GSPO 把单位对齐——整句计分,整句结算,和 DPO 在「以句为单位」这件事上殊途同归。
六、一张地图
| 在线试错 | 奖励模型 | 价值模型 | 信号形态 | 代表落地 | |
|---|---|---|---|---|---|
| PPO | 要 | 要 | 要 | 整句打分,critic 逐 token 分功 | InstructGPT / ChatGPT |
| DPO | 不要(离线) | 不要(隐式) | 不要 | 成对偏好 | Llama 3、Omni Talker、MiniCPM-V |
| GRPO | 要 | 可用规则替代 | 不要 | 组内相对分(token 级更新) | DeepSeekMath、DeepSeek-R1 |
| GSPO | 要 | 可用规则替代 | 不要 | 组内相对分(序列级更新) | Qwen3 |
这张表之外还有一串亲戚,各占一句话:RLOO 和 GRPO 想法相近,用「留一法」拿组内其他人当基线;DAPO 开源了一整包让 GRPO 更好训的工程手筋;KTO 更进一步,连成对偏好都不要,单条「好/坏」标注就能训。方向都一样:更便宜、更稳的偏好信号。
七、写在最后
三句话收束:
- SFT 教模型「像谁」,RL 教模型「哪个更好」——前者抄范文,后者试错加打分;
- 这串字母的演化,是一条不断做减法的路:PPO 四个模型,DPO 砍到两个,GRPO 砍掉裁判,GSPO 把最后的单位错配也抹平;
- 但减法背后那道题从没变过:整句的分,怎么摊给每个 token——雇人分(PPO 的 critic)、不打分直接比(DPO)、同学比(GRPO 的组基线)、整句算(GSPO),四种答案,各领一个时代。
下次看到模型报告里轻描淡写的一句「post-trained with RL」,你知道那背后是四个模型的舞台,还是一组同学的内卷。
参考
- InstructGPT: Training language models to follow instructions with human feedback(arXiv:2203.02155,RLHF 三部曲定型)
- PPO: Proximal Policy Optimization Algorithms(arXiv:1707.06347)
- DPO: Direct Preference Optimization(arXiv:2305.18290)
- DeepSeekMath(arXiv:2402.03300,GRPO 出处)与 DeepSeek-R1(arXiv:2501.12948,规则奖励与 aha moment)
- GSPO: Group Sequence Policy Optimization(arXiv:2507.18071,序列级比率,Qwen3 采用)
- The Llama 3 Herd of Models(arXiv:2407.21783,SFT + 拒绝采样 + DPO 的选型理由)
- Qwen2.5-Omni Technical Report(arXiv:2503.20215,Talker 的 DPO 阶段)
- RLAIF-V(arXiv:2405.17220,开源 AI 反馈 + DPO,MiniCPM-V 采用)
- DAPO、KTO、RLOO