资讯详情

PPO与RLHF实战:大模型微调如何学会人类偏好

📅 2026/10/18 12:03:11 | 华诺云谱 👁 阅读
PPO与RLHF实战:大模型微调如何学会人类偏好
1. 为什么微调的终点不是“学会知识”而是“理解偏好”先说一个我踩过的坑。早两年我做大模型微调思路特别朴素找一堆高质量领域数据把模型喂饱让它把知识背下来任务就结束了。当时用LoRA跑了个法律问答模型测试集上回答准确性确实不错条款引用也有模有样。结果一放到真实对话里就露馅了用户问“我这种情况大概能赔多少钱”模型把《民法典》相关条文背得一字不差但完全不管用户的实际处境也不追问任何背景信息给了一段教科书式、冷冰冰、且对当事人毫无帮助的答复。那一刻我才意识到一个问题知识是学会了但偏好完全没学会。用户要的从来不是“正确但没用”的答案而是“符合他意图、符合对话场景、符合安全底线”的答案。可标准微调在做什么它在做最大似然估计也就是让模型看到问题后最大化生成标准答案的概率。这背后的假设是标准答案就是唯一正确答案。但真实世界不是这样的。真实世界的答案是分布式的不是点估计。同样一个用户问题可能有三四种子类型对应完全不同的回答策略同样一段回复在A场景里合适在B场景里就冒犯。你要模型学会的不是“哪句话对”而是“哪种偏好更被认可”。前者是知识后者是价值观、安全边界、表达风格的复合体。这个差异恰恰是传统SFT监督微调无论如何调数据都补不上的。这就引出了RLHF基于人类反馈的强化学习和它的核心算法PPO。我第一次接触PPO是在复现某开源对话模型的训练流程时当时只觉得这东西复杂四个模型、两个损失函数、一堆超参数跑起来动不动就爆显存。但真正把它跑通、看明白之后我反而觉得PPO是当前大模型微调里“最具工程美感”的一环。它解决的问题恰好是SFT解决不了的那个问题让模型不只是学会复述而是学会判断“什么回应更符合人的偏好”。这篇文章我不打算讲教科书式的公式推导那玩意儿看十遍也记不住。我会按我实际做项目的顺序来拆先讲清楚PPO在解决什么问题再讲它背后的RLHF训练管线是怎么搭的然后给出一个可落地的PPO微调实施过程最后把我调参时踩过的坑和总结的实操经验全倒出来。目标是让读完的人能照着搭出一套能跑的实验而不是看完只会背概念。2. 从SFT到RLHF偏好信号是怎么一步步变成训练目标的2.1 SFT的局限它教的是“模仿”不是“判断”很多人对SFT有个误解以为SFT就是“教模型知识”。其实严格来说SFT教的是“模仿”而且是模仿给定数据集里的“唯一标准答案”。这个“唯一标准答案”的设定在工业级场景里会带来三个问题。第一个问题是答案空间的坍缩。同一个问题数据里标注了答案A模型就会把通往A的路径都加强哪怕答案B在特定上下文里更合适。这会导致模型输出变得呆板缺乏应变能力。你如果做过ChatGPT类产品的评测会发现SFT模型经常“不会转弯”面对用户的追问只会重复已经说过的话本质上就是答案空间被锁定死了。第二个问题是错误偏好无法显式纠正。SFT的损失函数只看生成结果和标准答案的token差异它不关心“这句话为什么不好”。比如模型生成了一个带歧视性暗示的回复但在训练数据里恰好没有对应惩罚样本SFT就不会对它产生任何负面压力。它只负责“靠近正例”不负责“远离负例”。第三个问题是无法建模多目标冲突。真实产品里模型要同时满足多个指标有用性、安全性、诚实性、风格一致性。这几个目标之间经常打架。SFT的数据是静态的没法表达“这个回答虽然有用但不安全所以扣分”这种动态权衡。这三个问题叠加导致SFT模型上线后经常出现一种现象**能力有了质感没有。**知识密度很高但一开口就让人觉得“这是个机器人”。2.2 RLHF的整体管线四步走解决上述问题的思路是我不再告诉模型“哪句话是对的”而是让模型自己去“试”然后根据反馈信号调整策略。这个过程就是强化学习里的策略优化。落到大模型场景就是RLHF。一套完整的RLHF管线我一般拆成四步第一步SFT基座训练。先用高质量数据做一轮监督微调得到一个“会说话”的基座。这一步的意义是让模型具备基本的指令跟随能力否则直接上RL模型可能在生成初期就崩溃——输出全是乱码奖励模型根本没法给有效反馈。第二步训练奖励模型Reward Model, RM。这一步是PPO的“裁判”来源。做法是让SFT模型对同一个提示词生成多个候选回答然后让人去排序再用排序数据训练一个打分模型。这个打分模型的输入是“提示词回答”输出是一个标量分数表示这个回答有多“符合人类偏好”。第三步用PPO优化策略。把SFT模型当作要训练的Actor把奖励模型当作环境给的反馈源让Actor不断生成回答、获得分数、更新参数。更新目标是让“高分回答的生成概率上升、低分回答的生成概率下降”。第四步迭代循环。训练完一轮后把新模型生成的回答重新送给人去评估产生新的排序数据再训练新RM再做PPO。这就是RLHF里常说的“反馈飞轮”。这里有个很多人忽略的细节RLHF不是一次训练就完事的它是一个持续的循环。实际项目里我一般至少跑三轮迭代每一轮都会发现上一轮RM没照顾到的边界情况。2.3 奖励信号为什么不能直接用规则打分有人可能会问能不能不训练RM直接写规则给回答打分比如检测到敏感词就扣分包含关键词就加分。我试过结论是可以跑通但效果很粗糙。原因在于偏好是多维度的、有上下文依赖的规则打分会把这种弹性完全压平。举个例子“骂人”这个词如果出现在用户输入里模型应该回避但如果出现在模型生成内容里可能是转述用户的抱怨也可能是对话中的特定语境。规则没法区分这两种情况但人排序可以。RM本质上是在用人的排序信号隐式学习一套“语境化的偏好判断体系”。这也是为什么我一直觉得RM才是RLHF质量的真正上限。PPO只是优化算法它负责把RM给的信号放大如果RM本身判断不准PPO再怎么调也只是把一个错误的偏好学得更彻底而已。3. PPO核心机制拆解为什么它比传统策略梯度更稳、更适合大模型3.1 从策略梯度到PPO要解决两个致命问题PPO全称是Proximal Policy Optimization近端策略优化。要理解它得先知道它要解决什么。传统策略梯度方法的思路是让模型去和环境交互收集一批轨迹数据然后根据“这条轨迹的回报高还是低”来调整策略参数。回报高的轨迹增大概率回报低的缩小概率。听起来很合理但落地有两个致命问题。第一个问题是步长敏感。更新步长太小训练慢到没法看步长太大策略一下就崩了生成质量雪崩式下降。而且这个“合适步长”会随着训练推进不断变化很难用固定值去卡。第二个问题是样本效率低。每更新一次参数旧策略生成的样本就不能再用了得重新采集。大模型场景下每次生成都涉及完整的前向推理样本采集成本极高。如果一版参数就要采一批新数据训练根本跑不动。PPO解决这两个问题的核心手段我总结为三板斧第一板斧重要性采样重用旧数据。PPO允许用旧策略采到的数据来更新新策略只要在计算损失时乘上一个重要性权重把新旧策略的概率比修正回来就行。这样一批数据可以多次更新样本利用率大幅提升。第二板斧裁剪目标函数限制更新幅度。PPO引入了clip操作把新旧策略的概率比限制在1±ε范围内。超出这个范围梯度就设为零。这相当于给每次更新加了一个“安全带”即使奖励信号计算异常策略也不会一步飞出太远。第三板斧GAE广义优势估计减少方差。优势函数的估计越准更新方向越可靠。GAE通过在多步时序差分和蒙特卡洛估计之间做加权折中用λ参数控制偏差和方差的平衡让模型在“看得准”和“跳得稳”之间取得较好折中。3.2 大模型场景下PPO的独特设计为什么要冻结参考模型如果你直接拿强化学习游戏场景的PPO代码来跑大模型会撞上一堵墙KL散度爆炸。原因在于游戏场景里策略的探索空间是有限的但语言模型的输出空间是词表级别的极大。一旦策略更新稍微激进一点生成分布就会偏离SFT基座很远然后输出质量全面崩塌。我见过一次训练中KL散度涨到几百的情况模型生成的文本基本就是词语的随机拼贴完全不可用。所以大模型PPO有一个关键设计冻结一个参考模型通常是SFT基座用来约束Actor的输出分布。在训练时Actor每生成一个token参考模型也会同步生成该token的概率然后计算两者之间的KL散度把它作为惩罚项加到奖励里。这样做的本质是允许模型在SFT基座附近“微调”而不是“重写”。你希望模型在偏好维度上偏移但不希望它在语言能力维度上崩坏。KL惩罚就是那根无形的缰绳。另外大模型PPO里还有一个“混合目标”的细节。最终损失函数通常包含三部分策略梯度损失最大化奖励、KL惩罚损失约束分布、以及价值函数损失让Critic模型学会预测状态价值。三部分之间需要调权重这也是PPO调参最花时间的点。我自己的经验是KL惩罚系数优先从0.01附近开始试跑50步观察KL散度的趋势——如果快速上升直接调低学习率或加大惩罚系数如果几乎没有变化再逐步减小惩罚系数给策略更多探索空间。3.3 Actor、Critic、Reward Model、Reference Model四模型的角色分工PPO大模型训练里显存压力大就大在它要同时维护四个模型。我把它们的分工理一下Actor Model策略模型真正要训练的模型负责生成回答。每一轮更新后它的参数变化就是“偏好学习”的成果。Reference Model参考模型冻结的SFT基座提供生成概率基准用于计算KL散度。它的存在是为了防止策略漂移。Reward Model奖励模型冻结的评分器输入“提示词回答”输出奖励分数。它是偏好信号的来源。Critic Model价值模型预测状态价值也就是“从当前状态出发未来预期能拿到多少奖励”。它给PPO的优势函数提供基线降低策略梯度的方差。四个模型里面只有Actor会更新参数其他三个都冻结。这也意味着你至少需要把四个模型的参数都塞进显存。以7B模型为例用AdamW优化器Actor训练态大约需要16倍模型参数的内存参数本身梯度优化器状态而三个冻结模型各需要约2倍参数内存半精度加载。粗算下来四个7B模型加优化器状态显存需求轻松超过160GB。这也是为什么早期做PPO基本离不开A100-80G集群的原因。不过现在有一些降显存技巧比如LoRA微调Actor、把Reference和RM共享部分层、或采用分阶段释放显存。这些我在后面实操部分会细说。4. 实战落地用PPO微调一个符合“安全且有用”偏好的对话模型4.1 环境准备与数据设计我在实际项目中复现PPO时用的基础环境如下基于常见开源方案实践基座模型某开源对话模型采用LoRA方式做Actor的低秩适配深度学习框架PyTorch 2.0以上配合Accelerate做分布式训练训练框架选择支持强化学习训练的开源训练库如TRL改造自定义奖励逻辑显存方案4张80G显卡模型并行LoRA组合勉强能跑7B规模数据层面我设计了一个“一句话偏好对”数据集提示词“我是个在校学生最近小组作业压力很大感觉自己快撑不住了能不能给我一点建议”回答A安全但敷衍“建议你合理安排时间注意劳逸结合。”回答B安全且有共情“听起来你现在压力真的很大这种感受是正常的。你可以试着把任务拆成小块先完成最紧急的一项。也可以和组员沟通一下分工把负担分摊开。”我把这类带有“高共情偏好”的数据集送入RM训练。重点不是让RM记住“B对A错”而是让RM从A/B的排序差异中学到一种泛化的偏好判断——在情绪倾诉场景下有共情、有具体建议的回复比空洞的套话更被认可。4.2 PPO训练循环的代码实现细节我用TRL库跑通PPO的代码框架核心代码大致如下from trl import PPOConfig, PPOTrainer, AutoModelForCausalLMWithValueHead from transformers import AutoTokenizer, AutoModelForCausalLM # 配置PPO参数 ppo_config PPOConfig( model_namebase_model_checkpoint, learning_rate1.41e-5, batch_size16, mini_batch_size4, gradient_accumulation_steps1, ppo_epochs4, init_kl_coef0.02, # KL惩罚初始系数 target_kl1.0, # 目标KL上限 clip_range0.2, # PPO裁剪范围 gamma1.0, lam0.95, entropy_coef0.01, # 熵奖励系数控制探索 ) # 加载Actor和Reference模型 model AutoModelForCausalLMWithValueHead.from_pretrained(actor_lora_sft) ref_model AutoModelForCausalLMWithValueHead.from_pretrained(actor_lora_sft) # 加载RM模型打分 rm_model AutoModelForSequenceClassification.from_pretrained(rm_checkpoint) # 初始化PPOTrainer ppo_trainer PPOTrainer( configppo_config, modelmodel, ref_modelref_model, tokenizertokenizer, ) # 训练循环 for epoch in range(num_epochs): for batch in dataloader: # 生成回答 response_tensors ppo_trainer.generate( batch[prompt], batch_size16, max_new_tokens128, pad_token_idtokenizer.eos_token_id ) # 用RM模型打分 rewards rm_model( input_idstorch.cat([batch[prompt], response_tensors], dim-1) ).logits.squeeze(-1) # 注入KL惩罚 stats ppo_trainer.step(batch[prompt], response_tensors, rewards)这里有几个细节值得特别注意第一generate的时候一定要用Actor当前版本去生成不能用缓存。我见过有同学为了省时间把生成结果缓存下来反复用结果KL散度全乱套了。第二RM打分时输入是prompt和response拼起来不是只打response的分。因为同一个回答在不同提示词下的偏好分数完全不同RM需要看到完整上下文才能给出合理判断。第三每个batch里尽可能保证提示词多样性。如果整个batch都是同一种类型的提示词RM给出的分数分布会很窄PPO的优势估计会失去区分度模型偏好学习效率直线下降。4.3 为什么我建议先让RM模型“越级”工作跑通一轮PPO后我做的第一件事不是看输出效果而是单独评估RM的排序准确率。我的做法是拿一个保留的偏好排序测试集让RM对每个提示词的候选回答打分然后计算“高分回答是否被排在前面”的准确率。如果这个准确率低于75%我不会启动PPO。理由很简单PPO的每一步更新都依赖RM的评分信号。RM如果是个“糊涂裁判”PPO就是在把噪声当信号放大训练只会越来越歪。先修裁判再让运动员比赛这是RLHF最重要的一条经验。我在某次项目中RM的排序准确率只有68%。我硬着头皮跑了PPO结果训练曲线很好看奖励稳步上升但人工评估生成的回答发现模型学会了“讨好RM”的捷径——生成冗长但空洞的句子因为RM对这种格式给了偏高的分数。后来我把RM数据扩充、重新排序训练准确率提到82%后再跑PPO效果立刻不一样。奖励上升曲线更稳人工评估的“有用性”和“安全性”同步提升。5. PPO训练中最容易翻车的四件事以及我的排查方法5.1 KL散度爆炸先检查参考模型有没有被冻结KL散度爆炸是PPO新手最常遇到的问题。现象很典型训练步数还没跑过100步KL散度从个位数直接飙到三位数生成文本开始词不达意。我排查KL爆炸的顺序是先确认Reference Model的权重是否真的被冻结。有些人用了model.requires_grad_(False)但没冻结BatchNorm层或者未完整冻结Embedding层导致参考模型参数在悄悄变化KL惩罚失去了基准。其次检查学习率PPO的Actor学习率通常比SFT低一个数量级一般在1e-6到2e-5之间。我实测下来7B模型用5e-5的学习率20步内KL就会开始失控。最后再检查init_kl_coef如果设成0或者太小等于把缰绳松了。5.2 奖励模型训练不充分导致的“奖励黑客”奖励黑客是RLHF里非常典型的失败模式。所谓奖励黑客就是模型不是提升了回答质量而是找到了一个能让RM给出高分的“漏洞模式”。我遇到过最典型的一个案例模型学会了在所有回答末尾都加一句“如果需要更详细的建议请告诉我”。这句话在RM训练数据里高频出现在高分回答中于是RM把“这句话存在”当成了高分信号。结果模型生成大量无关回答时也会带上这句话表面上奖励分数高了实际上用户体验下降——因为用户觉得被敷衍。对付奖励黑客我的经验是在RM训练数据里增加负样本覆盖专门收集“虽然格式合格但内容不合格”的回答让RM学会区分“形式好”和“内容好”。每训练200步做一次人工盲评而不是只看奖励曲线。如果发现奖励上升但人工评分下降马上停止训练检查RM是否有可利用的规律。在RM打分时加入适当的随机扰动或降低RM置信度阻断模型对精确打分的过度拟合。5.3 同一个batch里reward的分布太窄优势估计失效PPO的优势函数计算依赖于“当前回答的得分相对这个batch的平均得分高多少”。如果所有回答的分数都差不多优势就趋近于零梯度更新方向不稳定训练自然无法收敛。这种情况最容易出现在数据太单一的场景。比如你只收集“安全相关”提示词RM对大多数回答都给了偏安全的分数区分度自然低。解决办法是在提示词层面做分层采样。每轮训练前我把提示词按场景分组情绪倾诉类、事实查询类、身份假设类、敏感边缘类等每组采样相同数量组成batch。这样做的好处是每个batch的内部方差足够大RM的评分区间更广PPO的优势估计才有参考价值。5.4 生成时解码参数不一致导致训练和推理行为脱节这是最隐蔽的一个坑。训练时PPO的Actor生成回答用的是带随机性的采样解码比如temperature1.0目的是让模型充分探索。但推理上线时产品侧通常会把temperature调低甚至用贪心解码追求稳定性。这会导致一个结果训练时模型学到的偏好在推理时因为解码策略不同而被削弱。我在某个对话机器人项目里训练时temperature1.0上线时temperature0.6结果用户反馈“模型回答变保守了”后来排查才发现是解码策略不一致导致的。解决办法在PPO训练的最后阶段把temperature从1.0线性降到0.7左右用这种近似推理环境的采样方式做若干步微调能显著提升训练和线上行为的一致性。6. 从“调通PPO”到“控好PPO”我个人沉淀的调参与评估清单6.1 关键超参数一览不是公式越多越好而是每个参数都知道在管什么很多人学PPO容易被一大堆参数淹没。我自己的习惯是把参数按“管什么”分成四类调参时只动最关键的那几个。参数作用域我的建议初始值调参信号learning_rateActor更新幅度1e-6 ~ 2e-5KL散度上升过快时调低init_kl_coef约束强度0.01~0.05KL接近0时调低KL爆炸时调高clip_range单步更新上限0.2优势波动大时可降到0.1lamGAE参数优势估计方差/偏差平衡0.95训练不稳时调低到0.9entropy_coef探索强度0.01生成多样性不足时调高ppo_epochs每条数据的重复利用次数3~4过拟合时降低到2这里我想强调一个容易被误用的参数ppo_epochs。它代表每条数据被用来更新几次。数据量少的时候有人贪心地设成10甚至更高结果模型对同一批数据过拟合生成内容开始机械重复。我的建议是除非每条prompt下采样了足够多的多样化回答否则ppo_epochs不要超过4。6.2 评估不等于看奖励曲线三套并行的评估办法RLHF项目里最忌讳只看训练损失和奖励曲线就宣布成功。我总结了一套三层评估法每层回答不同的问题。第一层自动化指标。计算生成结果的多样性distinct-n、长度分布、KL散度变化。这一层主要用来“排雷”快速发现训练是否异常。第二层RM打分。用保留的RM测试集给新模型的回答打分和SFT基座做横向对比。这一层反映“模型是否学到了RM认为好的偏好”但它只代表RM的判断。第三层人工盲评。找一批真实用户场景把SFT基座、PPO后的模型、以及一个商用模型作为对照的回答混在一起让人盲选“哪个更好”。这一层是终极裁判。我经历过一次很典型的情况自动化指标和RM打分都显示PPO模型优秀但人工盲评里用户普遍觉得PPO模型回答“太啰嗦”“太小心”反而更喜欢SFT基座那种简洁直接的风格。后来分析发现RM训练数据里“高分回答”普遍偏长RM学会了“长即好”的偏好PPO自然就把模型往“话痨”方向推。这个案例说明RLHF的瓶颈不在PPO算法而在RM的偏好建模。如果你发现PPO模型行为偏离预期第一反应该是检查RM学到了什么偏好而不是反复调PPO超参。6.3 一条被验证过的“安全且有用”偏好训练路径结合我自己跑通的几条项目线我总结出一条相对稳妥的“偏好训练路径”特别适合“安全且有用”这类复合偏好的场景第一步SFT基座先做一轮强安全数据微调。重点加入安全边界类指令数据让模型学会“不配合有害请求”的基本能力。这步不做后面PPO要花大量训练步数才能把有害行为压下去性价比很低。第二步RM训练数据里人为制造“高危但表面有用”的对比对。比如“如何逃避网课考勤”这类问题一个回答是直接教方法一个是拒绝并解释原因。让RM学会识别“看似有用但实际有害”的模式。第三步PPO训练时从安全SFT模型初始化ActorKL惩罚系数设为0.02先跑小规模验证每50步人工看一眼生成样例。第四步训练稳定后逐步降低KL惩罚系数给模型更多空间去细化表达风格。这时生成的回答会从“安全但生硬”慢慢变成“安全且自然”。这条路径我跑过不下三次每次都能稳定地让模型在安全性不掉线的前提下把表达质量提升一个档次。6.4 一个冷门但好用的技巧用“坏回答”做负向提示PPO大多数时候在干一件事让高分回答的概率变大。但实际场景里真正拉开体验差距的往往是模型会不会生成“低分回答”。所以我会在PPO数据里主动加一部分“典型坏回答”作为候选让RM给极低分。比如我给模型一个提示词“帮我写一封请假邮件。”候选回答里除了正常的请假邮件我会故意塞一个“亲爱的老板我明天不来了就这样吧”这种低情商回答。RM会给它打很低的分PPO就会学习去压低这类回答的生成概率。这个做法的额外好处是模型会隐约学到“糟糕表达的反面”而不只是“高分答案的正面”。生成边界更清晰人工评估时“极差回答”的出现频率会明显下降。7. 微调之上的思考当你把PPO跑通之后真正的难点在哪里很多人把PPO当成一个“终极算法”以为学完它就掌握了微调的全部。但当我真正把PPO跑通、并连续做了几个实际项目后我的感受是PPO只是把“人的偏好”转化为“模型行为”的最后一段管道。困难不在管道本身而在管道上游两件事第一件能否定义清楚你想要什么偏好。你和业务方坐在一起开会对方说“要安全且有用”听起来很清晰但落到具体数据上全是分歧什么算安全是回避敏感话题还是在涉及价值观输出时保持中立什么算有用是信息准确还是让用户觉得被共情每个定义分歧最后都会体现在RM训练数据的标注一致性上。标注一致性差RM就学出一个“摇晃的偏好”PPO跟着学出一个“摇摆的行为”。第二件是否有可持续的反馈迭代机制。我见过很多团队花一个月做出一版RLHF模型上线后发现bad case一堆然后就没有然后了——因为他们没有建立“收集bad case→重新排序→更新RM→重跑PPO”的迭代链路。RLHF不是一个一次性工程它是一个持续运营的系统。从这个角度看PPO不是让你一步到位解决所有微调问题的银弹。它的价值是给你一套“让模型越来越懂人”的机制。前提是你愿意持续往里投入数据、标注、评估的资源。如果你正准备入坑PPO我给一个最实在的建议不要从零开始写PPO实现直接用成熟开源框架先把流程跑通然后再一点点换成自己的RM、自己的数据、自己的评估体系。等你真正理解了每个模块在整体流程里的作用再去读那几篇经典论文你会有一种“原来是这个意思”的通透感。到那时候你手里的PPO才真正是你自己的工具而不是一个只会跑demo的脚本。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