简介:本文系统对比大模型后训练阶段的五种主流算法——PPO、DPO、GRPO、DAPO与GSPO,从算法范式、模型组件、优势估计、裁剪机制、偏差治理、工程成本与架构适配等维度梳理异同,并结合主流开源训练框架的可插拔实现思路,给出典型场景的选型建议与迁移注意事项,帮助读者快速判断哪种方案更契合自身的数据形态、算力预算与模型架构。
大模型的后训练与对齐,早已从“锦上添花”变成“必经环节”:让模型听懂指令、符合人类偏好、提升数学与代码等复杂推理能力,都绕不开强化学习(RL)或偏好优化。围绕“如何把奖励信号高效、稳定地灌进策略模型”这个共同命题,业界走出了一条清晰的演进主线:
市面上的相关资料常出现两个极端:一种是公式堆山,只讲推导不谈工程落地;另一种是只教调用现成训练接口,对算法内部一无所知。本文采取折中路径:每个算法先讲“解决什么问题”,再给简化公式与通用示意代码,最后补充某主流开源强化学习训练框架(下文简称“训练框架”)的工程实现视角——这类框架的核心设计哲学是把算法做成可插拔模块:所有算法共用同一套训练循环,只需替换两个组件——优势估计器(如何从奖励得到advantage)与策略损失函数(如何把advantage变成loss)。理解了这条“工程脊柱”,五个算法的异同便一目了然。
解决什么问题:在最大化奖励的同时,限制每次更新不要让新策略偏离旧策略太远,避免训练崩溃。
四个模型组件:策略模型(被训练的生成模型)、价值模型(Critic,逐token估计状态价值)、奖励模型或规则奖励(打分)、参考模型(冻结的初始策略,提供KL约束)。
关键机制:
# GAE 递推(通用示意)delta = rewards + gamma * values[:, 1:] - values[:, :-1] # TD 残差adv[:, -1] = delta[:, -1]for t in reversed(range(T - 1)): # 从后往前递推adv[:, t] = delta[:, t] + gamma * lam * adv[:, t + 1]
奖励计算与KL注入。训练奖励 = 任务奖励 − KL系数 × 每token的KL项,把策略“拴”在参考模型附近,防止语言能力漂移。
Clip裁剪——PPO的精髓。把新旧策略的token级概率比率钳制在 [1−ε, 1+ε],超出区间的梯度被截断,单步更新的“步幅”天然有上限:
# PPO 裁剪代理目标(通用示意)ratio = torch.exp(logp_new - logp_old.detach()) # 重要性比率surr1 = ratio * advsurr2 = torch.clamp(ratio, 1 - clip_eps, 1 + clip_eps) * advloss = -torch.min(surr1, surr2).mean() - ent_coef * entropy.mean()
熵奖励。在损失中加入策略熵的bonus,防止模型过早收敛成“只会输出一种答案”。
双重裁剪。部分训练框架在标准clip之外还实现了“双clip”:当比率越过上限且优势为负时再截断一次,防住个别异常样本造成的梯度爆炸,属于一个容易被忽略的工程细节。
解决什么问题:PPO链路太重——四模型并存、需要在线采样、还要训练Critic。DPO的洞察是:KL约束下的奖励最大化问题存在闭式最优解,把这个闭式解反解出奖励、代回Bradley-Terry偏好模型后,奖励项被完全“吸收”进策略,得到一个只依赖“策略与参考模型对数概率差”的成对损失:
# DPO 成对偏好损失(通用示意)logit = beta * ((logp_pi_win - logp_ref_win) - (logp_pi_lose - logp_ref_lose))loss = -torch.nn.functional.logsigmoid(logit).mean()
工程收益:只需策略与参考两个模型,离线偏好数据驱动,训练循环与SFT几乎一样,是接入成本最低的对齐方案,主流训练框架通常也都支持这类离线偏好优化任务。
解决什么问题:Critic与策略模型同等规模,显存与计算成本接近翻倍,且价值网络本身很难训练准确。GRPO改为:对同一提示词并行采样一组(G条)回答,用组内归一化后的奖励当作优势——“跟同组队友比”替代“跟价值估计比”:
# GRPO 组内相对优势(通用示意)# r: 同一 prompt 下 G 条回答的标量奖励adv = (r - r.mean()) / (r.std() + 1e-6) # 组内归一化,替代价值网络
KL处理上,GRPO通常不把KL塞进奖励,而是作为独立正则项加入损失,并采用低方差的无偏估计形式。
解决什么问题:token级重要性比率在长序列上方差极大;在MoE架构下,专家路由的波动进一步放大这种噪声,训练容易崩溃。GSPO把比率重定义为整条序列对数概率差的均值再取指数(相当于几何平均),裁剪整体上移到序列级——一条序列要么整体保留、要么整体裁掉:
# GSPO 序列级比率(通用示意)token_log_ratio = logp_new - logp_old # [B, T]seq_ratio = torch.exp(token_log_ratio.sum(-1) / seq_len) # 几何平均surr1 = seq_ratio * seq_advsurr2 = seq_ratio.clamp(1 - clip_eps, 1 + clip_eps) * seq_advloss = -torch.min(surr1, surr2).mean()
尽管形态各异,这五个算法在底层逻辑上高度同源:
PPO、GRPO、DAPO、GSPO属于在线强化学习:边采样边学习,需要高吞吐的rollout引擎支撑;DPO属于离线偏好优化:训练循环与SFT几乎一致,不需要采样引擎,但也因此失去了在线探索能力,模型上限受限于离线偏好数据的覆盖面与质量。
显存与部署复杂度排序大致为:PPO(四模型)> GRPO ≈ DAPO/GSPO(三模型)> DPO(两模型)。值得注意的是,GRPO系虽然砍掉了Critic的训练开销,但“每个prompt采样G条回答”会把成本压力转移到采样侧——本质是把成本从训练资源换成了推理算力,总账未必更省,只是资源结构不同。
PPO/GRPO/DAPO在token级计算重要性比率并裁剪,控制粒度细但方差大;GSPO上移到序列级,方差小、对MoE友好,但控制粒度变粗。裁剪策略上,PPO是标准对称裁剪,部分框架补充了“双重裁剪”防梯度爆炸,DAPO则通过clip-higher放宽上界换取探索空间。
DPO最低,熟悉SFT的团队一两天即可跑通;GRPO系居中,核心是搭好组采样与奖励链路;完整PPO最高,需要同时管理四模型显存、采样与训练的调度、价值网络训练质量。借助训练框架的可插拔设计,GRPO→DAPO(改裁剪与采样过滤)与GRPO→GSPO(改比率粒度)这类“同族切换”通常只需替换损失函数实现,迁移代价很小。
稠密模型对五种方案均无明显排斥;MoE架构下token级比率噪声被路由波动放大,GSPO的序列级平滑是目前公开实践中公认的针对性解法。
| 维度 | PPO | DPO | GRPO | DAPO | GSPO |
|---|---|---|---|---|---|
| 算法范式 | 在线强化学习 | 离线偏好优化 | 在线强化学习 | 在线RL(GRPO改进) | 在线RL(GRPO改进) |
| 训练所需模型 | 策略+价值+奖励+参考 | 策略+参考 | 策略+奖励+参考 | 同GRPO | 同GRPO |
| 优势估计 | GAE(价值网络递推) | 不需要 | 组内采样归一化 | 组内归一化+动态采样 | 组内归一化 |
| 比率粒度 | token级 | 不使用 | token级 | token级(上界放宽) | 序列级几何平均 |
| 稳定性机制 | clip+熵奖励+KL注入 | β隐式约束 | 独立KL正则 | clip-higher等四项补丁 | 序列级裁剪 |
| 主要短板 | 工程重、显存高、调参难 | 无在线探索、依赖数据质量 | 长度偏差、采样开销 | 针对推理任务的定向补丁 | 序列级粒度较粗 |
| 典型适用 | 通用对齐、奖励模型成熟 | 快速对齐迭代 | 数学/代码等可验证任务 | 长链推理训练 | MoE模型RL |
实际选型建议按“三步走”做条件化判断,而非认定某个算法绝对更优:
此外,无论选择哪种算法,算力调度、分布式容错与推理引擎配套都是绕不开的工程成本。若团队不具备自建大规模训练集群的条件,也可以考虑借助成熟的云上训练与推理服务(例如百度智能云提供的模型训练、部署类通用服务)承接底层资源管理工作,把精力集中在算法选择与数据质量上。
把五个算法放回同一条演进主线上看,逻辑非常清晰:DPO和GRPO做减法——分别去掉奖励模型与Critic,降低对齐的资源和工程门槛;Dr.GRPO、RLOO、DAPO做修正——治理组归一化带来的长度偏差、熵塌缩与样本浪费;GSPO做升维——把裁剪粒度从token级抬到序列级,解决MoE架构下比率噪声过大这一结构性问题。五者不是简单的替代关系,而是覆盖了不同数据形态、算力预算与模型架构的工作点。回到选型本身:先明确自己的数据是离线偏好对还是可在线获取的奖励信号,再评估显存与采样算力预算以及是否采用MoE架构,最后结合团队工程能力选择接入深度——在这套条件化判断下,PPO、DPO、GRPO、DAPO、GSPO各自都有最合适的落位,切忌脱离自身约束照搬他人的算法选择。