微信扫一扫,关注公众号

  • 科技行者

  • 算力行者

见证连接与计算的「力量」

首页 ROSS:让AI重新学习自己走过的路,却不重蹈覆辙

ROSS:让AI重新学习自己走过的路,却不重蹈覆辙

2026-10-23 09:20
分享至:
----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.-
2026-10-23 09:20 • 科技行者

你有没有想过一个问题:一个学生做了一千道数学题,其中有一道题他曾经用一种特别巧妙的方法解出来过,但后来这个方法他自己忘了,现在遇到类似的题反而做不出来了。这些做过的题、写过的草稿,是不是就该直接扔掉?

大语言模型的训练过程里,正在发生一模一样的事情。

模型在强化学习和自我蒸馏的过程中,会自己生成大量的"草稿",也就是所谓的自生成轨迹。

*自生成轨迹:模型在训练过程中自己采样生成的完整回答或行为序列,而不是人类事先准备好的标准答案。*

这些草稿里藏着模型在某个训练阶段发现的解题思路、纠错方式、甚至是灵光一现的巧妙操作。可一旦训练进入下一个阶段,模型的参数更新了,这些草稿往往就被当成过时的垃圾直接扔掉,谁也不会回头看一眼。

这篇来自 AllSpark 团队的论文提出了一个问题:这些被扔掉的历史草稿,真的没用了吗?

**答案是:不仅有用,而且用得好还能带来实打实的性能提升。**

论文提出的方法叫 ROSS,全称是"通过选择性监督从自生成轨迹中重新学习"。它在 Qwen3.6-35B-A3B 这个模型上做实验,结果显示在多教师蒸馏任务上,六项基准测试的平均分从 58.40% 提升到了 62.20%,在软件工程任务 SWE-bench Verified 上,从 64.20% 提升到 68.40%。这些提升是在完全不需要额外采样、不需要新的强化学习轮次的情况下拿到的,纯粹靠"回顾历史作业"实现的。

问题到底难在哪:草稿会过期,但也可能没过期

先说清楚这件事为什么不是理所当然的。

强化学习训练一个模型的过程,通常是这样的:模型采样生成一批回答,根据结果好坏打分,然后更新参数,如此循环很多轮。每一轮结束,模型都变了,它生成回答的"口味"也变了。传统观点认为,既然模型已经变了,那么老版本模型生成的回答,自然就跟不上新模型的节奏了,硬塞给新模型学,可能会把它带偏。

这就好比一个厨师,去年做菜的手法今年可能已经升级了,你非要拿他去年的操作视频让他重新照着做,万一他现在的刀工已经比视频里更好了呢,照着旧视频学岂不是倒退?

但论文团队做了一个很直接的实验来验证这个直觉到底对不对。他们挑了100道数学题,分别收集三种来源的回答:历史检查点生成的回答、当前模型生成的回答、以及一个外部强大模型(GLM-5.2)生成的回答。然后用当前模型去计算这三种回答的"意外程度",专业说法叫负对数似然。

*负对数似然(NLL):衡量一段文字对于某个模型来说有多"意外"的指标,数值越低说明这段文字越符合模型自己的表达习惯,越像模型自己会说的话。*

结果很反直觉:历史回答的意外程度只有0.120,跟当前模型自己生成的回答(同样是0.120)几乎完全一样,而外部教师模型的回答意外程度高达0.520,是历史回答的四倍还多。

这说明什么?说明历史草稿虽然是"旧版本"写的,但它说话的调调、用词习惯,跟现在的模型高度兼容。真正跟当前模型格格不入的,反而是那个能力更强、但风格完全不同的外部教师模型。

这就好比你去年的作文风格,其实跟你今年的作文风格差别没有想象中那么大,反而是隔壁班转来的学霸的作文,虽然写得更好,但你读起来会觉得"这不是我会写的东西"。如果强行让你模仿学霸的写法,你反而学得别扭;但模仿自己去年的思路,接受度会高很多。

那第二个问题来了:历史草稿风格上兼容,但它里面记录的解题能力,现在的模型还留着吗?

论文团队又做了一个实验,挑出100道最难的训练题,让当前模型对每道题采样32次,只保留那些"历史上至少有一次做对过"的98道题。结果发现,当前模型采样32次之后,能做对97道题,平均成功率高达99.0%,说明这个解题能力其实还在模型的"技能包"里,没有真的丢失。

但如果只让模型尝试一次呢?平均成功率骤降到37.7%,98道题里有74道题的单次成功率不到50%。

**能力还在,但已经变得不稳定、不可靠,这才是问题的核心。**

这就好比一个人小时候学过游泳,现在让他下水扑腾扑腾,试个三十次总能游成一次,但你要是只给他一次机会,他很可能会呛水。技能没有彻底忘记,但已经生疏到无法稳定发挥的地步了。

