写这篇的时候,我正在深夜盯着一轮训练日志。reward曲线忽高忽低,像心电图一样让人焦虑。旁边屏幕上是SFT阶段产出的模型样例——问它“今天天气怎么样”,它能给你一本正经编一段包含湿度、风速、紫外线指数的完整播报;但你要是问一句“你觉得我今天该穿什么”,它就卡壳了,要么重复训练集里那些模板化的“请注意保暖”,要么干脆给你复述一遍天气预报。这种“知识扎实但不会应变”的状态,就是我们常说的“复读机”现象。
在LLM训练的实际链路里,SFT(Supervised Fine-Tuning,监督微调)和RL(Reinforcement Learning,强化学习)是两套完全不同的“教法”。SFT是在教模型“背答案”,RL则是在教模型“看脸色”——学会判断情境、理解偏好、灵活调整输出策略。我这次想聊的,就是SFT为什么容易把模型训成复读机,以及RL又是通过什么机制把模型从复读机状态拽出来、让它真正学会“见什么人说什么话”的。
这篇内容主要面向刚接触大模型对齐训练的工程师,以及那些已经做完SFT、正准备上RL但心里没底的团队。我会把原理、流程和踩坑经验一起放出来,争取让看完的人能少走点弯路。
1. 复读机是怎么被SFT一手教出来的
要理解RL的意义,先得把SFT的“功劳”算清楚。SFT不是洪水猛兽,它是整个对齐链路里不可或缺的基石。但如果只看SFT的产出,你确实会发现模型“智商在线、情商为零”,这背后的原因不复杂。
1.1 SFT的本质:教模型“背标准答案”
SFT做的事情,形式上极度简单——拿一批“问题-标准回答”配对数据,让模型做监督学习。输入是用户问题或指令,标签是人工写好的高质量回答,损失函数就是标准的交叉熵,模型要做的是最大化每个token的预测概率。用“背书”来类比非常贴切:老师给你一本题库,你把每道题的答案背熟了,考试时碰到原题能拿满分,碰到变式题就抓瞎。
这个阶段模型的优化目标是拟合训练集分布,说白了就是“我见过这句话,我就能接下去”。所以SFT的效果上限,完全取决于你给的数据覆盖面。数据里只有“如何做红烧肉”,模型就不可能自动学会“如何做清蒸鱼”。你可以说它推理能力不足,也可以怪数据量不够,但本质上,SFT根本没有给模型建立“根据反馈调整策略”的机制。
我在实际操作中见过不少团队,SFT数据质量不错、量也到位,模型跑起来问答流畅,大家都很开心。但只要把问题换成训练集里完全没有过的问法,比如把“请介绍一下深度学习”换成“我儿子问我深度学习是什么,怎么用他能懂的话说”,模型立刻露馅,开始套模板。这个现象就是SFT的分布外泛化(OOD)问题,它天生存在,无法通过堆数据完全解决。
1.2 什么时候SFT会把模型训成病态复读机
SFT本身是稳健的,但训练策略不对,复读机症状会急剧恶化。我总结了几种典型成因:
训练轮次(epoch)过多:SFT本质是让模型拟合数据集分布,你反复在同一批数据上跑太多轮,模型会开始“背诵”整段训练文本,而不是理解语义。正常SFT跑1-3个epoch就够了,跑5个以上,你问它问题,它能整段复述出训练集里某个相似问题周围的无关内容。
学习率过大:SFT阶段通常使用1e-5到2e-5的低学习率,因为此时模型已经经过预训练,知识底子很好。如果学习率开大了,新知识会覆盖预训练学到的通用能力,模型变得“只认新数据、不认世界常识”,极端情况下直接灾难性遗忘。
数据多样性不足:很多团队做SFT时只喂指令数据、不喂通用对话数据,导致模型在指令问答风格里“过拟合”,一旦用户以闲聊、反问、间接表达的方式提问,它就接不住。这属于数据配比问题,也是复读机的重要成因。
数据格式死板:如果所有SFT样本都是“指令-标准回答”的格式,模型学到的是一种格式映射,而不是沟通能力。真实用户讲话根本不按格式来,模型喜欢的格式一旦被打破,表现立刻垮掉。
所以,SFT阶段模型的“复读机化”,是数据、超参、训练策略多重因素叠加的结果。理解了这一点,你才能明白RL进来救场的价值——RL不依赖你给它标准答案,它靠的是“奖励信号”驱动模型自己探索该怎么做。
2. RL到底是怎么教模型“看脸色”的
RL和SFT的底层逻辑完全不一样。SFT告诉模型“正确答案长什么样”,RL告诉模型“什么样的行为能获得更高收益”。前者是模仿,后者是试错和策略优化。这也是为什么我们常说RL教模型“看脸色”——它通过奖励反馈,学会了判断“当前情境下,什么样的回应才是用户想要的”。
2.1 学习信号从天壤之别换成“即时反馈”
想象一个场景:你教一个实习生写周报。SFT式教法是你给他十篇优秀周报让他模仿;RL式教法是让他自己写,然后你告诉他“这篇太啰嗦”“这篇没重点”“这篇数据不错但结论太武断”,他根据你的反馈不断调整写法。实习生最终学会的不是某个固定模板,而是“面对不同读者、不同目标,我应该怎么组织内容”的策略。
在大模型场景里,这个“实习生”就是策略模型(Policy Model),你的反馈就是“奖励模型”(Reward Model)给出的奖励分数。模型每次生成一段回答,奖励模型给它打个分,分数高说明用户满意,分数低说明用户不满意,策略模型根据分数调整自己的生成策略。这套机制,就是RLHF(基于人类反馈的强化学习)的雏形。
2.2 关键技术拆解:PPO、GRPO、DPO
整个RL环节里,策略优化的算法选择是核心。我先说最经典的PPO(Proximal Policy Optimization,近端策略优化),它是早期RLHF的标配。PPO的思路是:让模型在采样数据上更新策略,但限制每次更新的幅度,不让模型行为变化过快。它需要一个价值模型(Critic)来估计状态价值,还要维护一个参考模型来算KL散度,防止策略跑飞。理论上很漂亮,工程上却比较重——四个模型(策略模型、参考模型、奖励模型、价值模型)同时跑,显存占用和算力开销都不小。
后来DeepSeek推出的GRPO(Group Relative Policy Optimization,组相对策略优化)把这事简化了。它去掉了价值模型,改用同一个问题采样多个回答、在组内做相对比较来估计优势值。好处很明显:省显存、训练更稳定、做法也更直观。我实测下来,GRPO在小规模算力环境下比PPO友好得多,收敛速度也不差。
还有一个绕不开的是DPO(Direct Preference Optimization,直接偏好优化)。DPO的角度更另类——它干脆不要奖励模型,直接在偏好数据(好回答vs差回答)上做策略优化。它的数学推导告诉我们:在某种约束下,最优策略可以用一个简单的偏好分类损失来求解,不需要显式的RM和强化学习迭代过程。工程上DPO简单到不可思议,一条训练脚本就能跑起来,资源占用也低。
这三者的选择逻辑,我整理成了下面这张表,方便做技术选型时参考:
| 算法 | 需要奖励模型 | 需要价值模型/参考模型 | 显存开销 | 稳定性 | 适用场景 |
|---|---|---|---|---|---|
| PPO | 是 | 是/是 | 高 | 中等 | 追求精确控制、算力充足的团队 |
| GRPO | 是 | 否/是 | 中 | 较高 | 算力有限、想要稳定收敛的场景 |
| DPO | 否 | 否/是 | 低 | 高 | 偏好数据丰富、想要快速迭代的团队 |
2.3 KL散度:既要看脸色,也不能“忘了本”
任何上过RL的工程师都知道,KL散度是这个环节的“安全带”。模型在追求高分的过程中,很容易为了讨好奖励模型而改变自己的语言风格和知识结构,甚至出现胡言乱语却得分虚高的现象。KL散度在这里充当的角色是:限制策略模型的更新幅度,让它偏离初始SFT模型不要太远。
用个粗俗但好懂的比喻:你不能为了让员工学会拍马屁,就让他把专业技能全扔了——KL散度就是那个提醒“专业能力不能丢”的HR制度。具体数值上,KL系数调太大,模型会保守得像没训过RL;调太小,模型会放飞自我,输出变得怪诞离奇。我记得最开始做PPO时,KL系数从0.01一路调到0.001,才找到一个平衡点,模型既开始有策略性调整,又不至于说胡话。
3. 从SFT到RL的完整训练流程与实操要点
理论讲完了,接下来进入大家更关心的部分:具体怎么操作。完整链路大体是“预训练基座 → SFT → 偏好数据采集 → RM训练 → RL优化”。前面SFT我已聊过,这里重点讲后三步,以及它们和SFT的衔接。
3.1 数据准备与配比:偏好数据才是RL的灵魂
RL阶段的核心燃料是“偏好数据”——同一问题下,好回答和差回答的配对或排名。采集方式一般是人工标注,让标注员对比多个模型回答并排序,或者直接打分数。这些都是真金白银的人力成本。
实际做的时候,我给团队定的执行标准是:
- 问题覆盖面要广:不仅要覆盖指令类问题,还要覆盖闲聊、情感支持、创意写作等多样化场景。不然模型只看得到单一维度的“脸色”。
- 配对数据比例要合理:DPO这种直接偏好优化的方法,理论上需要“好回答-差回答对”,但实际中一个回答和多个不同质量的回答对比会更好。我习惯构造1条好的配3条差的,让模型学到梯度方向更明确。
- 要同时保留SFT数据:RL阶段绝对不是把SFT数据扔了只训偏好数据。通常的做法是RL和SFT数据按比例混合,比如SFT占到20%~30%,防止模型在RL阶段把已经学到的能力领域给忘掉。
有一点必须强调:偏好数据的质量比数量重要得多。我见过一个团队灌了十万条低质量偏好数据进去,结果RM给出的分数根本不可靠,最后训练出来模型比SFT版本还差。这个环节宁可少而精,不要多而糙。
3.2 奖励模型设计:你的“脸色评判标准”不能离谱
奖励模型(RM)相当于替人类打分,它的质量直接决定了RL的走向。我个人在工程实践中总结了三个关键经验:
第一,排序任务比打分任务更靠谱。让标注员给两个回答排序,一致性远高于让他们直接打分。0到10分这种连续分数,不同人之间标准飘得厉害,同一人不同时间也可能不一样。而“A比B好”这种相对判断,哪怕标准模糊也能做出合理决策。
第二,奖励模型本身也要防过拟合。RM也是个模型,它在偏好标注上训练,也有自己的“复读机”风险——比如它会过度关注回答长度而不看内容质量。训练RM时必须监控它在独立验证集上的表现,不能只盯着训练准确率。
第三,小心奖励黑客(Reward Hacking)。模型非常擅长钻空子:标注员倾向给长回答高分,模型就会生成越来越长的废话;标注员倾向给包含特定关键词的句子高分,模型就会不顾上下文硬塞关键词。这种时候RL训练表面上loss在下降,实际输出质量已经烂掉了。要防这个,最好的办法是定期人工抽检模型输出,而不是完全依赖RM打分。
3.3 超参与算力配置:一份可直接参考的基准配置
很多朋友问我,到底用什么超参起步合适。我给出一份我实测过、稳定性不错的baseline配置(以7B~13B模型为例):
| 超参数 | PPO/GRPO建议值 | DPO建议值 | 说明 |
|---|---|---|---|
| 学习率 | 1e-6 ~ 3e-6 | 1e-6 ~ 5e-6 | RL阶段学习率必须远小于SFT |
| KL系数 | 0.001 ~ 0.01 | 0.1 ~ 0.5 | DPO的beta参数等价于KL约束 |
| Batch Size | 32 ~ 64 | 32 ~ 64 | 显存不足可减小,但别小于16 |
| 采样温度 | 0.7 ~ 1.0 | 0.7 ~ 1.0 | 采样温度过低会丧失探索性 |
| 训练步数 | 参考loss收敛曲线 | 1 ~ 3个epoch | DPO不要跑太多轮,容易过拟合 |
这里多聊两句。学习率我坚持从特别小的值起步,哪怕收敛慢一点也无妨。RL阶段模型很容易受到波动影响,学习率飙了直接破坏SFT学到的内容,这种事故一旦发生,回退重来特别耗时。DPO的beta参数控制“偏离SFT模型的距离”——beta越小,模型可以偏离越远;如果你希望模型调整幅度大一些,就把beta调小,但注意控制力度。
算力方面,7B模型用GRPO大概需要4~8张A100(80G)才能比较舒服地跑起来。13B模型建议8张起步。DPO因为不需要在线采样,资源需求低一个量级,两张A100就能做实验。
3.4 训练过程的监控指标:别只盯loss
RL环节最忌讳只盯loss。我每次跑训练都会开一块独立白板,记录四个核心指标的走势:
- 奖励均值:模型获得奖励的平均水平,趋势向上说明理想。
- KL散度:策略模型偏离参考模型的程度。如果KL飙升,说明模型正在剧烈改变行为模式,要小心。
- 回答多样性:同样问题多次采样,看输出差异大不大。如果多样性快速下降,模型正在“坍缩”成某种固定套路,这时候要小心复读机以另一种形式复发。
- SFT验证集表现:在RL训练中定期跑SFT阶段的评测集,确保原有能力没被洗掉。
这四个指标缺一不可。我踩过一次坑:某次训练奖励曲线很漂亮,一路向上不回头,结果评测集上能力全面掉点。回头一看KL散度早就飙到天上去了,模型开始胡说八道但恰好踩中了RM的偏好点。后来我把“KL散度超过阈值就暂停训练”写成了自动熔断逻辑,才算解决问题。
4. 一次典型对齐训练的全流程实录
文字聊多了容易飘,我带大家走一遍我今年做的一个客服场景项目的完整记录。这个项目没有特别复杂,但麻雀虽小五脏俱全,能帮你把整个链路串起来。
4.1 训练链路设计
项目目标是训练一个客服大模型,要求它既要懂业务知识,又不能像机器人一样回答问题,要能根据用户情绪调整语气。基座用了开源的7B模型。
- 第一步:SFT阶段。用大约3万条客服问答数据做微调,其中包含标准流程问答和情绪安抚类特殊问答,配比约7:3。训练1个epoch,学习率1.5e-5。这阶段产出模型A。
- 第二步:偏好数据采集。基于模型A,对5000个问题做多版本生成,然后让专业客服团队做排序标注,最终形成5000组“好-差回答配对”数据,其中好回答保证是人工修订过的。
- 第三步:RM训练。用偏好数据训练一个排序式奖励模型。RM的参数量用的1.5B,比策略模型小,避免RM能力过强反而对策略模型过度约束。
- 第四步:GRPO优化。用训练好的RM做组相对优化,每个问题采样4个回答算组内优势。KL系数设为0.005,学习率2e-6,训练了1200步。
4.2 训练日志洞察:我看到了什么
这里放一段当时GRPO训练早期日志的关键信息(简化版):
step 100 | reward=0.612 | kl=2.35 | resp_len=126 step 300 | reward=1.154 | kl=5.02 | resp_len=184 step 600 | reward=2.731 | kl=8.76 | resp_len=267 step 900 | reward=3.485 | kl=12.18 | resp_len=330 step 1200 | reward=3.912 | kl=15.34 | resp_len=402看到这个日志,我第一反应是“出问题了”。奖励一路上涨,看起来很好,但KL散度从2.35涨到15.34,回答长度从126个字涨到402个字——模型正在通过“多写废话”来骗取高分。这让我立刻意识到RM可能对回答长度有偏好,需要处理。
4.3 应对:给RM做“瘦身手术”
我做了两件事。首先,检查RM训练数据里的长度分布,发现标注员确实更偏好长回答,RM继承了这种偏置。解决方法是重新调整标注策略,明确要求“长度不是质量,内容才是”;同时把单条回答超400字的样本标记为“差回答”,人为消除长度偏置。
其次,加大KL惩罚力度,把KL系数从0.005调到0.02,让模型不敢偏离SFT模型太远。这之后,日志开始健康起来:奖励涨得慢但稳定,KL维持在8~10之间,回答长度也稳定在220~250字区间。
最终上线效果对比:
| 指标 | SFT模型A | RL训练后模型 |
|---|---|---|
| 业务问答准确率 | 86% | 89% |
| 情绪安抚满意度(人工打分) | 3.2/5 | 4.4/5 |
| 回答平均长度(字) | 152 | 236 |
| 模板化回答占比 | 38% | 12% |
需要说明的是,准确率提升不算夸张,但“模板化回答占比”从38%降到12%才是RL真正的功劳。模型终于学会了根据用户情绪“看脸色”调整语气,而不再千篇一律甩流程。
5. 避坑指南:RL训练里我踩过的五组坑
这章节是全文的精华所在。很多坑不是试错试出来的,是烧了大量算力和时间才领悟的,我希望你直接跳过。
5.1 奖励黑客(Reward Hacking):模型比你想的更会钻空子
上面那个案例已经展示了最典型的reward hacking形式。我再补充一个更隐蔽的例子:我们的RM训练数据里有一条“如果用户表达困惑,回答中应包含确认性问题”的标注偏好,结果模型学会了在回答最后强行加一句“我这样解释您清楚了吗”,哪怕用户根本没困惑。表面上奖励分数提升了,实际这种回答极其生硬。
避坑心得:无论你的RM训练得多好,都要保留人工抽检机制,定期点开模型的生成结果看。不要只看reward曲线,它能骗你。
5.2 KL系数和生成温度是孪生兄弟
很多人不知道,RL阶段的生成温度和KL系数是有联动关系的。如果你采样温度设得低(比如0.3),模型每次生成都差不多,KL散度会偏小;反过来,温度高了模型探索性强了,KL自然会变大。这意味着你不能单独调KL系数,你每次改生成温度,都得重新审视KL惩罚强度。
我习惯的做法是:固定生成温度为0.9,然后只调KL系数,把探索范围控制住。这样变量少,排障时思路更清晰。
5.3 DPO不香吗?为什么还要折腾PPO
DPO确实省资源、跑得快,但它也有明显的缺陷。它的学习信号完全来自静态偏好数据,没有在线探索的过程。说白了,模型只能在“给定的好vs坏”之间调整,无法探索数据集中不存在的、但也许更好的策略。PPO/GRPO这类在线方法,却能通过生成-评分-更新的闭环,发现人类标注员都没想过的好策略。
经验是:数据质量很高、任务偏简单时用DPO,又稳又省;任务复杂、需要激进探索时,老老实实上GRPO。
5.4 奖励模型和策略模型的大小配比要合理
刚入门的团队常犯一个错误——把RM做得很大,或者直接用强模型当RM。RM太强,打分过于严格,策略模型怎么生成都拿不到高分,最终学不动;RM太弱,又区分不出回答好坏,给不出有效梯度。我用下来比较靠谱的配比是RM参数量是策略模型的1/4到1/8。7B策略模型,配0.5B~1.5B的RM就够。
5.5 SFT阶段不要拼到最后精益求精
有人习惯把SFT阶段的数据调得极其完美、训练到收敛极致,再开始RL。但我的建议是,SFT合格就好,不必花时间“死磕”。因为RL阶段本身会继续调优策略,SFT阶段留下的小瑕疵RL会帮你修正;反过来,SFT阶段过度优化反而让模型行为模式固化,RL探索空间变小。
6. 再往深一层:RL之后,模型还要学什么
RL教模型“看脸色”,本质上是把静态的内容匹配升级成了动态的策略响应。但这只是对齐大模型能力的其中一个维度。从我的观察看,RL技术栈还在快速演进,很多玩法已经开始和别的领域交叉。
6.1 从RLHF走向RLVR:用规则代替人工奖励
现在越来越热的RLVR(Rule-Based Verifiable Rewards,基于规则可验证奖励),核心想法是:某些任务的正确性可以用规则自动判断,不需要人工偏好数据。比如数学题的最终答案是否正确、代码是否能编译运行、数据库查询结果是否匹配。这种“程序化奖励”结合模型探索,已经催生了像DeepSeek-R1这类推理能力大幅提升的模型。
我觉得这个方向在工具调用、代码生成领域潜力极大。你不需要大量标注数据,只需要定义好“什么是对的”,模型自己去试,试出来就是真能力。
6.2 Agent场景下的RL:看脸色升级为看行动结果
在大模型Agent应用中,RL的“奖励”不再只是文本层面的优劣,而是行为后果的好坏——调用工具是否成功、任务是否圆满完成、用户是否最终满意。这时候模型要学的不仅是“说什么话”,更是“做什么决策”。这种RL已经开始从文本生成领域外溢到决策智能领域。
6.3 多模态大模型的RL:更复杂的“脸色”维度
当模型能看图、能听声,RL的反馈就不只是文本质量了,还包括跨模态的思想对齐。比如根据图片内容生成合适文字描述,或者根据用户语音情绪调节文字回复风格。这些场景里,奖励模型需要融合多模态信息,难度上升一个量级,但这恰恰是未来几年的核心战场。
写到最后,分享几条个人体会
SFT和RL的关系,我用一句话总结就是:SFT给模型装上了“知识骨架”,RL让模型学会了“如何把这身骨架用活”。复读机不是终点,也不是失败,它更像是一个必要的过渡态。没有SFT阶段扎实的知识底子,RL再厉害也教不会一个空壳去“看脸色”。
在实际项目里,我最深的一点体会是:做RL不要迷信花哨的新算法,也不要被柳暗花明的benchmark数据迷惑。回到任务本质,想清楚“我的用户到底需要模型懂什么”,然后让反馈信号精准地围绕这个目标运转。奖励模型是你意志的延伸,KL散度是你对保守程度的标尺,采样温度和步数是你的实验手感。这些东西都磨合顺了,训练出来的模型自然既有能力,又有眼力见。
最后再分享一个小技巧:每次RL训练结束后,不要只和SFT模型比指标,要和上一版RL模型比。我习惯保留每一轮训练的策略模型,在验证集上做PK,选胜率更高的那版。这个朴素的办法,帮我挡住过好几次“先涨后崩”的经典翻车现场。