神秘而难以理解的大模型强化学习技术
2023年最让我崩溃的RLHF:从PPO到DPO,我的血泪史
开场:那个永远没等到的邮件
你有没有经历过这种场面?公司请了个“专家”来分享,三小时PPT翻下来,RLHF、PPO、reward model这些词满天飞,台下听得热血沸腾。
散会了,我凑过去问了个实际问题:“advantage function在LLM场景下具体怎么算的?”
对方一愣。
打个哈哈说“回头发邮件给你”。
这封邮件,我到现在都没收到。🤯
又去问我司的强化学习大牛,人家正忙着搞机器人抓取,头都不抬扔下一句:“这东西跟游戏里用的PPO一回事,自己看论文。”
行吧,自己啃就自己啃。
说到这儿你可能觉得我惨,但更惨的在后面——我前两年拿强化学习做过量化交易,A2C、DDPG、PPO都撸过一遍。当时用PPO调了一个日内交易策略,回测收益率干到30%,心里那个美啊。但实盘一直没敢上——收益曲线太顺滑了,明显过拟合。不过PPO比别的算法稳定是真的,超参数落在一个范围内都能收敛。
所以当我发现LLM对齐的核心还是PPO时,心里其实有点底。
但真等我上手搓模型……
那才叫一个:大象闯进瓷器店。
第一节:PPO进了语言模型,画风全变了
在标准RL里,PPO的活很清晰:策略网络看状态、做动作、拿reward、更新参数。状态空间和动作空间都有明确的维度,你说啥它理解啥。
但到了语言模型场景,这套东西直接变形了。
你想想,动作空间是什么?词汇表大小,一般5万tokens。观察空间呢?输入token序列的分布,维度是(词汇表大小^序列长度)。
吓人不?这个数字大到你想骂人。
更绝的是——环境是谁?
是人。对,就是活生生的人类。因为reward是人给的(或者通过奖励模型模拟的)。策略网络就是正在微调的LLM,它生成回复的过程就是跟环境交互。一个轨迹就是一段prompt加上生成的回复。
这本身没什么,真正让我头疼的是PPO训练时需要的四个模型:策略模型、价值模型(或者价值头)、奖励模型、参考模型。
四个模型同时塞进显存,那酸爽谁用谁知道。
我用DeepSpeed-Chat 0.3版本训Baichuan2-13B时,单卡A100 80G跑不起来啊。搞了四卡ZeRO-3才勉强塞下,训练过程比预期慢一倍。你说这是搞AI还是搞健身?天天举铁搬模型。
更气的是调参。
PPO的KL惩罚系数、clip range、GAE lambda,这些在游戏环境里随便拉一拉就能跑的值,到了语言模型里完全失效。我测试了三四组reward模型,reward曲线一路狂飙到3,但生成结果却越来越胡言乱语。
中间有一次奖励模型打分突然跳水到负数。
我排查了半天才发现——生成的句子长度太长,reward模型没见过这种格式,直接判了低分。
你看,这根本不是强化学习的问题,而是数据管道的问题。
InstructGPT那篇论文我早就读了,当时觉得挺清楚。但真正复现的时候,你会发现很多细节被一笔带过。比如reward模型训练时的pairwise ranking怎么做数据增广,比如PPO阶段初期策略模型和参考模型之间KL怎么控制。
后来LLaMA 2官方发技术报告,把RLHF部分写得稍微细了点。但我按他们的配置训了一下,出来的基座在helpfulness和harmlessness上有明显trade-off——你调一个维度另一个就崩。
至于百川2,他们直接承认自己用了RLHF,但没有公开太多PPO细节。
我猜,他们也吃了不少苦头。😏
第二节:DPO像是救星,但别当万能药
2023年5月,DPO那篇论文出来时我正在出差。酒店里一口气读完,说实话有种“原来还有这条路”的感觉。
核心思想简单得让人想拍大腿:
既然我们追求的最优策略和奖励函数之间可以推导出一个闭式关系,那为什么非得先训个奖励模型再用PPO去近似呢?直接把偏好数据构建成损失函数来更新策略不就行了?
换句话说,不需要四个模型了,训练时只要一个模型和一组偏好对。
你说香不香?
我第一时间把它应用到手头的一个客服对话对齐任务上。数据来自人工标注的偏好pair,大概十万条。用DPO取代原本的PPO方案后,训练时间缩短了60%,显存占用减半。生成结果的BLEU和人工评分甚至略好于PPO版本。
读到这儿你可能觉得DPO是万能钥匙了。
但问题也来了,而且是大问题:
偏好数据的质量直接决定DPO的成败。
有些标注员打的“chosen”和“rejected”区别很小,模型学不到东西。最离谱的是有一次我发现数据里存在循环偏好(A>B, B>C, C>A),DPO训练直接振荡了。
你想想,模型都懵了:你到底要我学啥?
这也就是后来SPO(引入纳什均衡)要解决的问题。
另外,DPO也不是完全跟RL决裂。它的推导依然基于Bradley-Terry模型,假设偏好是全局一致的,只是把优化过程从RL变成了监督学习。但在多轮对话场景里,奖励累积的问题DPO没有直接处理。
所以后来有人搞了multi-turn DPO。
2023年下半年,开源社区冒出了一堆DPO的变体。RRHF就更狠了,说我不但不要奖励模型,连策略模型和参考模型都能压缩成一个,用排名损失直接对齐。
我试过RRHF,效果确实接近DPO,但需要自己生成候选回复并排序,数据流程又复杂了。
每个方法都宣传自己“简单高效”,等你真上手,每个都有暗坑。
行吧,这就是技术圈的日常。
第三节:框架换了三趟,每趟都有新意外
2023年初我选DeepSpeed-Chat,因为它是第一个把RLHF流水线打包的工具。
但用下来问题不少。
首先是版本分裂。DeepSpeed-Chat早期版本和最新的DeepSpeed混用会导致各种CUDA kernel不兼容。有次我更新了DeepSpeed,DeepSpeed-Chat直接跑不起来,查了一下午发现是某些自定义算子失效了。
而且它的文档写得比较简单,reward model的训练数据格式要求很死板,我得花时间写转换脚本。说白了,工具是好的,但不太懂我这种普通用户的痛苦。
到了年中,Hugging Face的TRL开始支持PPO和DPO,社区明显往那边迁移。
我试了TRL的trl.SFTTrainer + trl.PPOTrainer,API清爽很多,但默认配置对LLaMA的支持还没有优化,得自己写data collator。不过TRL最吸引我的是它把reward model作为独立组件,你可以用自己的模型打分,灵活性高。
后来我用TRL单独做了DPO的对比实验,比DeepSpeed-Chat快了一截。
LLaMA 2发布时带了一套RLHF的具体实现,但那个代码仓库纯粹是科研风格,到处是硬编码参数。不过它的技术报告里“奖励模型对生成长度敏感”这一点对我帮助很大。
我在做Baichuan2的RLHF时,特别对生成长度做了分桶,reward模型在不同长度范围内各训一个,然后投票。
效果明显改善。
还有2023年末出现的推理加速框架,比如vLLM的PagedAttention和DeepSpeed-MII的Chunked KV Cache。对齐训练不太直接用它们,但在RLHF的数据生成和推理阶段,它们对效率提升很明显,尤其是beam search和prefix共享加速。
回过头看,2023年整个RLHF生态就像西部拓荒:框架日新月异,但每个都有坑。
到今天我最推荐新手直接上TRL+DPO,省事。
如果非要用PPO,得做好显存和调参的心理准备,而且得先花时间搞稳定的reward model——那个才是天花板。
结语:不再神秘,但依然敬畏
去年年末我跟团队复盘时说过一句话,现在分享给你:
2023年对齐技术最大的进步不是哪个算法更优,而是让更多人开始正视“数据”和“稳定训练”比“算法创新”更重要。
你看,PPO这个黑盒我不再觉得神秘了,它就是一个有潜力的工具,但对LLM来说,环境和reward的构建才是真正难的地方。DPO的出现降低了门槛,但你得认真对待偏好数据本身的质量。
我的预感是,2024年会出现更多不依赖RL的对齐方法,比如纯粹的智能体反馈、自生成数据蒸馏,甚至直接把alignment loss塞进SFT里(已经有ORPO这么干了)。强化学习方向里的价值函数、时序差分这些概念,在大模型里应用的空间会越来越小——语言模型自己的表征能力太强了,很多RL里的近似技巧在自回归生成面前反而显得笨拙。
但话说回来,如果你真想理解AI怎么学会“讨好”人类,RLHF这条路线绕不开。哪怕你最终用的只是DPO一行loss,背后的RL思维——用交互替代标注、用整体回报替代局部拟合——才是真正决定效果上限的东西。
2023年我花了无数个通宵调reward曲线、调试显存泄漏、纠结KL惩罚系数。每个深夜都在怀疑自己是不是选错了方向。
但当我看到最终模型能够拒绝一个危险指令、或者主动追问用户需求时,又觉得这事儿值得。
做RLHF,不仅要懂强化学习,还得有个好心态。
说白了,你得学会跟模型的“脾气”死磕,而它的脾气,往往比你的大。
说真的,搞RLHF,算法是骨架,数据是血肉,但只有心态才是最后能带你上岸的那条船。 🚢
读者评论 3