知乎:https://zhuanlan.zhihu.com/p/1943048398333780944
(已授权)
今天给大家分享一篇知乎好友@ybq的文章。
这篇文章随便聊一下如今比较火的推理模型,给新入坑的同学做一些简单的科普,都是一些偏基础的知识。
推理模型的训练
推理模型的训练和普通模型的训练并无什么区别,仅仅是 sft 语料多了一些特殊的 token 而已。具体来说,就是用 "" 和 "" 把模型的 cot 过程包裹起来。
sft 之后,模型 rl 时的每一条 response 都已经会稳定输出 和 了,和常规 rl 的流程是一致的。
需要注意的是,在 vllm 中是可以通过 这个 token 来切分出模型的 reasoning_content 和 content 的。
所以 最好事先设置成一个单独的 token,而不是多个 token,不然后续会有很多开源适配的麻烦事项。
推理模型训练时一个比较容易疏忽的点是:历史轮的 think 过程是不放置在模型的训练语料中的。 具体可以去查看 deepseek 和 qwen 的 tokenizer_config.json,都有一个逻辑是 content=content.split('')[-1]。
tokenizer_config.json 是每个开源模型除了 modeling_XX.py 外信息量最大的的文件了,里面的 chat_template 会明确指出模型推理时该如何拼接 prompt,知道推理时怎么做的,那自然就知道训练时怎么做的了。
注意:推理模型的思维链涉及较多枚举法,所以复读机的概率会远大于非推理模型。因此,无论是推理服务还是做 rl 训练的时候,最好都引入一个 N_gram_repeat 提前截断的机制。
至于所谓的混合推理模型(模型同时具有推理能力和直接回复的能力),则是一个调整训练分布的问题:既在训练数据里放一些长思维链数据,又在训练数据里放一些短思维链数据,就是混合模型。训练时通过评测指标调整一下 prompt 的分布和长短思维链各自的比例即可,并没有特别高深的技术。
以 qwen 为例,在 prompt 里加上 /no_think 便是没有思维链,其实就是让模型学会见到 "/no_think" 就直接生成 "\n\n\n\n",这种固定 pattern 的学习几乎没任何难度。
而在 tokenizer 里提供的 enable_thinking=False,是在模型生成的时候提前放置 "\n\n\n\n" 这些 token,原本输出思维链的位置被抢了,自然只能直接生成答案了,这属于一种 trick 吧。
特别注意,混合模型的续训在任何场景下都需要 "\n\n\n\n" 这个 pattern ,不要以为你对模型进行的是短链能力微调,就可以直接让模型输出 answer 了。短链微调也要乖乖的给模型拼一个空思维链,否则和事先已经训过的数据分布不一致,很影响进一步微调后的效果。
混合模型效果一定没有拆成两个模型的效果好,这个基本不需要质疑,长思维链和短思维链的分布差距那么大,八竿子打不着,肯定不存在相互促进的情况。qwen 最近拆成两个模型,应该是在追求极致的指标,deepseek 最近合并成一个模型应该是为了降低成本(API 端以后便可以只部署一个模型)。
与混合推理类似的:gpt-oss 的 low、medium、high 三层推理模式,seed-oss 的附带推理已消耗多少 token …… 这些大概率都是 sft 训练阶段调整数据的分布得到的特殊能力。
推理模型的数据
时间和实践会改变一些认知的
年初 deepseek_r1 论文里提出的 zero 路线的确惊艳到了我,但此时,我相信模型的 long cot 能力是靠 sft 学到的,强化只是进一步提高模型性能的手段而已。
具体来说,只训过 pretrain 知识和短链 sft 数据的模型,几乎不可能 explore 到有价值的思维链,必须事先通过 sft 来让模型学一些现成的长思维链。
然而,完全凭空标注出思维链这件事实在是太难了,所以蒸馏更强力模型的思维链数据便成为了大家的默认选项。
推理模型的训练要在 cold start 阶段大量蒸馏一些现成的思维链数据 ,具体过程大概分为两阶段:
- 虽然我们仍不知道 OpenAI 的第一版 o1 模型到底是怎么标注出来的思维链数据,但据传是靠着在 prompt 中注入 special_token 去 hack o1 的思维链,让各家公司陆续都拥有了自己的 long cot 模型。起步更晚的公司,则可以直接蒸馏那些开放思维链的公司的数据;
- 对自家已经具备 long cot 能力的模型做强化学习,并结合人工标注来修缮模型的思维链,可以有效提高模型的思维链质量。至此,自家的模型便可以为下一版本模型的生产积累新的“cold start 蒸馏数据”,左脚踩右脚的良性循环就开始啦。
认为 long cot 必须靠蒸馏来启动属于当下的个人理解,未必正确,年初我还在爆吹 zero 路线哈!
概括一下过去半年的发展:国内都做出来了自家的推理模型,是 deepseek r1 开源后的那段时间;国内推理模型效果进步飞快,是 GeminiPro 放出思维链的那段时间。
蒸馏不丢人,蒸不到优质数据那是真着急,如果此时谁能通过某种方法稳定 hack 出 GeminiPro 或 GPT5 的思维链,哪怕仅仅是一个prompt,在被封之前卖大模型厂商个几万块钱不在话下。
推理模型的 test time scaling law
test time scaling law 是一个 o1 出来后就一直被讨论的话题了,但是很多初入门者的理解还停留在“模型输出越长,效果越好” ,也就是所谓的推理模型。
这种理解不能说有错,只能说不全面。 test time scaling law 指的不仅是模型单次的输出更长,更是模型的多次调用,以及模型的多路调用 。
先说下多次调用,有时候模型的 long cot 不仅是一种辅助信息,也是一种 noise。相信大家都看过 deepseek 的思维链,很可爱,也很多废话。大模型天然存在 rope 的衰减机制和 attention 能看见所有 token 的机制,所以你觉着是那些废话的 token 一定在影响后续的输出,即使完全没有废话 token,那几万个 token 之后的模型效果也会衰减。
回想下,大家发现 ChatGPT 或 DeepSeeK 的回答走偏了的时候,往往都会新开启一个对话框,这就说明我们都知道有些 token 不滤掉是会影响模型效果的。
所以一种很自然的想法就是:一边 think,一边做 summary ,把之前的的所有思考过程凝缩成少量 token,和 prompt 组合在一起重新生成,这就是多次调用的思想。一边 think 一边 summary,一边 answer 一边 function_call,一边 solve 一边 verify …… 这些都是 test time scaling law,也是 agent 的基本思想和实现框架。
如果对这个过程做 RL,那单条 trajectory 就包括多次 response 了,这时候只看最终结果给 reward 就未必合理了,可以考虑给每个 response 具有单独的 reward shaping。
至于多路调用就更好理解啦,vote 就是最简单的实现方案。除此之外,一些 deep think 的思想,并不会让多路调用都输出结果,而是让多路思维链一边生成,一边相互校验、或者是计算置信度,把控模型的思维链一直处于相对正确的路线上,来提高准确率。
总结下来,test time scaling law 的核心思想就是:不计时间,不计成本,把一个模型的潜力充分挖掘。只要没借助其他模型,那就是该模型的能力。如果觉得有些任务必须借助其他模型,就把所需要的其他模型的能力训到目标模型中,让目标模型同时扮演多个角色来解决该任务。
目前,模型的单 response 的极限是把 AIME 做到满分,但充分发挥 test time scaling law 的单模型,极限是 IMO 的金牌水平。这种效果的巨大提升,就是 Agent RL 爆火的根因。
PS:都看到这里,来个点赞 、在看 、关注 吧。 您的支持是我坚持的最大动力!
欢迎多多关注公众号「刘聪NLP」,加入交流群,交个朋友吧,一起学习,一起进步!