这个发现直接解释了为什么历史草稿值得被重新利用。它们既跟当前模型的表达习惯相容,又保留着当前模型已经不太靠得住的能力,是一种介于"完全过时"和"完全同步"之间的中间态经验。

光看结果对不对还不够,得看过程干不干净

第二个更细致的问题出现了:就算历史草稿整体上做对了题,它的整个思考过程就一定值得原样照抄吗?

论文举了一个很典型的例子。有一道数学题,要求计算某种函数在特定条件下能构造出多少种不同的取值组合。历史草稿里,模型在计算过程中先犯了一个错误,把 2 的 10 次方直接当成了最终答案,得到1024这个数。但接下来它没有停下来,而是继续检查:"让我再确认一下是否遗漏了某个约束条件",然后发现了问题所在,重新推导,最终修正得到正确答案1007。

而在训练后期,模型对同一道题的另一次尝试,同样先算出了1024这个错误的中间结果,但这一次它没有继续检查,直接把1024当成最终答案交了上去。

**这两段轨迹的区别,恰恰说明了"结果正确"和"过程值得学习"是两码事。**

如果把整段包含错误计算的轨迹原样让模型学习,模型学到的不只是那段成功的纠错思路,还会连带学到那个1024的错误计算本身。这就像给学生批改作业时,如果只看最后答案对不对就打钩,却不管他中间画掉重写的草稿纸上到底写了什么废话,那这份"标准答案"其实混杂着噪音。

所以论文团队意识到,光靠"这道题最终做对了没有"这一个维度来筛选训练材料是不够的,必须往下钻到轨迹内部,区分出哪些片段是真正值得模仿的,哪些片段是弯路、错误或者不必要的重复。

ROSS 到底怎么做:留全部的路,只学关键的段

弄清楚了问题所在,ROSS 的设计思路就顺理成章了。

整个方法可以概括成两句话:把完整的历史轨迹都保留下来当作上下文,但只在真正值得学习的那些片段上计算训练损失。

具体流程是这样的。首先有一个结果验证器,负责判断一条历史轨迹最终是不是做对了,比如数学题看答案对不对,代码题跑一遍单元测试。这一步先把明显失败的轨迹筛掉,留下"结果正确"的候选池。

*结果验证器:一种自动化工具,用于判断一次模型输出的最终结果是否正确,比如比对数学答案、运行代码测试用例,或者检查智能体是否完成了指定任务。*

接下来是更细致的一步,用一个大语言模型充当"审稿人"的角色,去逐段检查这些结果正确的轨迹。这个审稿人会做两件事:一是判断这条轨迹里有没有一段自洽、干净、可以直接拿来当教材的推理片段;二是把这个片段的具体起止位置标出来。

*LLM审稿人:论文中用来审查历史轨迹的大语言模型,论文实际使用的是 GLM-5.2,它的任务只是判断和标注哪些片段值得学习,不负责生成新的替代答案。*

标注出来之后,会生成一个"二进制掩码",简单说就是给轨迹里的每一个字打上标记:这个字要不要计入训练损失。被标记为1的字,模型会认真学习如何在给定上文的情况下生成它;被标记为0的字,虽然还在上下文里让模型"看到",但不会被要求去模仿。

*token级监督掩码:一种逐字标注的二进制标记,用来精确控制训练时哪些具体文字位置参与损失计算,哪些位置只作为背景信息存在,不参与学习目标。*

这里有个设计细节特别值得说一下:被排除在损失之外的文字,并没有从训练序列里被删掉,它依然完整地留在那里,模型依然要读到那段犯错的推理、那段走弯路的探索,只是不会被要求去"复刻"那部分内容。

这就好比老师批改作文时,不会把学生写错的段落用涂改液抹掉不让他看,而是让他保留原文,只在旁边圈出"这句写得好,学着写",而不去圈那句写砸的话。学生依然知道自己曾经是怎么写砸的,这个上下文对他理解后面为什么要这样改是有帮助的,只是不会被要求把那句写砸的话原样背下来。

如果换一种做法,把犯错的部分从训练数据里彻底删掉会怎么样?那模型看到的就是一个凭空冒出来的正确答案,看不到它是怎么从错误中走出来的,纠错这个行为本身的因果链条就断了,模型学到的可能只是结论,而不是"发现问题、定位问题、修正问题"这套完整的思维过程。这恰恰是 ROSS 坚持保留完整上下文的原因。

两种数据类型,两套审查逻辑

论文里提到,单轮对话式的数学、代码题目和长程的智能体交互任务,用的审查方式并不完全一样。

对于单轮的数学和代码任务,审稿人做的是"找出值得保留的片段",也就是从一段回答里挖出那些逻辑自洽、能独立支撑最终答案的推理段落,明确排除掉里面的错误假设、算错的步骤、放弃的尝试。审稿人给出片段后,还会有第二个独立的审核环节,专门检查这些被选出来的片段拼起来读是不是真的通顺、完整、没有逻辑漏洞,如果发现问题会要求重新修订边界。

