
你有没有玩过那种岔路口特别多的文字冒险游戏?走到某一步,屏幕上写着"向左走"或"向右走",你选了一个,故事就往一个方向发展下去了。可问题是,另一条路到底发生了什么,你永远不知道。除非你存档重来,再走一遍。
这其实就是现在训练小模型最常见的一个方法,在模拟时面对的真实困境。
这篇论文叫《Branching On-Policy Distillation》,中文可以叫"分支式同策略蒸馏"。它讨论的问题说起来很简单:当你让一个小模型(学生)去学一个大模型(老师)的本事时,学生每次只能生成一条路径,老师只能在这一条路径上纠正它。可是学生在每一步其实都面临无数种可能的走法,只有一种被实际走出来了,其他的全部浪费掉了。
这篇论文想解决的,正是"一条路走到黑"带来的浪费。
**核心问题:为什么只走一条路不够**
先说说什么是蒸馏。
知识蒸馏:一种让小模型(学生)模仿大模型(教师)行为的训练方法,目的是让小模型拥有接近大模型的能力,但运行成本更低。
最早的蒸馏方法很直接,老师把答案写好,学生照着抄。但这里有个大问题:老师写的内容,是老师自己的风格、自己的措辞习惯。学生在实际使用时,要自己从头生成文字,它写出来的句子跟老师的完全不一样。等于是你平时学的是别人的笔记,考试时却要自己现场答题,两者根本不是一回事。
于是研究者们想出了"同策略蒸馏"这个办法。
同策略蒸馏(OPD):让学生自己生成一段内容,然后老师在学生生成的这段内容上逐字打分,告诉它每个字写得好不好,该不该这么写。
这个思路听起来合理多了,学生在自己真实会写的句子上接受指导,而不是在老师的句子上。但论文里指出了一个被忽略的问题:学生生成的,始终只是一条路径。
想象一下做一道数学题,"解方程 3(x+2)-5=16"。学生写到"两边加5,得到3(x+2)=21,下一步是……",这时候它面临一个分叉:是直接除以3,还是先展开括号?学生选了"除以3",往后面一路写完,得出答案。
可是"先展开括号"这条路呢?没人走过,老师也没机会在这条路上给反馈。论文里给了一个真实的例子,三种不同的解法,一种做对了,一种也做对了,还有一种因为减法算错变成了"x=16"这样的错误答案。如果学生生成的刚好是第三条路径,那模型学到的就只有"怎么把这道题做错",而它本可能走出的那两条正确路径,从头到尾都没被老师看见过。
论文还给了一个更让人意外的例子,在ALFWorld(一个让AI在虚拟家庭环境里完成任务的测试场景)里,有个任务是"把杯子加热后放进咖啡机"。学生走的主路径最后失败了,而论文从同一个分叉点重新采样出的两条新路径,一条成功了,一条失败了。关键是,那条成功的路径,跟失败的主路径在最开头几个字上其实是一样的,走着走着才分道扬镳。
这说明了什么?说明哪怕第一个字选得一样,后面的走向也可能天差地别。单靠一条轨迹,根本看不出学生在这个决策点上到底有多不稳定。
如果要解决这个问题,最直接的想法是:那就多采样几条独立的轨迹呗,比如生成七条完整的路径,总能撞见更多可能性。
这个思路有用,但代价很大。七条完全独立的轨迹,意味着从头到尾都要重新生成一遍,哪怕前面九成的内容和第一条一模一样,也要原样再写一遍。这就好比你想尝遍一家餐厅的所有菜品搭配,但每次换一道菜都得重新走进门、重新点单、重新等上菜,而不是直接在餐桌上加点一道新菜。显然效率太低了。
这篇论文要解决的,正是这两个问题的叠加:怎么让学生看到更多可能的路径,同时又不把生成成本浪费在重复劳动上。
**BranchOPD:在关键路口才分岔,而不是全程重开**
论文给出的答案叫BranchOPD,核心思路可以用一句话概括:先让学生正常走一遍主路径,然后在这条路径里挑出几个"犹豫不决"的关键节点,只从这些节点往后重新生成几条新的分支,而节点之前的内容完全复用,不用重写。
这就是论文标题里"分支"(Branching)的含义。
拿前面那个数学题打比方。学生写到"3(x+2)=21"这一步时,前面所有的内容都已经确定了,没必要把"加5得到3(x+2)=21"这句话重新生成七遍。真正值得关注的,是"下一步该怎么做"这个具体的岔路口。论文的做法是,在这个点上,让学生用同样的策略(不改变参数,纯粹是重新采样)再生成两三条不同的后续走法,这几条分支全部共享前面那句话,只是各自往下延伸出不同的结局。
这跟前面"存档重开"的冒险游戏其实是一个道理,但多了一个关键改进:你不用从游戏开头重新玩,而是直接从那个分叉点存档读档,直接试另一条路。如果没有这个存档机制,你想知道另一条路的结果,唯一的办法就是把整个游戏从头再玩一遍,时间成本直接翻倍甚至更多。有了存档点,你只需要补上分叉之后的那一小段。
那么问题来了:该在哪里设置这些"存档点"?
论文给出的办法是综合两个信号来判断。
熵(Uncertainty):衡量学生在某个位置上,对下一个该写什么字有多不确定。如果学生几乎板上钉钉地认准了一个词,熵就很低;如果学生自己心里也在好几个选项之间摇摆,熵就很高。
分歧度(Disagreement):衡量在某个位置上,老师和学生的判断差得有多远。如果老师觉得学生选的这个词概率很低(也就是老师不认可学生的这个选择),分歧度就高。
论文把这两个信号各打五折混合起来,取得分最高的几个位置作为分叉点。为什么要两个信号一起看,而不是只看一个?论文专门做了对比实验:只用熵选点,数学任务的准确率是43.24%;只用分歧度选点,是42.97%;两者混合,达到了44.37%。更能说明问题的是,如果完全随机挑点(不看任何信号),分数直接掉到40.11%,比混合方法低了四个多百分点。
这告诉我们一个很实际的道理:不是所有的"路口"都值得分岔。有些地方学生写得又快又准,老师也完全认同,分岔了也是浪费;真正值钱的,是那些学生自己也不确定、老师又觉得不对劲的地方。这就像医生查房不会把所有病人都重新做一遍全身检查,而是优先关注那些指标异常、情况不稳定的病人。如果不做这个筛选,精力就会被摊薄到那些根本不需要额外关注的地方,真正该管的问题反而顾不上。
在数学任务里,论文直接在字(token)这个级别挑分叉点。但在那些需要多轮对话、多轮操作的智能体任务(比如ALFWorld这种需要连续下指令的任务)里,情况更复杂一些,因为每一"轮"对话本身包含很多字,论文的做法是先挑出整轮里最值得关注的那一轮,再在这一轮内部挑出具体的分叉字。
设好分叉点之后,论文默认的做法是,每个分叉点生成两条新的分支(也就是k=2),一共选三个分叉点(B=3)。这样加上原来的主路径,一次就能拿到最多七条轨迹,跟"独立采样七条"的效果类似,但生成成本低得多。论文的实验数据显示,在ALFWorld任务上,七条独立轨迹需要生成19691个字,而BranchOPD的分支方案只需要15924个字,省了19.1%;在WebShop任务(模拟网购)上更明显,省了31.2%。
这省下来的部分,恰恰就是那些"本来就一样、没必要重写"的前缀内容。
**分支真的能带来新东西吗:从概率和实验两方面看**
光靠直觉说"分支能带来更多可能性"还不够,论文从数学角度也给了一个支撑,叫"条件无偏性"(Conditional unbiasedness)。这个名字听起来挺唬人,但说的道理不复杂:只要恢复出的环境状态是对的,分支采样出来的结果,平均而言和"没有分支、老老实实走一条完整路径"得到的结果是一致的,不会因为你中途重新采样就引入系统性的偏差。换句话说,分支这个操作本身不会让学生学偏,它只是让学生暴露了更多本来就存在、但没被看见的可能性。
那这些新暴露出来的可能性,到底有多"新"?
论文做了一组很细致的统计。在选中的分叉点上,主路径选中的那个字,留给其他字的概率空间(论文叫"剩余概率质量")平均有0.63(ALFWorld任务)和0.69(WebShop任务)。这什么意思呢?相当于主路径选中的那条路,连一半的可能性都没占到,剩下六七成的概率空间全被浪费掉了,如果只走这一条路,等于是把这六七成的信息直接扔掉。
更直接的证据来自实际生成的分支内容。在ALFWorld任务里,74.2%的分支轨迹,和主路径走出了完全不同的动作序列;55.5%的分支,出现了主路径里压根没有过的新动作。这说明学生确实有能力走出截然不同的路,只是在单条采样里,这个能力被"锁"住了,没有机会展现。
还有一个特别有意思的数据,论文叫"救援率"(Rescue rate),指的是当主路径失败时,有多少比例的分支能成功。在数学任务上这个数字是42.7%,差不多每两次主路径失败,就有一次分支能把局面救回来。在WebShop上这个数字只有5.0%,相对低一些,但哪怕是5%,也意味着分支不是摆设,它实实在在地提供了"主路径走不通、换条路试试"的机会。
这就像一个考生做大题,第一步算错了,整道题全盘皆输,但如果阅卷老师愿意在关键步骤给你一次"重新选一下"的机会,你说不定能把分走回来。单纯只看最终答案对错,老师根本不知道你是在哪一步开始跑偏的;而分支式的检查,恰恰是在那个跑偏的关键点上,给了学生一次纠偏的练习机会。
**协议边界修复:解决模型"话痨"和"忘关话匣子"的毛病**
除了分支这个核心思路,论文还提出了另一个小但很实用的设计,叫协议边界修复,英文缩写PBR。
协议边界修复(PBR):一种针对模型输出格式问题的辅助训练手段,专门纠正那些"不该说的话却说了"或"该停的时候没停"的情况。
这个问题听起来很琐碎,但在实际使用里特别烦人。论文举了两个例子:数学题答完了,模型本该停下,可它偏偏继续往后写一堆没用的废话;智能体任务里,模型的回复开头莫名其妙地多出一个表示"思考结束"的标签,但其实它根本还没开始思考。
论文发现一个很反常的现象:哪怕老师模型自己生成内容时从不犯这种毛病,但当老师被要求去"点评"学生那些已经跑偏、带着重复内容的半成品时,老师也可能被带偏,跟着一起强化这个重复的毛病。这就好比一个本来说话很得体的人,被拉进一个大家都在插科打诨的群聊里,待久了自己说话也开始变得随意起来,不是他本质变了,而是他是在"回应"那个已经跑偏的语境。
PBR的做法是,专门用规则检测这些协议性的错误(比如该结束没结束、不该出现的标签却出现了),然后直接针对这些具体事件做一个额外的训练信号:该鼓励的行为(比如答完题就停)提高它的概率,该压制的行为(比如多余的标签)降低它的概率。
效果非常直接。论文的实验显示,不用PBR的话,Vanilla OPD(最基础版本的同策略蒸馏)在数学任务上的平均分只有25.82分,加上PBR之后直接跳到38.94分,提升超过13分。论文还专门对比了几种"通用型"的补救办法,比如常见的重复惩罚机制,效果只能到28到30分左右;比如直接把超长的、有问题的样本过滤掉,能到33.2分;但这些都比不上PBR针对性修复带来的提升。这说明笼统地"少说点重复的话"不如精确地"在具体出问题的地方纠正"管用。
**实验结果:在数学和智能体任务上都跑赢了对手**
把分支采样和PBR结合起来,就是完整的BranchOPD方法。论文在数学推理和三个智能体任务(ALFWorld、WebShop、Search-QA)上都做了测试。
数学任务上,学生模型是Qwen3-4B-Base,老师是Qwen3-8B,测试集是MATH-500和两年的AIME竞赛题。结果显示,BranchOPD拿到44.37分(avg@16指标,也就是对每道题采样16次答案求平均正确率),比最基础的Vanilla OPD(25.82分)高出18.55个百分点,比七条独立轨迹的版本(27.84分)也高出不少。更值得注意的是,BranchOPD甚至超过了专门用答案对错来监督的GRPO方法(35.56分),而BranchOPD全程没有用到任何"对错"这样的硬性奖励信号,纯粹靠老师的逐字打分。
智能体任务上,学生是Qwen3-4B,老师是Qwen3-30B-A3B(在ALFWorld上)以及经过强化学习训练的同系列模型(在WebShop和Search-QA上)。ALFWorld的测试分成"见过的任务"(ID)和"没见过的任务"(OOD)两类,BranchOPD分别拿到57.86分和55.22分,平均成功率比Vanilla OPD高出13.8个百分点,甚至比老师模型自己的表现(平均51.79%)还高出近5个百分点,这意味着学生在没有任何任务奖励的情况下,青出于蓝了。
论文还换了不同大小的学生模型测试,比如把Qwen3-4B蒸馏到更小的Qwen3-1.7B,或者换成另一个模型家族Qwen2.5。结果显示BranchOPD的优势在不同模型规模和家族上都能保持,并不是只对某一个特定模型凑巧有效。
**几个值得琢磨的细节**
论文里有几个消融实验(也就是把某个设计拿掉看效果变化)特别值得一提。
关于分支数量该怎么分配,论文测试了"每个分叉点生成几条分支"(k)和"选几个分叉点"(B)这两个参数的不同组合。结果是,从k=1涨到k=2有明显提升,但再涨到k=3就没什么用了;而在k=2的基础上,从B=2涨到B=3还有小幅提升。这说明与其在一个点上反复试探,不如把有限的预算分散到多个关键决策点上,广度比深度更划算。这个道理放在生活里也说得通,与其一道题反复检查十遍,不如把检查的精力分摊到更多容易出错的题上。
另一个有意思的发现是关于分叉点的位置。论文对比了"在每一轮对话开头就分叉"和"在轮内挑选具体字位分叉"两种策略,发现轮内选点效果更好。论文进一步统计发现,从分叉点到实际出现动作差异,平均只需要再生成十几个字(ALFWorld)甚至一两个字(WebShop),这说明决策的关键往往藏在很细微的措辞里,而不是整轮对话的开头。
论文也诚实地报告了局限性相关的对比数据,比如强制在分支开头插入一个无意义的"噪声词"来人为制造差异,效果远不如基于不确定性挑选的分支,提升幅度只有1个百分点左右,而真正有效的选点策略能带来接近8个百分点的提升。这从反面说明,分支起作用的关键不是"随便换个开头制造点不同",而是精准地找到学生本来就犹豫不决的那个点。
**写在后面**
读完这篇论文,我觉得最值得记住的一点,不是分支采样这个技巧本身,而是它指出的一个更根本的事实:学生从老师那里学到了什么,不只取决于老师讲得好不好,还取决于学生自己走的是哪条路。
这其实是一个挺朴素但容易被忽略的洞察。我们平时评价一个教学方法好不好,总是盯着"老师的反馈质量",比如老师批改得仔不仔细、讲解得清不清楚。但这篇论文提醒我们,还有另一个维度常常被忽视:学生有没有机会把自己真正会犯的错误、真正会纠结的地方摆到老师面前。如果学生每次练习都恰好绕开了那些自己拿不准的难点,哪怕老师再厉害,也无从下手。
论文里那个"救援率"的数据让我印象很深,数学任务里42.7%的失败案例,只要换一条路就能救回来。这意味着很多"错误"其实不是能力不够,而是运气不好,恰好在那个节点选错了。这跟我们日常生活中判断一个人"行不行"也挺像,有时候一次失误被无限放大,掩盖了这个人其实大概率能做对的事实。给一次重来的机会,看到的往往是更真实的能力分布,而不是一次性结果的偶然性。
这篇论文也还留了一些没解决的问题。比如分叉点的选择目前靠人工设定的几个超参数(比如熵和分歧度各占多少权重),如果换一个完全不同的任务类型,这套参数是否还适用,论文没有给出通用的答案。还有一个更深的问题是,这种"在关键点多看几眼"的思路,能不能用到蒸馏之外的场景,比如直接用来改进强化学习里的探索策略?论文里提到的那些分支树搜索相关的工作,某种程度上已经在往这个方向走了,但分支蒸馏和分支强化学习之间具体怎么结合,还是个开放的问题。
Q&A
Q1:BranchOPD是什么?
A:BranchOPD(分支式同策略蒸馏)是一种让小模型学习大模型能力的训练方法,它在学生生成的主路径上挑选几个关键的犹豫节点,从这些节点重新采样生成几条分支路径,让老师模型对主路径和所有分支都进行逐字打分监督,从而用更少的额外生成成本覆盖更多可能的学习情况。
Q2:BranchOPD比起让学生独立生成多条完整轨迹有什么优势?
A:最大的优势是节省生成成本。独立生成七条完整轨迹需要把每条路径从头写到尾,而BranchOPD只在关键分叉点之后才重新生成,前面共享的内容不用重复写,论文实验显示在ALFWorld任务上能省19.1%的生成字数,在WebShop任务上能省31.2%。
Q3:协议边界修复(PBR)解决了什么问题?
A:PBR专门解决模型输出格式上的毛病,比如答案写完了却停不下来继续生成废话,或者回复开头莫名出现不该有的结束标签。它通过针对性的训练信号鼓励该出现的行为、压制不该出现的行为,论文显示加上PBR后数学任务的平均分从25.82分提升到38.94分。
好文章,需要你的鼓励
RGPO用"临时脚手架"破解大模型强化学习的奖励稀疏难题:先让模型独立解题,失败则分段放出标准解法引导重写,仅采纳经验证更优的答案。难题测试准确率从0跃至99.5%,语言模型平均分高出最强基线5.0分。
论文提出用MoE模型的路由器输出作为跨语言对齐目标,通过持续预训练对翻译句对施加路由KL散度损失,在不改变分词和架构的前提下让隐藏表示更接近,并在四个开源MoE模型、七种语言上验证了下游任务性能的一致提升。
DiffGate提出难度门控的教师指导机制,让验证器决定何时需要教师介入,仅对失败且困难的轨迹提供有界教师指导,结合GRPO强化学习,在数学与代码任务上显著提升解题覆盖率与跨领域迁移能力。
研究者用固定不变的16位二进制编码替代传统可训练词嵌入表,在17亿参数规模模型上训练1000亿token,证明模型仍可获得实质语言能力,揭示输入表并非必需,但性能略逊于可学习方案。