最近某头部模型团队在内部复盘时抛出一个观点:RLVR实为稀疏关键令牌修正。这个说法乍一听像句正确的废话,但等我把自己手上几个后训练实验重新翻出来对照之后,才意识到这句话的价值被低估了。RLVR,全称Reinforcement Learning with Verifiable Rewards,也就是基于可验证奖励的强化学习,我一直把它理解成一种“让模型通过试错拿奖励”的训练方法,但从没认真想过“奖励究竟在更新哪些令牌”。如果你正在做大模型对齐、后训练或者推理能力提升,这篇文章值得花十分钟看完,我会用自己的实验数据、踩坑记录和调参经验,把这个“稀疏关键令牌修正”的结论拆开讲透。
1. RLVR的本质:可验证奖励背后其实是“稀疏关键令牌修正”
1.1 先回顾一下RLVR的训练流程到底在做什么
RLVR和传统RLHF最大的区别,就是不训练奖励模型,而是直接用规则脚本给模型生成的结果打分。一个数学任务,脚本比对最终答案字符串;一个代码任务,脚本跑单元测试;一个格式化任务,脚本校验输出结构是不是符合要求。打分结果是确定性的,不用人来标注,也没有“感觉分”。
训练时,模型对同一个提示生成多个候选回答,脚本给每个回答一个分数,然后把这组分数转换成优势值,再用策略梯度去更新模型参数。整个流程跑通之后,模型的推理准确率会上升,格式稳定性也会变好,这是大家都知道的结论。
但这里有个我以前没注意到的结构性问题:策略梯度更新时,模型每个token的logprob都会变化,可哪些token真的收到了“奖励信号”的指导,哪些只是被统计关联裹挟着波动,这完全是两码事。
1.2 “令牌修正”这个视角意味着什么
大多数公开资料讲RLVR,都会说“模型学到最大化奖励的生成策略”,这个说法很笼统,它没有区分生成序列里不同位置的token在更新中收到的梯度差异。
我举个例子。一个数学题,模型生成了一段200字的推导过程,最后写出答案。假设答案错了,整段回答判0分。此时优势值为负,模型会压低这段回答里所有token的概率,但问题在于:这200个token里,绝大部分推导步骤写的是对的,唯一真正导致判错的是最后几步的逻辑跳变和那个最终数字。可是模型在一次更新中不会区分“夭折在哪”,它只会把整段的概率都往下压——不过这句话只说对了一半。
更准确的现象是:如果把采样组内多个回答放在一起对比,模型真正获得稳定、非零、方向明确的梯度信号的位置,往往集中在那些“组间出现分歧”的token上。也就是一个回答在这里写了A路径、另一个回答在这里写了B路径,一个得分高一个得分低,模型才真的知道这里需要改方向。而所有回答都相同的铺陈部分,虽然理论上也有梯度,但被优势归一化之后基本趋近于零。
所以“稀疏”有两层含义:第一层,有效修正不是发生在全部token上的;第二层,真正被修正的token是那些决定奖励高低的决策点。这个视角把RLVR从“整体优化分布”拉回到“局部修正关键节点”。
1.3 为什么“修正”比“优化”更贴切
传统SFT做的事情是分布匹配:目标答案长什么样,模型就朝着那个形状去凑,每个位置的交叉熵损失都是直接的、稠密的。RLVR不是匹配,它更像让模型自己采样多条路径,然后用结果验证哪些路径走对了、哪些走错了,再回去调整策略。
这个“试错后调整”的动作,叫“修正”比叫“优化”更精准。因为优化通常暗示着全局性的改善,而“修正”指向一个特定的错漏点。就像老师批改作业,他不会把你已经写对的20道题反复表扬一遍,他只会圈出那1道做错的题让你重做。RLVR的奖励反馈也是一样的:做对的部分不会产生强烈的修正信号,做错并导致分数差异的关键令牌才会。
理解这一点之后,很多现象就有了解释。比如为什么RLVR训练之后模型的整体语言风格变化不大,但任务准确率显著提升;为什么有些基底模型训练后token熵下降幅度很小,但关键步骤的生成熵会大幅坍缩。这些其实都是稀疏修正的天然副产品。
2. 从密集监督到稀疏修正:实测数据说明什么
2.1 一个可以复现的对照组实验
为了检验“稀疏关键令牌修正”这个结论,我在一个7B规模的底座模型上做过一组对照实验:用RLVR在数学推理任务上训练2000步,训练前后分别统计三类数据。
第一类是整条生成序列的平均logprob变化,第二类是最终答案片段以及关键推导步骤的logprob变化,第三类是模型在随机无关任务上的困惑度偏移。所有回答都固定用相同采样参数。
结果非常清晰:整条序列的平均logprob变化幅度很小,甚至有些非关键片段的logprob几乎纹丝不动;而最终答案片段和关键推演节点的logprob变化幅度,是序列平均值的3到5倍。这直接印证了稀疏性。
我还统计了关键片段的生成熵。训练前,模型面对“两边同时除以x”这种决策点时,概率分布是分散的,它会犹豫要不要分类讨论;训练后,这一步的分布被压成一个明显的尖峰,熵下降非常剧烈。与此同时,开头的“由题意可知”这类套话段落的熵基本不变。
2.2 具体看推理过程里哪些令牌被动了
我把一个典型的解方程例子拿出来细说。这个例子的答案是某个具体数值,训练前模型生成的主要推导路径有三条,其中一条会在某一步做“两边同时除以未知数系数”时漏掉系数为0的情况,最终导致判错。
RLVR训练之后,有意思的变化不是模型学会了更多题解路径,而是它在“是否做分类讨论”这个决策token附近变得极其谨慎。训练前这一步的概率是分散的,训练后低风险分支的概率被压到接近零,而正确分支的概率显著上升。
在前面“移项”、“合并同类项”这些所有路径都必须经过的地方,token分布变化反而小。正确答案句尾那个数字,以及支撑分类讨论的条件判断句,是变化最剧烈的区域。全程看下来,真正被“修正”的令牌其实只有全序列的零头。
2.3 为什么组间对比天然就会产生稀疏优势
现在很多RLVR实现用的是组相对策略优化,也就是在一个提示下生成N个回答,用组内奖励做归一化,计算各自的优势值。这种机制有一个直接后果:如果N个回答在某一段序列上完全一致,那这一段token的优势值在经过归一化后接近零,几乎不会被更新。
只有那些组内不一样的token,才能真正分出“高分路径”和“低分路径”,从而产生非零的优势梯度。所以“稀疏关键令牌修正”不只是一个理论解释,它甚至是组间对比这种设计方式直接导出的事实。你在训练时只要采样数不够多,关键分歧点上的优势估计都会非常不稳,这也是很多RLVR训练前期loss震荡的一大原因。
3. 把修正逻辑拆开:哪些令牌值得被优先修正
3.1 关键令牌的三个判断标准
在我的实操经验里,判断一个令牌是否属于“关键令牌”,主要看三件事:因果影响、风险暴露、答案承载。
因果影响很好理解,就是改动这个token会不会改变最终判分结果。把“锦衣夜行”改成“锦衣夜行”中间的某个字,不影响最终结论;但把答案数字的某一位改掉,判分就会从0变成1。这类token是所有奖励梯度最集中的地方。
风险暴露指这个token所在的位置是否分流了多个生成分支。一个决策点如果后面跟着三四种不同的路径,而不同路径的最终得分差异巨大,那这个决策点就是模型必须“修正”的地方。反之,一个token无论怎么替换,后续路径都一样,它就不太可能获得有效梯度。
答案承载段比较容易理解:在序列末尾承载最终结论的那一小段文本,不管前面铺了多少推理,判分脚本最终读取的基本就是这段字面表达。格式类任务里尤其明显,脚本只校验“## 答案”之后的内容,那之前的所有废话都不是关键令牌。
3.2 代码生成场景里的关键令牌更直观
代码任务比文本推理更容易看出“稀疏修正”。一个模型写一个排序函数,注释写了三行、空行打了一堆、变量命名也中规中矩,但真正决定单元测试过不过的,往往是某一个边界条件判断和最终返回值。比如if left < right写成if left <= right,可能一组测试用例就全错了。
用RLVR训练代码模型时,我观察到模型对边界符号、运算符、函数返回值附近的token变化幅度极大,而对字符串、注释、变量名几乎不动。这就是稀疏修正在代码任务里的投影:模型不需要学习“怎么把注释写得更像人话”,它只需要知道<和<=在这个位置必须选哪一个。
3.3 一个容易误判的现象:非关键令牌的关联漂移
稀疏修正不等于非关键令牌完全不变。我在一次训练中遇到过这种情况:整体任务分数上涨了,我信心满满地去看校验集分布,却发现一些和任务根本无关的通用表述也被轻微扰动。当时差点以为模型学会了什么通用能力,后来做了消融实验才发现,这动作其实只是关键令牌被修正后,上下文表征被连带拖动的统计残留。
如果你忽视这一点,很容易把RLVR当成万能灵药,以为它会整体提升模型的语言质量。但真相比这个简单得多:它大概率只是在几个要害位置动了刀,其他位置的漂移可能是噪音,也可能带来微小恶化。所以训练后一定要分别统计“关键片段logprob变化”和“全序列logprob变化”,两者差距拉大才是健康的训练状态。
4. 与SFT、RLHF的边界:稀疏修正机制的适用区在哪
4.1 SFT是全量教,RLVR是重点改
SFT说的是让模型在每一个位置学习目标分布的交叉熵,它本质上是对所有token进行“全量监督”。你可以把它想成把字帖上的每个笔画都描一遍,要求模型尽量贴近标准答案的每个字。RLVR不是这样,它只对奖励敏感的区域产生显著修正。
这个对比决定了选型方向。如果你的任务答案有明确的标准结构,并且你希望模型在所有位置都严格贴合参考答案,SFT仍然不可替代。但如果你希望模型能自己探索路径、自己修正错误决策点,RLVR就是更合适的后训练方式。很多团队做数学推理模型时,先做SFT把基础格式教会,再用RLVR强化真正的推演决策能力,这个组合基本成了标配。
4.2 “可验证”是稀疏修正的边界条件
RLVR的奖励信号必须可脚本化,这是它产生稀疏修正属性的前提。因为脚本只会判定结果,不会对过程逐字打分。如果一项任务需要人工评价、审美判断或开放的偏好反馈,那就无法把它写成一个确定性判定函数,奖励就不会是客观的0/1,而是高维的模糊信号。
在这种情况下你只能回到RLHF,用奖励模型去拟合人类偏好。做过RLHF的人都知道,奖励模型会对整段回答产生稠密的评分倾向,它修正的范围会覆盖到语气、篇幅、措辞等非关键区域。这不是坏事,只是它失去了“稀疏修正”的针对性。
4.3 一个快速判断任务适不适合RLVR的方法
我自己常用的判断方式很简单:把你要评估的任务写成一段脚本,看脚本能不能输出一个确定分数。如果“对就是对,错就是错”可以靠字符串比较、单元测试、结构化校验来判定,那这个任务就适合RLVR。反之,如果评估时你需要人盯着结果说“这个回答感觉还行”,那你就别硬上RLVR。
我用一个表格总结一下三种方法的差异:
| 比较维度 | SFT | RLHF | RLVR |
|---|---|---|---|
| 监督信号 | 目标序列逐字交叉熵 | 奖励模型打分 | 规则脚本打分 |
| 修正密度 | 稠密 | 稠密 | 稀疏 |
| 主要修正对象 | 全部令牌 | 整段风格与偏好相关令牌 | 决策点与答案承载令牌 |
| 适用任务 | 格式学习、总体分布对齐 | 开放对话、创意生成 | 数学、代码、格式抽取、确定性问答 |
| 典型风险 | 缺乏探索性 | 奖励模型过拟合 | 奖励稀疏导致崩溃 |
这个表格不需要背,关键是记住中间一行:RLVR的稀疏性不是缺陷,它反而是它在强确定性任务上高效的原因。
5. 实操中的三个坑,以及我是怎么绕开的
5.1 坑一:把非关键令牌的噪音当成学习信号
我最早跑RLVR时犯过一个错误:训练过程中看到某几个无关token的logprob在跳,就以为模型在学什么新能力,结果一上验证集,任务分数只在原地打转。后来仔细对着关键片段统计才发现,那些无关token的所谓变化,只是高方差优势估计在采样噪音上的投影。
应对方法并不复杂。训练时加一个KL约束,把它和参考模型的距离限制在合理区间;同时把组内采样数量从一个很小的值往上提。采样数量越大,组间优势估计方差越小,非关键令牌上的虚假梯度就越弱。我会在训练日志里额外打印两个指标:关键片段平均logprob变化和全序列平均logprob变化,如果前者显著大于后者,说明修正正在健康地进行。
5.2 坑二:奖励信号太稀疏,模型直接崩掉
刚上手RLVR的人最容易碰到的就是这个问题。一个高难数学题,模型连续采样8个回答全是0分,优势值全部为负,策略根本不知道该往哪个方向走。继续训下去,模型的表达能力会用一种“破罐破摔”的方式退化,所有回答趋同于一串格式正确的废话。
我的做法是课程化奖励:先让模型在容易的题目上稳定拿到正奖励,建立“正确信号到底是什么”的锚点,再逐步过渡到困难任务。另一种有效手段是给部分匹配设置平滑奖励,比如最终答案的数字部分对了但符号错了,可以给一个0.3的中等分,这能让优势估计的方差降下来,模型在早期不至于完全失去方向。
5.3 坑三:忽略KL约束,关键令牌被改歪
如果RLVR的训练没有参考模型约束或clip范围限制,模型在关键令牌上会更新得异常激进。表现是训练后期任务准确率虽然还在涨,但回答的可读性迅速下降,生成序列变短、套话增多,甚至开始用一些旁门左道去“骗取”判分脚本认可的字符串。
这里的关键是修正不能脱离基础能力。KL散度约束不是锦上添花,它是在防止模型把关键令牌改成“只对当前任务有效、对通用能力有害”的畸形状态。实际操作中我会用参考模型算KL惩罚,同时限制单次参数更新的clip范围,并且在每个训练阶段结束后对比新旧版本在通用语料上的困惑度偏移。一旦感觉到质量下降,第一反应是检查KL系数,不是去调奖励权重。
5.4 一个值得长期坚持的调参习惯
训练过程中只盯任务准确率是远远不够的,我会同时记录关键令牌熵。这个指标比准确率更早反映修正效率:如果准确率还没上去,但关键令牌熵已经明显下降,说明模型正在往正确方向聚拢;反之,如果准确率涨了但关键令牌熵几乎没动,那大概率是奖励设计出现了偏差,模型可能在利用某些外部侥幸特征。
统计关键令牌熵不需要复杂工具,写一个脚本把答案片段抽出来,算一下这一段token分布的熵值就行。这个习惯看着简单,但能帮你省掉大量瞎调参数的时间。
我现在每次做后训练,第一步永远是做token归因,先把任务真正的关键令牌找出来,再去调采样数量、KL系数、奖励平滑度。理解了“RLVR实为稀疏关键令牌修正”这句话之后,我在实验里少走了很多弯路,至少每一次奖励波动我都能判断出是真实的修正信号还是单纯的高方差噪音。如果你也正在做RLVR训练,建议下次实验开始时先跑一遍类似的归因分析,再决定后面的训练节奏。