对于智能体在真实软件环境里完成任务的长程轨迹,情况更复杂,因为一次工具调用失败可能是模型真的操作错了,也可能只是环境本身有障碍,或者只是一次合理的试探性操作恰好没成功。所以这里审查逻辑反过来了,是"找出必须排除的错误片段",先由一个语义审查模型逐步判断每一个动作是不是真的有问题,确认了问题以后,再由第二个模型去精确定位这个错误对应的具体文字范围,把它从损失计算里摘除,而其余的探索、尝试、包括没有成功但合理的操作,都继续保留在监督范围内。

这种区分处理的思路其实挺聪明的。数学题的正确性判断相对干净,容易正向筛选出"好的部分";而智能体的多轮交互里,大部分操作都是合理的,只有零星几步出了问题,这时候反向去揪出"坏的部分"反而效率更高,也更精确,不会因为过度谨慎而把大量合理的探索行为也一并排除掉。

数据说话:这套方法到底带来了多大提升

先看单独在数学和代码领域做强化学习之后,再用 ROSS 补一刀的效果。

在数学强化学习之后,原始模型(论文里称为 Upstream)在三项数学基准上的平均分是75.19分,用 ROSS 重新学习历史轨迹之后提升到 **76.98分**。在代码强化学习之后,原本42.09分的平均分提升到 **44.21分**。

再看多教师蒸馏这个更综合的场景,六项基准(涵盖数学、代码、指令遵循)的平均分从58.40分直接跳到 **62.20分**,提升了将近4个百分点。要知道,这个提升是在没有增加任何新的采样、新的强化学习轮次的情况下拿到的,纯粹靠回收历史数据实现。

论文还专门做了对照实验,来验证到底是"筛选轨迹"起作用,还是"精细标注哪些片段该学"起作用,还是两者都需要。他们设计了一个叫 ROSS w/o mask 的版本,也就是用跟 ROSS 完全相同的一批经过筛选的轨迹,但不做片段级别的精细标注,而是让模型把这些轨迹里所有合格的文字全部学一遍。

结果显示,仅仅做轨迹筛选(不做片段标注)就已经有明显效果,在代码任务上把原本"全量重放所有做对的轨迹"(Positive-Rollout SFT)产生的负面效果给扭转过来了。但如果在筛选的基础上再加上片段级的精细标注,效果会进一步提升,在多教师蒸馏任务上又多涨了3.71个百分点。

这说明什么?说明"选对轨迹"和"选对片段"这两层筛选缺一不可,都在真实地发挥作用,而不是某一层在虚张声势。

论文还有一个特别有意思的发现,就是这套方法带来的提升,并不依赖于必须从升级后的模型开始训练。他们做了一个对照:拿完全相同的历史轨迹和标注结果,一次从升级后的模型开始训练,一次从最初还没做强化学习的基础模型开始训练,结果两条路径最终达到的分数几乎一样。

**这意味着历史轨迹里保留的,是一种可以脱离原始训练路径、独立迁移的能力,而不仅仅是某个特定模型自身状态的延续。**

这个发现有点像发现了一本内容扎实的笔记,不管是学霸还是普通学生拿去看,最后掌握的知识水平居然差不多。这说明这本笔记记录的是知识本身的精华,而不是依赖读它的人已经有多强的基础。

在智能体任务上,效果同样明显。论文团队复用了在 OpenSWE 真实代码修复任务上做强化学习产生的成功轨迹,评估用的是 SWE-bench Verified 这个真实软件工程基准,解决问题的比例从64.20%提升到了 **68.40%**,涨了整整4.2个百分点,这说明这套思路不只对短的单轮回答有效,对涉及多轮工具调用、长程交互的复杂任务同样适用。

排除的到底是什么内容:数学爱纠错,代码爱绕路

论文还做了一件挺细致的分析工作,就是去看看到底被 ROSS 剔除出训练损失的那些内容,具体都是些什么。他们用 GLM-5.2 去分类了1185条被标注过的轨迹样本,看看被排除的片段主要属于哪种类型。

结果发现数学和代码这两个领域被排除的内容,性质完全不一样。

数学任务里,被排除的内容里超过七成属于"犯错后被明确纠正"这一类,也就是前面提到的那种先算错再改对的情况。这个比例在训练早期是72.7%,训练后期是68.3%,一直居高不下。

代码任务里,情况反过来,占比最大的是"冗余探索",也就是模型试了好几种写法、绕了不少弯路,最后才写出能通过测试的代码,这一类的占比不仅高,还从早期的67.9%涨到后期的76.6%。

