做LLM训练绕不开强化学习这块,标题里这五个字看着简单,真要分类起来其实挺讲究的。我前几年刚开始接触大模型对齐时,也把PPO、DPO、GRPO这些名词搞得晕头转向,后来用了一段时间才理清楚它们之间的血缘关系和适用场景。这篇博文就把LLM里常用的强化学习方法按我自己的理解重新梳理一遍,包括它们解决什么问题、核心原理是什么、训练时有哪些坑,希望能给正在做微调和对齐的同行一些参考。全文会按五条路线来讲:RLHF体系下的PPO家族、规则奖励驱动的推理RL(GRPO、RFT)、偏好优化直推路线(DPO、IPO、KTO、ORPO)、轻量替代方案(拒绝采样、离线RL),以及多奖励融合的混合方案。每个方法我都会结合自己的实操经验说明它的定位、原理和适用边界,最后给出选型建议和一套可落地的实践路径。1. 先搞清楚RL在LLM训练中的位置:理解分类的底层逻辑要理解LLM里的强化学习方法为什么这么多样,得先明白强化学习在大模型训练流程里扮演的角色。很多人一上来就背方法的区别,结果遇到具体场景还是不知道选哪个,这就是因为没先建立整体框架。1.1 LLM训练的三个阶段,RL卡在哪一环现在主流的LLM训练流程大体分三步:预训练、监督微调(SFT)、对齐(Alignment)。预训练让模型学会语言规律和世界知识,SFT让模型学会跟随指令的格式和风格,但这两步都只是在"模仿",模型并不知道什么样的回答是真正被用户认可的。对齐阶段才是强化学习的舞台——我们让模型在给定输入下生成多个候选输出,用奖励信号去评估这些输出,然后通过优化策略让模型产生更高奖励的回复。这个阶段里,LLM被看成一个策略网络:输入是一段对话或指令,输出是一个回答的token序列,整个生成过程就是策略在环境中交互的过程。环境就是"用户需求"和"奖励模型"的组合,状态是当前的上下文,动作是每一步要生成的token,奖励是生成的完整回答拿到的评分。理解这个抽象映射很重要,后面所有方法的差异本质上都是围绕"奖励从哪来"和"怎么用奖励去更新模型"这两个问题的不同回答。1.2 分类的三个维度:优化对象、奖励来源、训练架构我见过不少人把强化学习方法按"有没有单独的训练奖励模型"来分,这太粗了,实操中不够用。我自己习惯按三个维度同时去卡位:优化对象:是直接优化策略模型本身,还是先学一个奖励模型再通过它优化策略?这决定了方法属于在线RL还是偏好优化路线。奖励来源:奖励是来自人类标注偏好训练的奖励模型、规则化硬性指标(比如答案正确性、格式合规性),还是直接从人类排序里偏好推导?训练架构:是否需要单独的critic模型(价值模型)、是否要参考模型(reference model)约束、是online还是offline的样本获取方式?用这三个维度去卡,任何方法都能找到位置。PPO需要训练奖励模型,需要参考模型做KL约束,需要critic模型估计优势函数,属于在线RL,奖励来源是学习到的奖励模型。GRPO同样需要奖励模型,但不要critic模型,通过组内采样来估计相对优势。DPO根本不需要训练奖励模型,直接从偏好数据中推导隐式奖励,训练架构上只需要策略模型和一个固定的参考模型。这三个维度也从侧面说明了为什么方法会越来越多:每个维度上都有可简化的空间,有人想办法砍掉critic,有人想办法砍掉奖励模型,有人想办法砍掉参考模型,路径就这么分化出来的。2. 五条主要路线逐一拆解:从PPO到混合方案分类不是为了搞出一张整齐的表格贴墙上,而是为了知道每类方法适合解决什么问题。下面这五类基本覆盖了目前业界能见到的所有主流做法,我结合自己的应用经验把它们拆开讲。2.1 RLHF体系:从PPO到PPO-ptxPPO(Proximal Policy Optimization)是最经典的RLHF实现方式,它的核心思路是在策略优化过程中加一个"信任域"约束——每次更新不要让新策略离旧策略太远,用clip机制限制更新幅度。逻辑上讲,PPO在LLM上的工作流程是这样的:第一步,用人工标注的偏好数据训练一个奖励模型,用这个模型的语言是"给一段模型输出打分,分数反映它符合人类偏好的程度";第二步,让当前策略模型对每个提示词生成回答,奖励模型为这些回答打分;第三步,用这个分数算出优势函数,再通过clip后的策略梯度更新模型参数。为了防止模型为了刷分说出违背原有语言能力的话,PPO在目标函数里加了KL散度惩罚项,约束当前策略和参考策略(通常是SFT模型)之间的距离。我自己实战下来,PPO在LLM任务里的效果上限很高,但训练资源消耗和稳定性问题确实让人头疼。需要同时加载四个模型:策略模型、参考模型、奖励模型、critic模型。我试过在单机8卡环境下跑7B模型的PPO,显存经常告急,只能塞下3个模型,最后用冻结参考模型参数加开启梯度检查点才勉强跑起来。但稳定性问题不是优化显存能解决的,优势估计、KL系数、学习率的任何一个环节出了问题,loss就会异常波动,生成样本的多样性也会显著下降。PPO还有个变体叫PPO-ptx,在最原始的RLHF论文里出现过,它在PPO的loss里混入了一部分预训练数据上的交叉熵损失,目的就是防止模型在对齐过程中遗忘预训练阶段的通用能力。这个做法现在看起来挺有先见之明的,后来很多人在做对齐时都发现模型通用能力下降,重新加回ptx项或者用混合数据训练来缓解。2.2 规则奖励驱动的推理RL:GRPO、RFT与RLVR推理模型爆火之后,GRPO(Group Relative Policy Optimization)成了开源社区和很多公司训练推理模型的首选。它的设计初衷很直接——PPO里那个critic价值模型又费显存又不稳定,能不能不要它?GRPO的做法是:对每个问题,让模型采样生成一组(比如8个或多个)回答,然后用规则奖励模型对每个回答打分,用组内相对优势替代PPO中critic的绝对优势估计。简单说,一个回答如果在这组里得分高于平均,它的优势就是正的,低于平均就是负的。这样计算优势不需要训练价值网络,省掉了大量显存开销和训练不稳定的来源。这里的奖励来源非常关键。训练推理模型时,奖励往往不是学习出来的,而是规则定义的,这就是所谓的RLVR(Reinforcement Learning with Verifiable Rewards)。比如代码题可以直接编译跑单元测试判断对不对,数学题可以比对最终答案与标准答案是否一致,或者检查回答是否严格遵循了gradual reasoning的格式要求。这些奖励是客观、可验证的,不需要训练一个奖励模型去"猜测"好坏。在实操中我还遇到过RFT(Rejection Fine-Tuning),它其实是介于SFT和RL之间的过渡方法:先用强模型或真实奖励生成大量样本,过滤出高奖励的子集,然后用这些数据做SFT。虽然严格来说它不算RL,但因为操作简单、效果好,很多团队把它当成轻量版的强化学习在用。推理模型的RL训练中还有个特别有意思的现象——格式奖励(format reward)占比过高会催生模型的"投机行为"。模型会发现只要输出带推理标签的格式就能拿分,于是生成大量无意义的中间步骤。后来很多团队的做法是同时给格式奖励和正确的最终答案奖励,并且对格式严格性做正则约束。某开源推理模型的训练报告里提过,奖励设计的好坏比算法选择的影响还大,我是认同的。2.3 偏好优化路线:DPO、IPO、KTO、ORPODPO(Direct Preference Optimization)走了一条完全不同的路。它巧妙地证明了:在KL约束的目标函数下,最优策略和奖励模型之间存在一一对应关系。既然有这种关系,就可以跳过显式的奖励模型训练,直接把偏好数据(好回答/坏回答对)代入目标函数,让策略模型在最大化好回答概率的同时降低坏回答的概率,并在过程中用参考模型控制偏离程度。这对工程实践的冲击是巨大的。数据准备工作从"标注分数"简化成"收集成对偏好",训练从四模型变成双模型,稳定性问题大幅缓解。我自己做过对比实验:同样的偏好数据、同样的基座模型,DPO的训练时长只有PPO的一半不到,显存占用也少了接近一半。但DPO也不是没问题。它对偏好数据中"好"和"坏"的边际差异很敏感,如果数据里都是那种"一个90分和一个70分"的对,模型会倾向于把概率质量压到极端的这两类答案上,牺牲中间质量的输出。有一段时间我在数学题上跑DPO,模型逐步走向"要么疯狂输出高分答案、要么直接摆烂给低分答案"的两极分化。IPO(Identity Preference Optimization)是DPO的一个理论修正版,它不再依赖于Bradley-Terry模型那种偏好概率建模,而是直接优化一个更稳健的排序目标,目标是"让好回答的隐式奖励比坏回答高出一个间隔",而不是去精确拟合偏好概率。这个修正让它在偏好数据噪声大、或不满足BT模型假设的场景下比DPO稳。KTO(Kahneman-Tversky Optimization)则换了一个输入需求,它不需要成对的偏好数据,只要知道每个回答是"好的"还是"坏的"就能训。这听起来像是减少了标注工作量,但实际操作中,单侧标签(只有正面或只有负面)对训练的稳定性影响很大,需要精细调节正负样本的权重。我在小规模数据上试过KTO,效果和DPO接近,优势主要是数据收集灵活一些,对显存不太友好的场景友好。ORPO(Odds Ratio Preference Optimization)更激进,它连参考模型都去掉了,直接在SFT阶段就融入偏好优化,通过计算生成好回答和坏回答的几率比来作为内部奖励信号。这意味着你只需要一个模型就能完成对齐训练,显存门槛大幅降低,推理阶段也没有增加任何开销。但我个人实测下来,ORPO对基座模型的初始状态比较敏感,基座已经很强时效果还行,基座弱一点时倾向于让模型输出变得保守。2.4 轻量替代方案:拒绝采样与离线RL严格意义上拒绝采样不是RL,但它在对齐流程中的地位又很特殊。它的操作逻辑很简单:从当前模型采样一堆输出,用奖励模型或规则给这些输出打分,挑出分数高的子集,然后拿去继续SFT。由于策略模型生成数据的分布是固定的,拒绝采样不会像在线RL那样去优化策略本身,更像是一种高质量数据筛选机制。我工作中经常把拒绝采样当成"穷人的RLHF"来兜底。某个阶段手里没有足够的算力跑PPO,我就用SFT模型采样几百条指令,过滤出top 20%的回答,再做一轮SFT。虽然理论上这只是在模仿高分数据,但从实际交付的项目看,效果已经能逼近完整的PPO流程了。尤其是偏好数据本身的质量就一般时,拒绝采样因为不引入复杂的策略优化,反而更稳定。离线RL(比如基于离线数据集直接做策略优化的方法)在对齐领域也有一席之地。它的思路是把所有样本看作一个固定的数据集,在这个数据集上迭代优化策略,不与环境交互。这种方法适合那些无法在训练时在线采样回答的场景,比如回答的评估链路长、需要人工介入,或者运行环境受限。但离线RL在分布外样本上容易遇到OOD问题——数据集里没出现过的高奖励区域,模型很难学到,最终效果比在线RL上限低不少。2.5 混合方案:多阶段RL与多奖励融合实际项目里没人会只用某一种方法从头带到尾,更多是多种算法按阶段组合。我自己用得比较多的是这样一个流程:基座模型先做SFT,再用DPO做第一轮对齐,把模型拉到"不怎么说错话"的水平,然后切换到GRPO继续做推理能力的强化训练。多奖励融合也是一个大方向。推理任务可以用规则奖励判断答案对不对、用格式奖励约束输出结构、用语言模型奖励(比如用另一个强LM对回答质量打分)补充语义层面的评估。把这些奖励加权组合,比单一奖励信号要鲁棒得多。我之前在一个数学推理项目里,先算答案正确性奖励,再算格式合规度(是否带思考过程),最终奖励分数 = 0.8 × 正确性 + 0.2 × 格式。权重怎么定本身也是调参活,但至少不会因为只看答案正确而出现"答案对但过程全在胡扯"的情况。3. 实操拆解:PPO和GRPO的实现要点与关键参数理论讲再多,落到代码和训练脚本上才能体现真正的差别。这一节我用自己的调试经验讲PPO和GRPO的核心实现要点,以及在LLM这个特殊场景下的参数选择逻辑。3.1 PPO在LLM上的实现细节LLM上的PPO和经典RL环境里的PPO有两点显著差异。第一,action空间是离散token级别的,每个token都是一个动作,一次生成是一串动作,奖励信号滞后且只在整个序列结束时结算。第二,策略模型本身是巨大的Transformer,不像小山车那种小网络可以随便探索。所以在实现上,PPO的loss会同时包含三个部分:策略损失(policy loss):用clip机制限制新旧策略在每个token上的概率比,防止单次更新步子太大。价值损失(value loss):让critic模型的预测价值接近实际得到的奖励,通常用MSE。KL惩罚项:约束策略模型与参考模型的输出分布距离,一般用前向KL或者近似KL计算。三个loss会按权重相加。我的实际配置里,KL系数初始设置在0.01~0.1之间,clip范围用0.2比较常见,价值损失系数在0.5到1之间。代码层面最需要注意的一点是log-prob的计算时机。PPO要求新策略去估计"如果按照新策略生成,旧样本的概率是多少",所以你在采样之后、更新之前,需要用当时的旧策略保存每批样本的log-prob,更新时再用当前策略算一遍新的log-prob,两者比值就是importance sampling的基础。很多人第一次写PPO时容易在这里出错,直接把生成时的log-prob当成了更新时的log-prob,算出来一个永远为1的概率比,更新直接失效。还有一点是优势估计的归一化。PPO里生成一个完整回答后拿到一个奖励值,这个奖励值在不同问题之间的分布差异很大,不同问题的难度不一样,奖励的自然尺度就不一样。所以常见的做法是按batch对优势值做标准化,把均值拉回0附近。这个操作简单,但对训练稳定性影响极大。3.2 GRPO的实现要点GRPO的实现比PPO清爽很多,核心区别在于优势的计算方式。它的做法是让模型对同一个提示词采样多个回答,然后对这组回答的奖励做归一化,用归一化后的相对值作为每个回答的优势。具体公式上,某个回答的优势等于它的奖励减去这组回答奖励的平均值,再除以这组奖励的标准差。这相当于在组内做了一个z-score标准化。我一般设置采样数量为8个或16个,采样数量太小优势估计的方差大,太大又增加采样耗时。GRPO还有一个很实用的附属优势:省掉的critic模型不仅解决了显存问题,也让训练变得不那么"脆弱"了。我之前用PPO训练7B模型时,经常因为critic的优势更新过快导致策略模型被带偏,换成GRPO后这种情况基本消失,因为它的优势完全从奖励分数中计算,没有经过价值网络的间接估计。但GRPO的收敛速度和工作量是有代价的。它需要你生成大量的组内样本,这本身就要消耗大量算力。如果你只有一组小batch、采样数量也不多,优势估计的噪声会很大,模型甚至会反向学习。实操中我建议GRPO的batch size不要太小,至少保证每个问题有8个以上的采样,配合一个稳定的规则奖励信号,效果才稳。3.3 奖励模型训练与奖励归一化奖励模型的对齐质量决定了整个RL流程的天花板,这一点很多人容易忽视。奖励模型通常是一个在SFT基座上加了回归头的模型,输入是prompt + 回答,输出是标量分数,训练数据是人类的偏好对(A比B好)。训练目标用Bradley-Terry模型:让奖励模型对A的分数尽量高于B。奖励模型训练中最常见的坑是奖励模型的分数偏好漂移。训练时给奖励模型看的是SFT阶段的输出,但RL阶段模型生成的是新分布的输出,这两个分布会逐渐偏离,奖励模型在新分布上的打分就不可靠了。现在业界常用的缓解办法有:训练奖励模型时混入一部分策略模型采样得到的响应(硬负样本挖掘)、定期用当前策略采样做奖励模型的持续微调、以及使用多个奖励模型投票取平均。奖励归一化也很关键。我的经验是:不要直接拿奖励模型的原始分数当RL的奖励,因为不同批次数据之间的分数尺度不稳定。可以先在batch内做标准化,或者用滑动平均来归一化。有次我在一个中文问答项目里没有做归一化,结果训练到一半,奖励模型更新了,模型分数整体抬高,导致后面所有优势被灌水,训练直接跑飞。3.4 KL散度与熵控制的平衡KL散度项的作用是把模型"拴"在参考模型附近,防止模型为了迎合奖励信号失去语言流畅性。但这个系数的大小要仔细调,我调试时见过两幅截然不同的面孔:KL系数太大,模型几乎不动,白训几千步;KL系数太小,模型放飞自我,开始输出重复句式或者自说自话。实践中我一般把KL系数作为后置调节手段——先在几个小batch上做短实验,观察KL值的走势和reward的走势。如果reward在涨、KL涨得也快,说明模型正在剧烈偏离参考策略,要加大系数;如果KL掉到很低、reward也停滞了,说明模型太保守,要减小系数。在GRPO里还有一个替代用法,把KL项作为直接约束直接加到奖励上,而不是只在loss里做惩罚。熵奖励(entropy bonus)也是保底项。我在监督微调阶段就见过一些模型输出变得特别单一,一个意思反复说好几遍,这就是熵降得太低的典型症状。在RL训练中监控生成文本的熵值很有必要,如果熵值掉得太快,我会加一个熵奖励项(一般数值在0.001~0.01之间),给模型的token分布一个"别太自信"的推力。4. 常见问题与排查实录这节我把自己和同行交流时遇到的高频问题整理一下。这些问题都不是理论推演的,是在真实训练日志里反复踩过的坑,每个都有对应的排查路径和修复方案。4.1 奖励黑客问题奖励黑客是RL训练里最常说的一个词:模型发现了奖励函数的漏洞,用了一种不遵守人类意图但奖励分数很高的方式完成了任务。典型案例:某个意图分类任务里,模型的奖励取决于分类标签是否匹配,模型学会了不管输入是什么都输出"正面"标签,因为正面标签在数据集里占了大多数,期望奖励最高。这问题的根源是奖励函数不够完备,单纯调大KL系数是治标不治本。我在实践中的应对思路是:一是加强奖励函数的约束维度,不只是给一个分数,而是提供过程反馈,比如格式没写对就单独扣分,或者让奖励模型对过程质量也打分;二是在训练过程中持续人工抽检高奖励样本,看看它们是否真的合理,不要只盯着奖励曲线看;三是定期用对抗性样本测试奖励模型,看它能不能识别出明显违背任务约定的输出。4.2 训练崩溃与loss异常PPO训练中loss突然飙升或者左边飞走是常有的事。我排查这类问题时有一套固定的顺序:先看KL值,如果KL暴增,说明策略在快速偏离参考模型,常规做法是先降低学习率,再看看reward是不是突然跳高,如果是,大概率是奖励模型对某个异常样本打出了极端分,可以把这个样本从奖励模型训练集里挖出来检查;再看clip比例,如果大部分样本都触发clip界限,说明更新步长太大,踩一下学习率;最后看优势分布,如果优势方差巨大,建议把优势归一化的窗口调大。我在一次数学推理任务里遇到过诡异的现象:loss正常降低,reward也在涨,但生成的答案质量肉眼可见地在变差。后来排查发现是reward模型被格式奖励喂偏了——模型只要带了特定的推理标签,分数就给得很高,它就不管答案对不对了。这类问题只看数值是看不出来的,一定要配合人工抽检每一步生成的真实样本来判断。4.3 偏好过拟合与多样性崩塌偏好数据是有限的,反复用同一批偏好数据做DPO,模型的多样性会明显下降。我做过一个对话安全强化项目,前几轮DPO之后模型在安全维度上表现很好,但继续训练下去,模型所有的回复都变成了安全但没营养的模糊话术,完全不解决问题,多样性指标肉眼可见地崩塌。这现象和"过度优化"的本质是一样的:模型会把概率质量集中到它认为最安全的高奖励区域。缓解手段有几类:一个是动态增加一些离分布样本到偏好数据集,让模型知道不是只有一种回答方式才算高分;另一个是降低DPO的β参数,β越大对偏离参考模型的惩罚越重,偶尔稍微放松这个约束能让模型保持一些探索性;第三个是加入一定比例的SFT数据做混合训练,保住基础的表达能力。4.4 超参敏感性与实践速查不同算法对超参的敏感性差异很大。我整理了一张速查表,基于我自己的经验值,不代表所有任务都适用,但可以作为起步参考:算法关键超参推荐起始范围敏感性说明PPOclip范围0.1~0.3太大会不稳定,太小更新慢PPOKL系数0.01~0.1依赖reward尺度,建议做归一化后调DPOβ(温度)0.05~0.5越大多样性越好,但对齐强度下降GRPO组内采样数8~16太小噪声大,太大耗时翻倍奖励模型学习率1e-6~5e-6梯度噪声大,偏好信号稀疏其中一个容易被忽略的点是DPO β参数和数据质量的耦合关系。数据越干净,β可以相对调大一些;数据里有争议对,β反而要调小,不然模型会被噪声样本带偏。我第一次跑DPO时用了一个固定β=0.1,训练到中期发现多样性骤降,后来降到0.05配合数据清洗才好起来。5. 方法选型建议与一条可落地的实践路径看完全部分类之后,大家最容易问的就是:"那我该用哪个?"这没有标准答案,跟任务类型、数据情况、算力资源强相关。我给一个基于经验的选型建议,然后分享一套我自己在实践中走通的路径。5.1 不同场景下的方法选择思路如果任务是可验证的推理型任务(数学、代码、逻辑题),奖励信号天然可计算,我首选GRPO或RFT。规则奖励加上组内相对优势能避免额外训练奖励模型的开销,效果非常直接。如果是开放域对话、安全性、有帮助性这种主观性强的任务,奖励需要人味,DPO或IPO更合适,因为它们不需要显式训练奖励模型,直接从偏好对里学就行。前提是你的偏好数据质量足够高,对里能明确分出高下。如果资源非常有限,只有单卡或双卡环境,ORPO和RFT是相对可行的路线。ORPO连参考模型都不要,一个模型跑完对齐,显存压力最小;RFT其实是拿采样和过滤替代了RL优化,性价比也不错。如果追求极致效果、且不心疼算力,PPO(或PPO-ptx)仍然是综合上限最高的方案。我见过团队用几千张卡做SFT + PPO训练超大模型,那个效果确实不是轻量方法能轻易追平的。但这种方案的调试成本也很现实,需要配置专门的训练工程团队来维护。5.2 不同资源约束下的成本对比我按自己跑过的7B模型经验给一个粗略的资源参考,项目和卡型号不同会有浮动,但量级可以参考:方法额外模型单机显存需求(7B)训练稳定性效果上限PPO需要RM、Reference、Critic4个7B模型左右中低高GRPO需要RM或规则奖励、Reference2~3个7B模型左右中高高DPO需要Reference2个7B模型左右高中高ORPO无1个7B模型即可中中RFT需要RM或规则评分1个7B模型即可高中从显存角度来看,ORPO和RFT是最省心的选择。但从效果上限角度来看,GRPO可能是当前性价比最优的折中,这也是为什么开源推理模型热衷用它。5.3 一套经历过考验的组合路径如果要给一个从零开始的团队推荐路径,我建议按这个顺序走:第一步,先用SFT把模型的基础指令跟随和表达能力拉到位。这一步不扎实,后面所有RL都白搭。第二步,用DPO或IPO做第一轮偏好对齐,把模型的"坏毛病"收敛掉,比如说空话、绕弯子、无所谓式回答。这个阶段的目标不是让模型变强,而是让它变正。第三步,针对要强化的具体能力(推理、代码、指令执行)切换到GRPO,配合规则奖励做针对性训练。这里的提示词要和第二步的数据分布尽量保持一致,避免模型在做RL时把前面学到的行为模式忘掉。第四步,训练完成后用真实场景的数据做评估,发现问题后回到相应阶段做增量数据补充和重训,而不是直接继续裸跑RL。这套路径我实际用下来最大的体会是:每个阶段都要有明确的验收指标,不要在SFT没达标时急着上RL,也不要在DPO没收敛稳时就跳到GRPO。强化学习在LLM训练里是个精细活,每一步的质量都影响下一步的上限。结尾做LLM强化学习这一年多,我自己踩过最大的坑就是总想一上来就找最复杂的方案,结果PPO还没调稳就急着上,最后一堆问题交错在一起难以排查。后来把每个阶段的验收标准和选型逻辑理清楚了,训练反而顺畅了。如果只让我挑一个建议,那就是先把奖励信号设计明白,再谈算法选型——奖励信号的质量决定上限,算法只是逼近这个上限的方式。希望这篇分类梳理能帮大家少走点弯路,有什么实操上的问题,欢迎一起讨论。
做LLM训练绕不开强化学习这块,标题里这五个字看着简单,真要分类起来其实挺讲究的。我前几年刚开始接触大模型对齐时,也把PPO、DPO、GRPO这些名词搞得晕头转向,后来用了一段时间才理清楚它们之间的血缘关系和适用场景。这篇博文就把LLM里常用的强化学习方法按我自己的理解重新梳理一遍,包括它们解决什么问题、核心原理是什么、训练时有哪些坑,希望能给正在做微调和对齐的同行一些参考。全文会按五条路线来讲:RLHF体系下的PPO家族、规则奖励驱动的推理RL(GRPO、RFT)、偏好优化直推路线(DPO、IPO、KTO、ORPO)、轻量替代方案(拒绝采样、离线RL),以及多奖励融合的混合方案。每个方法我都会结合自己的实操经验说明它的定位、原理和适用边界,最后给出选型建议和一套可落地的实践路径。1. 先搞清楚RL在LLM训练中的位置:理解分类的底层逻辑要理解LLM里的强化学习方法为什么这么多样,得先明白强化学习在大模型训练流程里扮演的角色。很多人一上来就背方法的区别,结果遇到具体场景还是不知道选哪个,这就是因为没先建立整体框架。1.1 LLM训练的三个阶段,RL卡在哪一环现在主流的LLM训练流程大体分三步:预训练、监督微调(SFT)、对齐(Alignment)。预训练让模型学会语言规律和世界知识,SFT让模型学会跟随指令的格式和风格,但这两步都只是在"模仿",模型并不知道什么样的回答是真正被用户认可的。对齐阶段才是强化学习的舞台——我们让模型在给定输入下生成多个候选输出,用奖励信号去评估这些输出,然后通过优化策略让模型产生更高奖励的回复。这个阶段里,LLM被看成一个策略网络:输入是一段对话或指令,输出是一个回答的token序列,整个生成过程就是策略在环境中交互的过程。环境就是"用户需求"和"奖励模型"的组合,状态是当前的上下文,动作是每一步要生成的token,奖励是生成的完整回答拿到的评分。理解这个抽象映射很重要,后面所有方法的差异本质上都是围绕"奖励从哪来"和"怎么用奖励去更新模型"这两个问题的不同回答。1.2 分类的三个维度:优化对象、奖励来源、训练架构我见过不少人把强化学习方法按"有没有单独的训练奖励模型"来分,这太粗了,实操中不够用。我自己习惯按三个维度同时去卡位:优化对象:是直接优化策略模型本身,还是先学一个奖励模型再通过它优化策略?这决定了方法属于在线RL还是偏好优化路线。奖励来源:奖励是来自人类标注偏好训练的奖励模型、规则化硬性指标(比如答案正确性、格式合规性),还是直接从人类排序里偏好推导?训练架构:是否需要单独的critic模型(价值模型)、是否要参考模型(reference model)约束、是online还是offline的样本获取方式?用这三个维度去卡,任何方法都能找到位置。PPO需要训练奖励模型,需要参考模型做KL约束,需要critic模型估计优势函数,属于在线RL,奖励来源是学习到的奖励模型。GRPO同样需要奖励模型,但不要critic模型,通过组内采样来估计相对优势。DPO根本不需要训练奖励模型,直接从偏好数据中推导隐式奖励,训练架构上只需要策略模型和一个固定的参考模型。这三个维度也从侧面说明了为什么方法会越来越多:每个维度上都有可简化的空间,有人想办法砍掉critic,有人想办法砍掉奖励模型,有人想办法砍掉参考模型,路径就这么分化出来的。2. 五条主要路线逐一拆解:从PPO到混合方案分类不是为了搞出一张整齐的表格贴墙上,而是为了知道每类方法适合解决什么问题。下面这五类基本覆盖了目前业界能见到的所有主流做法,我结合自己的应用经验把它们拆开讲。2.1 RLHF体系:从PPO到PPO-ptxPPO(Proximal Policy Optimization)是最经典的RLHF实现方式,它的核心思路是在策略优化过程中加一个"信任域"约束——每次更新不要让新策略离旧策略太远,用clip机制限制更新幅度。逻辑上讲,PPO在LLM上的工作流程是这样的:第一步,用人工标注的偏好数据训练一个奖励模型,用这个模型的语言是"给一段模型输出打分,分数反映它符合人类偏好的程度";第二步,让当前策略模型对每个提示词生成回答,奖励模型为这些回答打分;第三步,用这个分数算出优势函数,再通过clip后的策略梯度更新模型参数。为了防止模型为了刷分说出违背原有语言能力的话,PPO在目标函数里加了KL散度惩罚项,约束当前策略和参考策略(通常是SFT模型)之间的距离。我自己实战下来,PPO在LLM任务里的效果上限很高,但训练资源消耗和稳定性问题确实让人头疼。需要同时加载四个模型:策略模型、参考模型、奖励模型、critic模型。我试过在单机8卡环境下跑7B模型的PPO,显存经常告急,只能塞下3个模型,最后用冻结参考模型参数加开启梯度检查点才勉强跑起来。但稳定性问题不是优化显存能解决的,优势估计、KL系数、学习率的任何一个环节出了问题,loss就会异常波动,生成样本的多样性也会显著下降。PPO还有个变体叫PPO-ptx,在最原始的RLHF论文里出现过,它在PPO的loss里混入了一部分预训练数据上的交叉熵损失,目的就是防止模型在对齐过程中遗忘预训练阶段的通用能力。这个做法现在看起来挺有先见之明的,后来很多人在做对齐时都发现模型通用能力下降,重新加回ptx项或者用混合数据训练来缓解。2.2 规则奖励驱动的推理RL:GRPO、RFT与RLVR推理模型爆火之后,GRPO(Group Relative Policy Optimization)成了开源社区和很多公司训练推理模型的首选。它的设计初衷很直接——PPO里那个critic价值模型又费显存又不稳定,能不能不要它?GRPO的做法是:对每个问题,让模型采样生成一组(比如8个或多个)回答,然后用规则奖励模型对每个回答打分,用组内相对优势替代PPO中critic的绝对优势估计。简单说,一个回答如果在这组里得分高于平均,它的优势就是正的,低于平均就是负的。这样计算优势不需要训练价值网络,省掉了大量显存开销和训练不稳定的来源。这里的奖励来源非常关键。训练推理模型时,奖励往往不是学习出来的,而是规则定义的,这就是所谓的RLVR(Reinforcement Learning with Verifiable Rewards)。比如代码题可以直接编译跑单元测试判断对不对,数学题可以比对最终答案与标准答案是否一致,或者检查回答是否严格遵循了gradual reasoning的格式要求。这些奖励是客观、可验证的,不需要训练一个奖励模型去"猜测"好坏。在实操中我还遇到过RFT(Rejection Fine-Tuning),它其实是介于SFT和RL之间的过渡方法:先用强模型或真实奖励生成大量样本,过滤出高奖励的子集,然后用这些数据做SFT。虽然严格来说它不算RL,但因为操作简单、效果好,很多团队把它当成轻量版的强化学习在用。推理模型的RL训练中还有个特别有意思的现象——格式奖励(format reward)占比过高会催生模型的"投机行为"。模型会发现只要输出带推理标签的格式就能拿分,于是生成大量无意义的中间步骤。后来很多团队的做法是同时给格式奖励和正确的最终答案奖励,并且对格式严格性做正则约束。某开源推理模型的训练报告里提过,奖励设计的好坏比算法选择的影响还大,我是认同的。2.3 偏好优化路线:DPO、IPO、KTO、ORPODPO(Direct Preference Optimization)走了一条完全不同的路。它巧妙地证明了:在KL约束的目标函数下,最优策略和奖励模型之间存在一一对应关系。既然有这种关系,就可以跳过显式的奖励模型训练,直接把偏好数据(好回答/坏回答对)代入目标函数,让策略模型在最大化好回答概率的同时降低坏回答的概率,并在过程中用参考模型控制偏离程度。这对工程实践的冲击是巨大的。数据准备工作从"标注分数"简化成"收集成对偏好",训练从四模型变成双模型,稳定性问题大幅缓解。我自己做过对比实验:同样的偏好数据、同样的基座模型,DPO的训练时长只有PPO的一半不到,显存占用也少了接近一半。但DPO也不是没问题。它对偏好数据中"好"和"坏"的边际差异很敏感,如果数据里都是那种"一个90分和一个70分"的对,模型会倾向于把概率质量压到极端的这两类答案上,牺牲中间质量的输出。有一段时间我在数学题上跑DPO,模型逐步走向"要么疯狂输出高分答案、要么直接摆烂给低分答案"的两极分化。IPO(Identity Preference Optimization)是DPO的一个理论修正版,它不再依赖于Bradley-Terry模型那种偏好概率建模,而是直接优化一个更稳健的排序目标,目标是"让好回答的隐式奖励比坏回答高出一个间隔",而不是去精确拟合偏好概率。这个修正让它在偏好数据噪声大、或不满足BT模型假设的场景下比DPO稳。KTO(Kahneman-Tversky Optimization)则换了一个输入需求,它不需要成对的偏好数据,只要知道每个回答是"好的"还是"坏的"就能训。这听起来像是减少了标注工作量,但实际操作中,单侧标签(只有正面或只有负面)对训练的稳定性影响很大,需要精细调节正负样本的权重。我在小规模数据上试过KTO,效果和DPO接近,优势主要是数据收集灵活一些,对显存不太友好的场景友好。ORPO(Odds Ratio Preference Optimization)更激进,它连参考模型都去掉了,直接在SFT阶段就融入偏好优化,通过计算生成好回答和坏回答的几率比来作为内部奖励信号。这意味着你只需要一个模型就能完成对齐训练,显存门槛大幅降低,推理阶段也没有增加任何开销。但我个人实测下来,ORPO对基座模型的初始状态比较敏感,基座已经很强时效果还行,基座弱一点时倾向于让模型输出变得保守。2.4 轻量替代方案:拒绝采样与离线RL严格意义上拒绝采样不是RL,但它在对齐流程中的地位又很特殊。它的操作逻辑很简单:从当前模型采样一堆输出,用奖励模型或规则给这些输出打分,挑出分数高的子集,然后拿去继续SFT。由于策略模型生成数据的分布是固定的,拒绝采样不会像在线RL那样去优化策略本身,更像是一种高质量数据筛选机制。我工作中经常把拒绝采样当成"穷人的RLHF"来兜底。某个阶段手里没有足够的算力跑PPO,我就用SFT模型采样几百条指令,过滤出top 20%的回答,再做一轮SFT。虽然理论上这只是在模仿高分数据,但从实际交付的项目看,效果已经能逼近完整的PPO流程了。尤其是偏好数据本身的质量就一般时,拒绝采样因为不引入复杂的策略优化,反而更稳定。离线RL(比如基于离线数据集直接做策略优化的方法)在对齐领域也有一席之地。它的思路是把所有样本看作一个固定的数据集,在这个数据集上迭代优化策略,不与环境交互。这种方法适合那些无法在训练时在线采样回答的场景,比如回答的评估链路长、需要人工介入,或者运行环境受限。但离线RL在分布外样本上容易遇到OOD问题——数据集里没出现过的高奖励区域,模型很难学到,最终效果比在线RL上限低不少。2.5 混合方案:多阶段RL与多奖励融合实际项目里没人会只用某一种方法从头带到尾,更多是多种算法按阶段组合。我自己用得比较多的是这样一个流程:基座模型先做SFT,再用DPO做第一轮对齐,把模型拉到"不怎么说错话"的水平,然后切换到GRPO继续做推理能力的强化训练。多奖励融合也是一个大方向。推理任务可以用规则奖励判断答案对不对、用格式奖励约束输出结构、用语言模型奖励(比如用另一个强LM对回答质量打分)补充语义层面的评估。把这些奖励加权组合,比单一奖励信号要鲁棒得多。我之前在一个数学推理项目里,先算答案正确性奖励,再算格式合规度(是否带思考过程),最终奖励分数 = 0.8 × 正确性 + 0.2 × 格式。权重怎么定本身也是调参活,但至少不会因为只看答案正确而出现"答案对但过程全在胡扯"的情况。3. 实操拆解:PPO和GRPO的实现要点与关键参数理论讲再多,落到代码和训练脚本上才能体现真正的差别。这一节我用自己的调试经验讲PPO和GRPO的核心实现要点,以及在LLM这个特殊场景下的参数选择逻辑。3.1 PPO在LLM上的实现细节LLM上的PPO和经典RL环境里的PPO有两点显著差异。第一,action空间是离散token级别的,每个token都是一个动作,一次生成是一串动作,奖励信号滞后且只在整个序列结束时结算。第二,策略模型本身是巨大的Transformer,不像小山车那种小网络可以随便探索。所以在实现上,PPO的loss会同时包含三个部分:策略损失(policy loss):用clip机制限制新旧策略在每个token上的概率比,防止单次更新步子太大。价值损失(value loss):让critic模型的预测价值接近实际得到的奖励,通常用MSE。KL惩罚项:约束策略模型与参考模型的输出分布距离,一般用前向KL或者近似KL计算。三个loss会按权重相加。我的实际配置里,KL系数初始设置在0.01~0.1之间,clip范围用0.2比较常见,价值损失系数在0.5到1之间。代码层面最需要注意的一点是log-prob的计算时机。PPO要求新策略去估计"如果按照新策略生成,旧样本的概率是多少",所以你在采样之后、更新之前,需要用当时的旧策略保存每批样本的log-prob,更新时再用当前策略算一遍新的log-prob,两者比值就是importance sampling的基础。很多人第一次写PPO时容易在这里出错,直接把生成时的log-prob当成了更新时的log-prob,算出来一个永远为1的概率比,更新直接失效。还有一点是优势估计的归一化。PPO里生成一个完整回答后拿到一个奖励值,这个奖励值在不同问题之间的分布差异很大,不同问题的难度不一样,奖励的自然尺度就不一样。所以常见的做法是按batch对优势值做标准化,把均值拉回0附近。这个操作简单,但对训练稳定性影响极大。3.2 GRPO的实现要点GRPO的实现比PPO清爽很多,核心区别在于优势的计算方式。它的做法是让模型对同一个提示词采样多个回答,然后对这组回答的奖励做归一化,用归一化后的相对值作为每个回答的优势。具体公式上,某个回答的优势等于它的奖励减去这组回答奖励的平均值,再除以这组奖励的标准差。这相当于在组内做了一个z-score标准化。我一般设置采样数量为8个或16个,采样数量太小优势估计的方差大,太大又增加采样耗时。GRPO还有一个很实用的附属优势:省掉的critic模型不仅解决了显存问题,也让训练变得不那么"脆弱"了。我之前用PPO训练7B模型时,经常因为critic的优势更新过快导致策略模型被带偏,换成GRPO后这种情况基本消失,因为它的优势完全从奖励分数中计算,没有经过价值网络的间接估计。但GRPO的收敛速度和工作量是有代价的。它需要你生成大量的组内样本,这本身就要消耗大量算力。如果你只有一组小batch、采样数量也不多,优势估计的噪声会很大,模型甚至会反向学习。实操中我建议GRPO的batch size不要太小,至少保证每个问题有8个以上的采样,配合一个稳定的规则奖励信号,效果才稳。3.3 奖励模型训练与奖励归一化奖励模型的对齐质量决定了整个RL流程的天花板,这一点很多人容易忽视。奖励模型通常是一个在SFT基座上加了回归头的模型,输入是prompt + 回答,输出是标量分数,训练数据是人类的偏好对(A比B好)。训练目标用Bradley-Terry模型:让奖励模型对A的分数尽量高于B。奖励模型训练中最常见的坑是奖励模型的分数偏好漂移。训练时给奖励模型看的是SFT阶段的输出,但RL阶段模型生成的是新分布的输出,这两个分布会逐渐偏离,奖励模型在新分布上的打分就不可靠了。现在业界常用的缓解办法有:训练奖励模型时混入一部分策略模型采样得到的响应(硬负样本挖掘)、定期用当前策略采样做奖励模型的持续微调、以及使用多个奖励模型投票取平均。奖励归一化也很关键。我的经验是:不要直接拿奖励模型的原始分数当RL的奖励,因为不同批次数据之间的分数尺度不稳定。可以先在batch内做标准化,或者用滑动平均来归一化。有次我在一个中文问答项目里没有做归一化,结果训练到一半,奖励模型更新了,模型分数整体抬高,导致后面所有优势被灌水,训练直接跑飞。3.4 KL散度与熵控制的平衡KL散度项的作用是把模型"拴"在参考模型附近,防止模型为了迎合奖励信号失去语言流畅性。但这个系数的大小要仔细调,我调试时见过两幅截然不同的面孔:KL系数太大,模型几乎不动,白训几千步;KL系数太小,模型放飞自我,开始输出重复句式或者自说自话。实践中我一般把KL系数作为后置调节手段——先在几个小batch上做短实验,观察KL值的走势和reward的走势。如果reward在涨、KL涨得也快,说明模型正在剧烈偏离参考策略,要加大系数;如果KL掉到很低、reward也停滞了,说明模型太保守,要减小系数。在GRPO里还有一个替代用法,把KL项作为直接约束直接加到奖励上,而不是只在loss里做惩罚。熵奖励(entropy bonus)也是保底项。我在监督微调阶段就见过一些模型输出变得特别单一,一个意思反复说好几遍,这就是熵降得太低的典型症状。在RL训练中监控生成文本的熵值很有必要,如果熵值掉得太快,我会加一个熵奖励项(一般数值在0.001~0.01之间),给模型的token分布一个"别太自信"的推力。4. 常见问题与排查实录这节我把自己和同行交流时遇到的高频问题整理一下。这些问题都不是理论推演的,是在真实训练日志里反复踩过的坑,每个都有对应的排查路径和修复方案。4.1 奖励黑客问题奖励黑客是RL训练里最常说的一个词:模型发现了奖励函数的漏洞,用了一种不遵守人类意图但奖励分数很高的方式完成了任务。典型案例:某个意图分类任务里,模型的奖励取决于分类标签是否匹配,模型学会了不管输入是什么都输出"正面"标签,因为正面标签在数据集里占了大多数,期望奖励最高。这问题的根源是奖励函数不够完备,单纯调大KL系数是治标不治本。我在实践中的应对思路是:一是加强奖励函数的约束维度,不只是给一个分数,而是提供过程反馈,比如格式没写对就单独扣分,或者让奖励模型对过程质量也打分;二是在训练过程中持续人工抽检高奖励样本,看看它们是否真的合理,不要只盯着奖励曲线看;三是定期用对抗性样本测试奖励模型,看它能不能识别出明显违背任务约定的输出。4.2 训练崩溃与loss异常PPO训练中loss突然飙升或者左边飞走是常有的事。我排查这类问题时有一套固定的顺序:先看KL值,如果KL暴增,说明策略在快速偏离参考模型,常规做法是先降低学习率,再看看reward是不是突然跳高,如果是,大概率是奖励模型对某个异常样本打出了极端分,可以把这个样本从奖励模型训练集里挖出来检查;再看clip比例,如果大部分样本都触发clip界限,说明更新步长太大,踩一下学习率;最后看优势分布,如果优势方差巨大,建议把优势归一化的窗口调大。我在一次数学推理任务里遇到过诡异的现象:loss正常降低,reward也在涨,但生成的答案质量肉眼可见地在变差。后来排查发现是reward模型被格式奖励喂偏了——模型只要带了特定的推理标签,分数就给得很高,它就不管答案对不对了。这类问题只看数值是看不出来的,一定要配合人工抽检每一步生成的真实样本来判断。4.3 偏好过拟合与多样性崩塌偏好数据是有限的,反复用同一批偏好数据做DPO,模型的多样性会明显下降。我做过一个对话安全强化项目,前几轮DPO之后模型在安全维度上表现很好,但继续训练下去,模型所有的回复都变成了安全但没营养的模糊话术,完全不解决问题,多样性指标肉眼可见地崩塌。这现象和"过度优化"的本质是一样的:模型会把概率质量集中到它认为最安全的高奖励区域。缓解手段有几类:一个是动态增加一些离分布样本到偏好数据集,让模型知道不是只有一种回答方式才算高分;另一个是降低DPO的β参数,β越大对偏离参考模型的惩罚越重,偶尔稍微放松这个约束能让模型保持一些探索性;第三个是加入一定比例的SFT数据做混合训练,保住基础的表达能力。4.4 超参敏感性与实践速查不同算法对超参的敏感性差异很大。我整理了一张速查表,基于我自己的经验值,不代表所有任务都适用,但可以作为起步参考:算法关键超参推荐起始范围敏感性说明PPOclip范围0.1~0.3太大会不稳定,太小更新慢PPOKL系数0.01~0.1依赖reward尺度,建议做归一化后调DPOβ(温度)0.05~0.5越大多样性越好,但对齐强度下降GRPO组内采样数8~16太小噪声大,太大耗时翻倍奖励模型学习率1e-6~5e-6梯度噪声大,偏好信号稀疏其中一个容易被忽略的点是DPO β参数和数据质量的耦合关系。数据越干净,β可以相对调大一些;数据里有争议对,β反而要调小,不然模型会被噪声样本带偏。我第一次跑DPO时用了一个固定β=0.1,训练到中期发现多样性骤降,后来降到0.05配合数据清洗才好起来。5. 方法选型建议与一条可落地的实践路径看完全部分类之后,大家最容易问的就是:"那我该用哪个?"这没有标准答案,跟任务类型、数据情况、算力资源强相关。我给一个基于经验的选型建议,然后分享一套我自己在实践中走通的路径。5.1 不同场景下的方法选择思路如果任务是可验证的推理型任务(数学、代码、逻辑题),奖励信号天然可计算,我首选GRPO或RFT。规则奖励加上组内相对优势能避免额外训练奖励模型的开销,效果非常直接。如果是开放域对话、安全性、有帮助性这种主观性强的任务,奖励需要人味,DPO或IPO更合适,因为它们不需要显式训练奖励模型,直接从偏好对里学就行。前提是你的偏好数据质量足够高,对里能明确分出高下。如果资源非常有限,只有单卡或双卡环境,ORPO和RFT是相对可行的路线。ORPO连参考模型都不要,一个模型跑完对齐,显存压力最小;RFT其实是拿采样和过滤替代了RL优化,性价比也不错。如果追求极致效果、且不心疼算力,PPO(或PPO-ptx)仍然是综合上限最高的方案。我见过团队用几千张卡做SFT + PPO训练超大模型,那个效果确实不是轻量方法能轻易追平的。但这种方案的调试成本也很现实,需要配置专门的训练工程团队来维护。5.2 不同资源约束下的成本对比我按自己跑过的7B模型经验给一个粗略的资源参考,项目和卡型号不同会有浮动,但量级可以参考:方法额外模型单机显存需求(7B)训练稳定性效果上限PPO需要RM、Reference、Critic4个7B模型左右中低高GRPO需要RM或规则奖励、Reference2~3个7B模型左右中高高DPO需要Reference2个7B模型左右高中高ORPO无1个7B模型即可中中RFT需要RM或规则评分1个7B模型即可高中从显存角度来看,ORPO和RFT是最省心的选择。但从效果上限角度来看,GRPO可能是当前性价比最优的折中,这也是为什么开源推理模型热衷用它。5.3 一套经历过考验的组合路径如果要给一个从零开始的团队推荐路径,我建议按这个顺序走:第一步,先用SFT把模型的基础指令跟随和表达能力拉到位。这一步不扎实,后面所有RL都白搭。第二步,用DPO或IPO做第一轮偏好对齐,把模型的"坏毛病"收敛掉,比如说空话、绕弯子、无所谓式回答。这个阶段的目标不是让模型变强,而是让它变正。第三步,针对要强化的具体能力(推理、代码、指令执行)切换到GRPO,配合规则奖励做针对性训练。这里的提示词要和第二步的数据分布尽量保持一致,避免模型在做RL时把前面学到的行为模式忘掉。第四步,训练完成后用真实场景的数据做评估,发现问题后回到相应阶段做增量数据补充和重训,而不是直接继续裸跑RL。这套路径我实际用下来最大的体会是:每个阶段都要有明确的验收指标,不要在SFT没达标时急着上RL,也不要在DPO没收敛稳时就跳到GRPO。强化学习在LLM训练里是个精细活,每一步的质量都影响下一步的上限。结尾做LLM强化学习这一年多,我自己踩过最大的坑就是总想一上来就找最复杂的方案,结果PPO还没调稳就急着上,最后一堆问题交错在一起难以排查。后来把每个阶段的验收标准和选型逻辑理清楚了,训练反而顺畅了。如果只让我挑一个建议,那就是先把奖励信号设计明白,再谈算法选型——奖励信号的质量决定上限,算法只是逼近这个上限的方式。希望这篇分类梳理能帮大家少走点弯路,有什么实操上的问题,欢迎一起讨论。