
极市导读
Deepseek R1 Zero模型通过三阶段强化学习(RL)成功复现的过程记录,模型在测试集上的准确率从0.2提升到0.41,输出长度增长超过50%,并涌现出多语言混杂、迟疑、多路径探索等能力,展示了强化学习在提升模型性能和推理能力方面的潜力。 >>加入极市CV技术交流群,走在计算机视觉的最前沿
项目代码可见:Unakar/Logic-RL(https://github.com/Unakar/Logic-RL),欢迎关注和star!
我们将开源完整的wandb曲线和训练日志,wandb report(https://wandb.ai/ustc_ai/GRPO_logic_KK/reports/GRPO-Zero–VmlldzoxMTIwOTYyNw?accessToken=gnbnl5mu5pwfww7gtwxymohg85w7d7vthvjvbl4w8yxg0a99vf1k22m11e61cvv8)
在大四的最后一个寒假,和@AdusTinexl @ShadeCloak 两个小伙伴捣鼓出了点有意思的东西,非常开心,欢迎各位合作,指导!
先展示一下结果:
基座模型Qwen 7B在测试集上只会基础的step by step逻辑。
无 Long CoT冷启动蒸馏,三阶段Rule Based RL后 (约400steps),模型学会了
-
迟疑 (标记当前不确定的step等后续验证), -
多路径探索 (Les’t test both possibilities), -
回溯之前的分析 (Analyze .. statement again), -
阶段性总结 (Let’s summarize, Now we have determined), -
Answer前习惯于最后一次验证答案(Let’s verify all statements), -
Think时偶尔切换多语言作答 (训练数据纯英文的情况下,思考部分是中文,最后answer又切回英文)
测试集上性能也一举超越了gpt4o 的0.3,达到了 0.41的准确率,相比自身初始0.2 acc翻了一倍
非常漂亮的回复

demo1:迟疑,回溯,总结,verify。训练后期模型总是倾向于在最后输出answer前,优先全部verify一遍。这些能力是RL训练涌现的,未加任何引导
偶尔的多语言现象

demo2: 多语言的例子,思考忽然说中文,最后为了格式奖励用英文做最终回答,回复是对的

demo3:训练前模型原本的输出作为参考, 笨笨的也很可爱,看得出来是一点verify之类的基本思考单元也没有
Response长度增长

Demo 4, Settings: prompt mean 276 tokens, origin response mean 400 tokens
据我所知,这是第一个稳定实现输出长度大幅超越原始模型平均长度的(数据集prompt长度全部小于300 tokens,相比于基座模型原本输出的平均长度 400 tokens, 训练后期平均长度稳定在650 tokens,约50%的涨幅)
Reward曲线
我们设置了严苛的format reward和Answer Reward。
Reward只有这两部分构成,避免任何reward hacking。
我们编写了不少if else逻辑和正则。刚开始模型总能以匪夷所思的方式绕过我的预想,在和它一次次的斗智斗勇里完善了rule的编写
我们发现模型在学习format的时候,其实是一个快速收敛–逐渐崩坏–又忽然找回format的形式,与我们三阶段RL训练设置吻合。
还有一个有趣的小发现,在中间阶段,模型似乎认为格式反而阻碍了它的思考:日志里看到不少例子,模型在

Demo 5, 依次是平均reward, 全对的比例,格式错误比例,答案做错的比例
基本Settings
训练数据合成
其实只有2K不到的训练数据集,完全由程序合成,确保对基座模型是OOD数据。
其中逻辑问题类似老实人和骗子的益智题,老实人总说真话,骗子总说假话,下面N个人,各有各的表述,请判断谁是骗子。我们以此为例讲解实验细节。
可控性也不错,可以人为设置难度分级。测试下来gpt4o的acc在0.3左右,而3epoch的RL训练后,我们成功让qwen-7B达到了0.41。
gpt4o和claude sonnet在这种逻辑题上的准确率出乎意料的低。我们选了一个合适的人数来控制难度,确保它高于qwen 7B当前的能力,但又不会过难(在8个人的情况下,qwen完全不能作答,RL训练曲线也堪比蜗牛爬。我们最后选取了5人作为基线)
模型基座选取
我们注意到deepseek官方开了一系列distill模型,测试下来感觉有点矫枉过正了,小参数量承载了超越其自身的推理能力。回复里的wait, alternatively这种字眼频率过高。
Deepseek distill系列选了qwen-math-7B作为基座。我们本来也是这个,后来发现这个模型有坑:
-
首先它指令跟随能力比较一般,很难学会format; -
其次,它说话老爱用python code解题,训练很难克服 -
移除system prompt后,还是习惯用\box{}包裹answer,还是format不行 -
Markdown味道太重,一板一眼的,Reasoning模型本应思想跳脱一些才是
我们训了几版RL,效果始终不好,最后决定放弃Qwen Math系列,Qwen 7B 1M就好
RL基本设置
我们初始还是PPO,训练确实稳定,就是太慢了。Reinforce系列测试下来又快又好,显存还低,强烈推荐。
为了和deepseek对齐,我这里放出的所有结果都是GRPO Setting下的。
由于我只有四卡A100,跑实验相当费劲,坐等来个大佬资助我跑实验 ()
Train batch size只有8,Rollout先大后小 (32-64-16)
三阶段RL
我的经验是:高温采样+超大rollout Matters
Step1: 课程学习与格式遵循
为了训练的平稳过渡,我们先用少量3人逻辑题做预热,使用默认采样设置。
此阶段主要是学
伪变长:此阶段观察到极少量的response length ++,主要提升的是最短response的长度,max response长度基本没变,是反馈到mean length上是一个变长的过程。
以及此阶段确实验证了Pure Rule Based RL有效性,Val acc一直在涨,不过不如SFT来收益来的快
Step2:高温采样与大量rollout
数据集过渡到正式的5人谜题,此阶段训练持续最长。也是最容易崩溃的时候。
我训了14版超参,都是崩坏的,泪目,下面讲讲一些好玩的崩坏demo。
尝试将采样温度设置为1.2附近。(实测1.5会崩,1.5什么鸟语言都蹦出来了)。topp和topk也调了一下,主要目的是紊乱模型回复格式,破坏其markdown的输出风格,增加token多样性。
下图是截取的模型一个很有意思的repeat现象,可以看得出来,RL极大地增加了verify token被chosen的概率,这纯粹是自发形成的。数据集没有任何verify相关的思考token。
1. 模型的呓语:它想verify, 要precise, 注意consistent执念很深

2. Retrying too late,但没有后悔药可以吃
模型已经到达最后需要输出结果的answer阶段了,忽然意识到自己前面犯了错,想重回think模式,但是retry太晚了,这样的行为会被给予严厉的负format惩罚

3. 忽然学会了正确地verify,以及先总结初步结论再做进一步探索,但思考过程还是比较简陋

这里有很多有意思的设置小细节和中间输出的观察,非常值得深入探索
请等后续,几周内我们会写好完整文章~
Step3: 漫长的退火
采样设置里逐步回归正规,比如温度从1.2慢慢降到0.9。
此阶段模型的输出如demo1所示,非常的成熟,有verify,有反思,有回溯,有格式,要啥有啥,我很满意的。
整体思考并不冗长,废话也不多,比distill模型的回复看起来正常多了。
学习率也逐级递减到了2e-7。此阶段模型收敛速度贼慢,但多等一会,会有很多惊喜。还是让它训着吧。
奇怪的想法
-
语言混杂的现象非常迷人。手动查找log,似乎后期每个语言混杂的response都是对的,难道对模型来说混合语言作答是更有利于它reasoning的pattern? -
进一步地,谁说thinking porcess一定要是人类可读的,只要answer看得懂就行。如果答案对,我宁可中间全是乱码也无所谓(bushi) -
只要能从模型输出里恢复出人类要的答案,answer format其实也是不必要的,只是测试验证的难度大大增加了。看上去又回到了某种ORM的老路.. -
Response增加是合理的。此前模型只会一路走到黑,多了几次verify和check后,自然长度增加 -
泛化性:当前模型的思考能力实测是可以迁移到GSM8K的。由此展开或许可以跑一堆实验… -
此外,本地存了一堆ckpt,坐等后续可解释性分析哈哈哈。之前一直想做Long CoT的可解释性,现在手头终于有一些ckpt随便测了,启动!
最后扯一句,Deepseek真是越来越强了,眼睁睁看着从deepseek v2开始,成长到过年期间发现街头巷尾都在讨论它。逐渐变成了攀不上的模样(可能最早期我bar也不够)。欸,真想去deepseek实习看看。春节最快乐的事情,就是看着zero模型RL曲线嘎嘎地涨!
(文:极市干货)