**这两种模式对应着两种完全不同的失败逻辑:数学题容易在计算中途出现明确的逻辑或算术错误,代码题更容易通过大量试错才摸到正确写法。**

这个发现还有个更让人意外的地方:论文观察了强化学习进行到第几步的时候,模型的"不确定性"(专业说法是策略熵)在持续下降,说明模型对自己的输出越来越有信心。但被排除的内容占比,并没有随之同步下降。数学任务里这个比例只从11.60%略微降到9.27%,而代码任务里这个比例反而从22.65%涨到了28.07%。

这说明一个很重要的道理:**模型变得更自信,不代表它生成的内容就更干净、更值得原样照抄。**

这就好比一个学生做题越来越熟练、越来越不犹豫,但这不代表他就不再走弯路了,尤其是在编程这种需要反复试错才能摸到正确解法的任务里,越熟练反而可能意味着他更擅长通过大量尝试来"蒙"出正确答案,而不是说他每一步思考都变得更精炼了。

一个意外的收获:治好了模型的"复读机"毛病

论文附录里还提到一个挺生动的案例。团队在一个更小的4B参数模型上跑数学强化学习,训练后的模型出现了一个很奇怪的毛病,它经常在给出正确答案之后,还会不停地重复输出这个答案,一直到把输出长度用完为止。有一次记录下来的输出结尾,甚至是连续不断地重复"106"这个数字直到用完所有配额。

统计下来,这个模型84.5%的回答里都包含至少5次重复的答案标记,输出长度的中位数直接顶到了16384个字的上限。团队甚至怀疑是不是输出配额给的不够,模型才被迫在结尾胡乱输出,于是把输出上限翻倍到32768个字重新测试,结果发现完全没用,数学平均分反而从52.05%微降到51.62%,说明问题根本不在于配额不够,模型是真的学会了一种"说完正确答案还要继续叭叭"的坏习惯。

用了 ROSS 重新学习历史轨迹之后,这个复读的比例从84.5%降到了21.5%,平均输出长度也短了将近三成,数学平均分从52.05%大幅提升到 **63.65%**。

这个案例特别说明问题,它证明了 ROSS 起作用的机制不只是"多学点正确的东西",它同时也在悄悄压制那些训练过程中意外滋生出来的坏习惯。因为这些坏习惯往往就藏在那些"结果凑巧正确、但过程冗余啰嗦"的轨迹里,精细的片段级筛选恰好能把这些冗余部分挡在训练损失之外。

写在后面

读完这篇论文,我最触动的一点是它打破了一个我原本觉得理所当然的假设:训练数据一旦"过时"就该被扔掉。

但仔细想想,人类学习从来不是这样的。你不会因为去年考砸了一次考试就把那份试卷撕掉,很多时候正是回头看那份试卷上哪道题蒙对了、哪道题的思路其实是对的只是算错了数字,才能真正理解自己当时的状态。ROSS 本质上是在给模型也补上这种"翻旧账"的能力,只不过它翻账翻得比人类更精细,精细到每一个字要不要被记住都单独判断。

还有一个细节值得单独拿出来说,就是那个从基础模型和从升级模型出发最终效果趋同的实验。这个结果如果成立,意味着历史轨迹本身携带的信息量,比我们通常以为的"某个模型积累的经验"要更本质。它更像是训练过程本身留下的一份公共财产,谁来学都能受益,而不是专属于某一个特定检查点的私有资产。这个思路如果继续往前推,是不是意味着未来可以有一个跨模型、跨训练批次共享的"历史经验池",不同团队训出来的模型都能从里面各取所需?

论文里没有回答这个问题,但这确实是我读完之后停不下来的一个念头。

Q&A

Q1:ROSS是什么?

A:ROSS是AllSpark团队提出的一种训练方法,全称是通过选择性监督从自生成轨迹中重新学习,它让大语言模型回顾自己训练过程中产生的历史草稿,保留完整上下文但只对其中值得学习的片段计算损失,从而在不做额外强化学习的情况下继续提升性能。

Q2:ROSS和直接重放所有做对的历史数据有什么区别?

A:直接重放做对的历史数据会把错误推理、冗余探索一起学进去,效果不稳定甚至可能变差。ROSS先筛选出真正有价值的轨迹,再在片段层面精确标注哪些文字该学、哪些只作背景,实验显示这种双层筛选比单纯重放效果更好,六项基准平均分从58.40%提升到62.20%。

Q3:ROSS对模型能力有实际提升吗?

A:有明显提升。在Qwen3.6-35B-A3B模型上,多教师蒸馏任务六项基准平均分从58.40%提升到62.20%,软件工程任务SWE-bench Verified从64.20%提升到68.40%,在一个4B小模型上还成功治好了训练后出现的重复输出毛病,数学平均分从52.05%提升到63.65%。

分享至
0赞

好文章,需要你的鼓励

推荐文章
----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.-