Deepseek R1 Zero成功複現, 三階段RL,Response長度漲幅超50%,湧現語言混雜,double-check
項目代碼可見: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訓練湧現的,未加任何引導
偶爾的多語言現象


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訓練設置吻合。
還有一個有趣的小發現,在中間階段,模型似乎認為格式反而阻礙了它的思考:日誌里看到不少例子,模型在 tag開始後意識到自己犯錯了,想重回

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,但沒有後悔藥可以吃

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曲線嘎嘎地漲!