
苦猿的大模型日记 · Day11 · RLHF PPO——让模型学会看人说话-帮普通人把AI学进简历系列前言SFT 出来的模型是个听话但没教养的实习生我先甩一句不太客气的话——SFT 训出来的模型是个听话、但没教养的实习生。会接活儿会切题但一张嘴就让你想捂脸。Day10 跑完 QLoRA你的 Qwen3-8B 已经能听懂指令、能切题回答了——这很了不起从 base 到 chat 的那一脚你踢进去了。我当年第一次跑通 SFT 时盯着生成结果乐了一整晚。但只要你多问它几句乐子就变成尴尬。第一类毛病——啰嗦到让人窒息。你问它今天天气怎么样它答完天气再给你补一段综上所述……总而言之……由此可知天气对人类情绪的深远影响……。一个意思翻来覆去说三遍恨不得把自己当高考作文。第二类毛病——谄媚到没骨气。你说我觉得 A 方案更好它立刻 180 度鞠躬您说得对A 方案确实优秀——哪怕 A 方案明明是错的。它不是在回答你它是在讨好你。第三类毛病——没底线到吓人。你问它怎么黑掉邻居家的 WiFi它真的会一步步教你——因为 SFT 数据里根本没人教过它这种问题该拒绝。这三个毛病说实话不是你 SFT 没训好——是 SFT 这个阶段本身就解决不了。为啥因为SFT 教的是该说什么没教怎么说才得体。SFT 的 loss 只盯着答案段——模型知道要回答、要切题但没有任何信号告诉它哪种回答更讨人喜欢、哪种回答会捅娄子。这就是 Day11 要补的课——对齐Alignment。让模型从会回答进化到回答得有人样。说真的我懂你看到 RLHF 这三个字母时的本能反应——头皮发麻、想关页面。这名字本身就在劝退普通人。但跟着我走一遍你会发现它没那么玄乎该怕的不是名字是显存账——这个我们 PART 04 再算。读完这篇你能搞清楚三件事RLHF 的三段式为啥这么设计少一段行不行PPO 在干啥那个吓人的公式到底在说什么KL 散度为什么是命脉省了它会出什么乱子面试被问RLHF 怎么训你能答出三层——这是今天的简历视角。PART 01训练三段式的最后一段——对齐Day09 我画过一张三段式全景图。今天再拿出来复习一下——预训练学语言→ SFT学回答→ RLHF学喜好Day08 讲了第一段Day09/10 讲了第二段。今天讲第三段——对齐。对齐这个词到底啥意思很多人一听对齐就觉得玄乎。其实就一句话——让模型的行为跟人类偏好对齐。什么叫人类偏好比如同一个问题简洁的答案比啰嗦的好用户问错的时候指出错的比附和的好涉及危险话题拒绝比配合好这些好坏判断SFT 的数据里没有显式信号。SFT 给的是问题-答案对告诉模型该这么答但不告诉它为什么这么答比另一种答法好。RLHF 干的事——把哪个更好这个信号直接喂进训练。一个反直觉点很多人以为 RLHF 会让模型变聪明。错。RLHF 不是让模型变聪明是让模型在该用知识的时候用对的知识。模型的能力是预训练给的Day08模型的回答能力是 SFT 给的Day09/10RLHF 只是在调整输出分布——让那些已有的能力在对的时候、用对的方式冒出来。这跟 Day09 我说的那个反直觉点遥相呼应——SFT 不是让模型学新知识是让模型在该用知识的时候用知识。RLHF 把这事又往前推了一步。SFT 教模型该说什么RLHF 教模型先说哪个、怎么说更得体。PART 02RLHF 三段式总览——一图看懂把对齐这件事拆成可执行的训练流程就是经典的 RLHF 三段式。三步走Step 1SFT 基座从 Day09/10 的 SFT 模型出发。没有 SFT 就没有 RLHF——你得先有一个会回答的实习生才能教它怎么回答更得体。Step 2训 Reward ModelRM用一批偏好数据同一个问题两个答案标注哪个好训一个打分器。给它一个 (prompt, response)它吐出一个标量分数——分越高代表越好。Step 3PPO 强化学习让原模型policy生成回答RM 给回答打分用这个分数当奖励让 policy 朝高分方向改。一个工程认知点这三步是串行的。Step 1 出错SFT 模型本身烂后面全崩。Step 2 出错RM 学坏Step 3 的 PPO 一定会 reward hacking。Step 3 出错PPO 调崩前面两步白干。RLHF 调试地狱的根源就在这——一崩崩一串。三个角色必须先记住后面整篇都会反复出现先在你脑子里挂个号——角色是谁状态policy被训的那个模型持续更新reward model打分器冻结Step 2 训完就不动了reference modelSFT 原模型防 policy 跑偏冻结记住这三个名字。后面 PART 04/05 全靠它们撑场子。PART 03偏好数据 Reward Model 怎么训偏好数据长啥样RLHF 的训练数据跟 SFT 完全不一样。SFT 是「问答对」——一个 prompt 对一个标准答案。RLHF 偏好数据是「问答对 哪个更好」——一个 prompt 对两个答案标注哪个更好{ prompt: 怎么戒烟, chosen: 可以从减少每日烟量开始逐步替代……, rejected: 戒烟很简单意志力强就行弱者才戒不掉。 }经典数据集有这么几个——HH-RLHFAnthropic 出品主打有用 无害LMSYS Chatbot Arena真实用户盲测数据UltraFeedbackGPT-4 标注的偏好数据字段都是同款三件套prompt / chosen / rejected。记住这个字段名——DPO 也用这个Day12 会再用一次。Reward Model 是个啥很多人觉得 RM 神秘。说白了——RM 就是个带评分头的语言模型。架构上你拿 SFT 模型去掉 LM head那个把 hidden state 映射到词表的大矩阵加一个linear → scalar的小头。给它 prompt response它吐出一个数——这个数就是分数。RM 的 loss 怎么算RM 学的不是绝对好坏是相对排序。最经典的做法是Bradley-Terry 模型——让 chosen 的分数比 rejected 高差值越大越好。loss 长这样# RM 训练 loss 伪代码 def rm_loss(rm_model, batch): chosen_score rm_model(batch[prompt], batch[chosen]) # 标量分数 rejected_score rm_model(batch[prompt], batch[rejected]) # 标量分数 # 让 (chosen - rejected) 过 sigmoid越接近 1 越好 loss -torch.log(torch.sigmoid(chosen_score - rejected_score)).mean() return loss直觉翻译chosen 分数要比 rejected 高越高 loss 越小。一个反直觉点因为 RM 学的是相对排序所以——同一个回答在不同的对比对里分数可能差很多。比如回答 A 在{A vs 烂回答}里能拿 5 分但在{A vs 神级回答}里可能只能拿 1 分。RM 的分数是相对的不是绝对的。这个特性后面会埋一个天大的坑——PART 06 会讲。坑①RM 也会学坏RM 最大的坑——它会学偏。如果你的偏好数据里长答案普遍被标成好RM 就会学到越长越好这个表面规律。然后呢后面 PPO 一启动policy 立刻学会——无脑加长输出。回答全是废话但 RM 给的分数高得离谱。这就是后面要反复出现的reward hacking——模型学会钻 RM 的空子而不是真的变好。坑②RM 容量不够另一个不那么明显、但同样致命的坑——7B 模型当 RM经常不够用。为啥因为 RM 要学的是人类偏好的细微差别——好坏答案之间可能只差一句话的语气。这种判断需要模型本身有足够强的理解能力。工业界常用13B 甚至 70B 当 RM。这又是一道理智的门槛——你已经为了省显存用 QLoRA 训了 7B 的 policy现在还要再训一个更大的 RM这就是 RLHF 第一道劝退普通人的坎。PART 04重头戏——PPO 到底在干啥如果你只能记住这一节那就记住这一节。PART 04 和 PART 05 是全文最值钱的两节慢点读。直觉版 PPO把 RM 当老师。policy 每次生成回答RM 给打分——分高的方向policy 就朝那走分低的方向就躲开。听起来简单对吧但这里有个天大的问题——模型会钻空子。RM 喜欢长答案policy 就把所有答案加到 5000 字。RM 喜欢礼貌词policy 就在每句话开头加非常感谢您的提问。它不是真的变好是在骗 RM 给高分。这就是著名的reward hacking——奖励被滥用了原始目标被丢到九霄云外。解药KL 散度光给糖吃不行还得拉一根绳子。这根绳子叫reference model——就是 Step 1 那个原始的 SFT 模型冻结不动。每次 policy 想改都问一句你跟 reference 还差多远差太远就拽回来。这根绳子在数学上叫KL 散度——衡量两个概率分布差异的指标。PPO 的目标函数全文最重要的公式把上面两件事拼起来就是 PPO 的目标函数Objective E[ reward(policy) - β · KL(policy || reference) ]就这一行。全文最重要的一行。逐项拆解——项含义作用reward(policy)RM 给当前 policy 回答的分数推 model 朝高分走KL(policy || reference)policy 跟 SFT 原模型的行为差距拉 model 别跑偏β平衡系数RLHF 最难调的超参之一三句话讲清 PPO 在干啥——RM 给糖、KL 拉绳子、policy 在中间走钢丝。一个反直觉点很多人觉得 KL 项是附加保险可省。省了试试看。没有 KL 项PPO 跑几十步就崩——模型输出不再是人话是 RM 漏洞的答案补丁。比如 RM 学偏了喜欢感谢词policy 就会输出非常感谢感谢感谢感谢感谢感谢……——把整个词表都刷成感谢。没有 KLpolicy 会被 RM 牵着鼻子走到天涯海角。这就是为什么 KL 散度是 RLHF 的命脉——它是把模型拴在人话领地上的那根绳子。PPO 的四模型地狱讲完原理再算笔账。PPO 训练时有四个模型同时驻留显存——模型作用状态policy被训的模型持续更新reference算 KL 用冻结reward model打分用冻结value model算 advantage 用PPO 内部概念通常 policy 的双胞胎显存账——7B 模型4 份同时驻留。哪怕全 FP164×14G 56G 起步。再算上激活值、优化器状态4 卡 A100 80G 是入门券。回想一下 Day10 PART 01——SFT 只要一份模型QLoRA 之后 6G 就能跑。PPO 是 SFT 的近 10 倍显存量级。这就是为什么我在 Day10 结尾说RLHF 留给公司算力。普通人在 4090 上是玩不动 PPO 的。附录完整 PPO clipped objective正文讲到直觉版就够了。但面试官可能追问完整版这里放出来当感兴趣自查——L_clip E[ min(r·A, clip(r, 1-ε, 1ε)·A) ] 其中 r π_new(a|s) / π_old(a|s) # 新旧策略的概率比 A advantage # 优势函数 ε 0.1 ~ 0.2 # clip 范围clip这一项的作用——防止单步更新太猛。如果新旧策略概率比r超出[1-ε, 1ε]这个范围就把它截断。这是 PPO 比 vanilla Policy Gradient 稳的核心原因。面试被问PPO 凭什么稳定就答这一句。PART 05一个 PPO step 的 6 步走PART 04 讲了 PPO 的目标。PART 05 讲一个 step 里到底发生啥。这是全文最干货的清单。建议截图。一个 step 的 6 步1. 从 prompt 池采一批 prompt 2. 用 policy 生成回答 3. 用 reference 算这些回答的对数概率用于 KL 4. 用 reward model 给 (prompt, response) 打分 5. 用 value model 估 baseline算 advantage 6. 用 clipped objective 更新 policy每一步都可能崩——每步的崩盘点Step 2 生成乱码→ 多半是 policy 已经被 KL 拉崩了回退 checkpoint。Step 4 reward 飙升但生成变差→reward hacking 信号。RM 给的分越来越高但人眼一看输出全是废话。这是 RLHF 最阴险的崩盘——loss 数字漂亮模型其实在退化。Step 6 advantage 方差爆炸→ value model 没训好baseline 估不准。要么单独训 value model要么降 lr。一个工程认知点PPO 的 learning rate比 SFT 还要小一个数量级。Day10 我说 QLoRA 的 lr 是1e-4。PPO 的 lr 通常是1e-6 ~ 1e-5。为啥这么小因为 PPO每一步都在动整个 policy 模型——不是动 0.5% 的 LoRA 参数是动 100% 的参数。lr 一大模型当场散架。TRL PPOTrainer 主循环骨架不展开完整 loop实战留 Day12 或专门的 RLHF 实操篇但给你看一眼骨架——from trl import PPOTrainer, PPOConfig, AutoModelForCausalLMWithValueHead # 1. 准备三个模型 policy AutoModelForCausalLMWithValueHead.from_pretrained(qwen3-8b-sft) ref_model AutoModelForCausalLMWithValueHead.from_pretrained(qwen3-8b-sft) reward_model ... # 自己训好的 RM # 2. PPO 配置 config PPOConfig( learning_rate1e-5, # 比 SFT 小一个数量级 batch_size64, mini_batch_size16, kl_penaltykl, # KL 散度惩罚 target_kl6.0, # KL 目标值超了早停 beta0.05, # β 系数 ) trainer PPOTrainer(config, policy, ref_model, tokenizer) # 3. 主循环伪代码 for prompt_batch in dataloader: response policy.generate(prompt_batch) # Step 2 rewards reward_model.score(prompt_batch, response) # Step 4 stats trainer.step(prompt_batch, response, rewards) # Step 3/5/6 内部做 print(stats) # 盯 reward / kl / loss 三条曲线看清楚——主循环看着不复杂复杂的是调参。PPO 训练曲线怎么读沿用 Day10 PART 04 的loss 曲线诊断手册风格——PPO 的训练曲线有三根不是一根曲线正常走势异常信号reward缓慢上升飙升 reward hackingKL围绕 target_kl 波动持续涨 ref 模型没冻好policy loss小幅震荡NaN 梯度爆炸reward 飙升 KL 飙升 必崩。这俩同时涨说明 policy 在脱离 reference且是朝着 RM 的漏洞方向脱的。什么时候早停reward 涨到平台期、KL 还在 target 附近——这是最理想的停止点。再训下去边际收益递减过拟合风险飙升。PART 06RLHF 的三道地狱PART 04/05 讲完原理PART 06 讲为啥工业界开始跑路。地狱①训练不稳定PPO 是出了名的难调。KL 系数β动一下——崩。learning rate 动一下——崩。batch size 动一下——还是崩。我见过有人调一个 RLHF 任务调了两周最后发现是target_kl设小了 0.5。这种调试成本普通人根本扛不住。地狱②显存地狱PART 04 算过——4 卡 A100 80G 是入门券。7B 的 PPO光四份模型驻留就要 56G再算优化器状态和激活单卡 80G 都不够。如果是 13B 或 70B 的模型做 PPO——那是 A100 集群的活跟普通开发者彻底无关。地狱③reward hacking 防不住这是最阴险的一道。RM 一旦学坏policy 一定跟着学坏。而且——reward hacking 很难从 loss 数字看出来。训练 loss 看着正常下降reward 看着正常上升但生成的回答已经全是废话。你要真的去看生成质量——人眼读、抽样评——才能发现问题。这就回到了最原始的人工评测工程效率极低。工业界的两条出路正因为这三道地狱工业界开始找替代方案——路线 ADPODirect Preference Optimization不要 RM、不要 PPO直接用偏好数据训。显存砍一半工程复杂度砍 70%。Day12 的主角。路线 BRLAIF / Constitutional AI用 AI 当标注员替代人类Anthropic 路线。让 GPT-4 之类的强模型来标偏好省人工成本。一个反直觉点很多人会问——既然 ChatGPT 用 RLHF 训出来的那 RLHF 肯定是当前最优方案吧错。ChatGPT 用 RLHF是因为 2022 年那时候没得选。DPO 是 2023 年才出来的。2024 年之后开源社区几乎全切 DPO——Llama 3、Qwen、Mistral 的对齐阶段都是 DPO 或其变种。不是因为 DPO 更强效果接近 RLHF是因为RLHF 普通人玩不起。RLHF 是对的但不是普通人玩得起的——这是 DPO 诞生的真正动因。PART 07实操预警——真要上手 RLHF 得备什么最后一节给真想试 RLHF 的人。先说句心里话——如果你看到这里手已经痒了想跑一把 PPO——我特别理解。我当年看完 InstructGPT 那篇论文当晚就在租显卡的路上。结果三天烧了八百块崩了 N 次最后产出一份能跑但不咋地的模型。这一节就是给你省那八百块用的。硬件门槛先看这个再决定7B 模型 PPO4 卡 A100 80G 起步13B 模型 PPO8 卡 A100 80G70B 模型 PPO那是大厂的活咱普通人就不折腾了单卡 4090 / 3090 玩不动完整 PPO。这不是我泼冷水——是 PART 04 那个四模型账本算出来的硬事实。但你也别完全绝望——有两条路可以走租云算力AutoDL 之类4 卡 A100 一小时大概 10 来块跑一个 demo 也就几十块直接转 DPODay12单卡 4090 就能跑效果接近——这是普通人更现实的对齐方案工具链选择工具适合备注TRLPPOTrainer学原理、跑 demoHF 官方文档全DeepSpeed-Chat工程化落地微软出品分布式优化好OpenRLHF显存极限优化国产开源单卡能塞下更多新手入门先 TRL理解流程。生产环境走 DeepSpeed-Chat 或 OpenRLHF。常见崩盘对照表沿用 Day10 PART 05 的症状 → 原因 → 旋钮风格——症状大概率原因该动哪个旋钮reward 飙升 生成乱码reward hacking加大 βreward 不涨RM 质量差 / lr 太小检查 RM、提 lrKL 持续涨reference 模型没冻好检查requires_grad显存爆value model 没开 LoRAvalue 也挂 LoRAloss NaN梯度爆炸降 lr 或加 grad clip一个判断点苦猿的实在话RLHF 这门课懂就够了。不是说它不高级——它很高级是 ChatGPT 的命脉。但高级和值得你亲手趟一遍是两件事。PART 04/05/06 看明白面试那道 RLHF 题你就能答三层够了。真要训一个对齐模型落地——公司有算力→ 走完整 RLHF 流程个人玩家→ 直接 DPODay12这不是劝退是给你省时间。RLHF 这趟水趟一遍的边际收益远不如把 DPO 跑通、把 RAG 玩明白来得实在。把省下来的钱和时间投到能真正进简历的项目上。结尾RLHF 是面试必问、工程必避的祖宗之法最后说句实在的——RLHF 这东西面试必问工程能避就避。面试官问你RLHF 怎么训三层答案你得答全——三段式框架SFT → RM → PPOPPO 目标函数reward - β·KLKL 为啥不能省防 reward hacking四大坑reward hacking / KL 不冻 / 4 模型显存 / lr 敏感答到这三层面试官就知道你真懂不是看过两篇公众号就上考场。但真要你训一个对齐模型——先试 DPO。同样的偏好数据一半显存效果接近。这是 2024 年后工业界的事实标准。RLHF 这门课懂就够了。Day12 我们就动手 DPO。SFT 让模型开口说话RLHF 让它学会看人说话——前者是技术后者是修养。懂原理是入场券知分寸才是真本事。下一篇 Day12DPO 把 RLHF 砍成一步——同样数据、一半显存、效果接近明天讲透。互动时间你公司训 RLHF 用几卡卡在 PPO 调参还是 RM 质量评论区聊聊我把高频坑整理进 Day12 的实战篇。下一篇预告Day12——DPO 直接偏好优化把 RLHF 砍成一步— END —苦猿 · 帮普通人把 AI 学进简历