
來源 | 知乎
作者 | ybq
不知不覺,deepseek r1 的那篇技術報告過去半年了,“遇事不決上強化”的風氣也沒有年初那麼誇張了。或多或少,大家都陸續迴歸到 sft 和 rl 混合使用的傳統路線了。
既然強化的浮誇風已經過去大半,我們不妨平心靜氣的看下小作坊的強化之路 —— Skywork or1 的技術報告。
前言
並非所有團隊都有 dpsk、seed、qwen 的豪華配置,包括但不限於:infra 基建,人才密度,gpu,市面上所有好模型的請求額度,標註團隊 …… 因此,不同團隊做強化學習的目標是不同的:
-
dpsk 和各大廠的核心團隊:追趕 OpenAI 和 Google,提高模型泛化能力,儘早建立技術壁壘; -
普通從業者和小作坊:培養強化學習的認知,掌握相關技術棧,助力於日常工作或是保證自己能跟得上一線技術團隊; -
普通愛好者:發論文。
當大家都把目光聚焦在御三家的研究成果時,我個人反倒是覺著,小作坊的經驗分享和技術報告更有價值。一方面內容更加接地氣(消耗的資源量並不浮誇,有復現的可能性),另一方面也足夠的大方(qwen3 的技術報告,關於強化細節那是一個字都沒提)。
skywork 的這篇技術報告最起碼在以下幾點上來說是聰明的:
-
使用了位元組的 verl 和 qwen 的底座模型,復現起來非常容易; -
找了一個強有力的的 baseline:DeepScaleR,模仿它,分析它,超越它; -
卡的數量很友好,各種消融實驗都是 32卡、64卡、128卡; -
選定了一個核心技術方向來分析:Mitigating Policy Entropy Collapse; -
不搞花裡胡哨的,就做所有人都在做的 math、code,吃透就好; -
消融實驗足夠多,可能不具有普適性,但至少告訴了我們強化的哪些細節是需要做消融的。
訓練策略
這篇文章的 rl 用的是最基礎的 GRPO 演算法,唯一的改動點就就是移除了 response 的長度歸一化項 來減輕長度偏差,這個技巧以及下文會提到的 clip_higher 技巧都在 DAPO 論文裡有講。
基礎知識我也就不再多贅述了,有疑惑的話可以再翻翻 PPO、GRPO、DAPO 的論文。
多階段訓練
llm 自從進入 long cot 階段之後,4k、8k 基本就是過家家了,32k 已經是 post training 的入門級長度了 —— 這極大的增加了 rl 的算力需求。文章的作者別出心裁,提出可以把 rl 的訓練分為多階段進行:先訓 8k,等模型的效果快收斂了,再訓 16k …… 以此類推。
先訓 8k,再訓 16k 是一種聽上去就不太對的做法。畢竟超長的 response 會在訓練中被視為負例,訓 8k 的時候很可能讓模型學的不再出更長的 response,失去解決複雜問題的能力,等到再訓 16k 的時候就啥也學不到了。
rl 涉及到的一個特殊概念是“模型的提升空間”,舉個例子:學生 A 完全掌握了“反證法”且只會使用該方法,在低年級階段成績很好,但在高年級階段遇到更復雜的問題的時候,卻完全學不會;學生 B 則是同時學習了“反證法”、“歸納法”、“構造法”等,由於學的不深,在低年級的的時候成績不是很理想,但高年級接觸更多知識的時候,往往能學的更快。所以衡量一個策略好壞的標準,一定不僅僅是當前 step 的得分,而是要看遠點,看看更多 step 下的趨勢變化。
文章裡並沒有在原理上解釋多階段訓練為什麼具有可行性,只是默默的把消融實驗的結果抬了出來:一直訓 16k 的藍線和先訓 8k 再訓 16k 的黃線,最終會在測試集合取得相同的效果。那麼在這種情況下,多階段訓練的優點就彰顯出來了:
-
節省算力,具體看下圖的左圖,相同 gpu 卡時的情況下,多階段訓練的模型效果始終處於領先地位; -
提高 token efficiency,也就是讓模型少說廢話。這一點是很有意義的,現在的 long cot 模型(以 R1 為代表),無意義的廢話確實很多。初始階段不要用過長的輸出,說不定真能讓模型少說一些“讓我好好想一下”這種無意義的 token。(不要因為現在流行 long cot 就忘了大模型是按照 token 數量收費的,如果效果一樣,輸出短的模型一定是更好的模型) -
Preserve Scaling Potential,也就是模型還能訓回去,response 在後續訓練中依然能穩定提升,模型的上限沒有被削減。(感覺實驗不充分,個人持小小的懷疑態度)

說句題外話,就我的視角而言,post training 最關鍵的並不是 sft 和 rl 誰更重要,恰恰就是 multi_stage 的設計。既可以是多階段的 sft,也可以是多階段的 rl,亦或者是相互交叉的多階段。不同 topic 的多階段,不同任務難度的多階段,不同訓練方法的多階段,不同 seq_len 的多階段等等,都需要做實驗去設計,也往往都能讓模型的效果有所提升。
pretrain 的技術方法正在全面入侵 post training(退火、課程學習、多階段訓練 ……)。
針對截斷的 advantage mask
承接上文,文章繼續討論了“response 截斷的資料到底該不該作為 rl 階段的負例”。
在 8k 的訓練設定下,模型初始截斷比例非常高。如下圖所示,訓練初期(0-100 步),準確率的升主要是由於截斷比例的急劇下降。在 100 步之後,演算法開始提高非截斷 response 的準確率。

從數學的視角出發,模型的最佳化目標有兩個變數: ,分別代表非截斷的機率,和非截斷時的期望 reward。很顯然,我們不是很在乎截斷率,我們希望模型在訓練中主要聚焦在提高非截斷時的期望 reward。那麼,這就需要設計一些 advantage mask 策略,來修正模型的最佳化目標。
針對 advantage mask,一共有三種策略:
-
no mask:無任何 mask -
advantage_mask_before:截斷 response 不參與 group 內的 advantage 計算,這些截斷 response 的 advantage 設為零。公式中 是非截斷的 response, -
advantage_mask_after:截斷 response 參與 group 內的 advantage 計算,這些截斷 response 的 advantage 設為零 。公式中 是所有的 response,
三種策略的消融實驗從下圖可以看到具體情況:
-
圖 a 是截斷比例,能發現 advantage_mask_before 策略變化明顯; -
圖 b 是訓練準確率,advantage_mask_before 策略準確率下降,no mask 和 advantage_mask_after 兩個策略都能穩定上升; -
圖 c 是非截斷資料的準確率,advantage_mask_before 最高,no mask 最低,但是和 advantage_mask_after 的趨勢一樣,都是先降再升。
advantage_mask_before 策略的表現非常特殊:非截斷 response 的準確率有所提升,整體的訓練準確率卻持續下降,且截斷比例穩步上升。這種現象應該是一種典型的 reward hacking —— 我不知道這道題會不會寫,我只要告訴老師說題目“超綱”了就不會被批評。
最終,advantage_mask_before 策略因為試圖作弊,率先出局。

進一步的,我們來看下不同策略訓出來的模型在更長的 response_len 下的表現(此時基本上不存在截斷問題了)。下圖的曲線很明顯的說明了,黃線 no mask ≈ 紅線 advantage_mask_after > 綠線 advantage_mask_before。
注意下圖中的紫線,應該是在 no mask stage1 基礎上做了 stage2 (更長 response_len)訓練的模型,說明第一階段學到的較短的 response 完全沒影響模型的上限,第二階段的 response_len 和 accuracy 仍然能穩步提升。

在更大的推理 response_len下,advantage mask 技巧並不能帶來更優秀的效能。第一階段不使用 advantage mask 的模型,在第二階段擴大 response_len 之後,依然能提高 accuracy,並且顯著優化了 token efficiency。如無必要,勿增實體,作者選擇不做 advantage_mask。
高溫取樣
GRPO 的分組特性意味著 response 的取樣過程會直接影響每個 group 的質量和多樣性,進而影響模型的訓練效果。如果取樣的溫度過高,隨機性過大,可能會導致“全錯 group”出現的機率,進而影響訓練效率;取樣溫度過低,則會降低 group 內的多樣性,增加“全對 group”出現的機率。
針對取樣溫度,文章做了一個消融實驗,基本結論是:高溫取樣的模型效果更好。較高的溫度顯著增強了早期階段的學習訊號,併為後續訓練保留了更大的潛力。同時,高溫取樣初始的熵也更大, 衰減也更慢。(圖中的熵之所以降到 0.2 就不再降低了,是因為作者加了熵 loss 來阻止進一步下降)

自適應熵控制
文章指出,熵坍縮會嚴重影響模型的效果。所以希望在 rl 的過程中抑制熵的快速下降。提出的做法就是引入一個熵 loss,來把熵控制在某個值附近。
這個熵 loss 的係數 是動態調控的,為此需要引入兩個額外的超引數:
-
:期待模型的熵穩定在這個值附近; -
:熵損失係數的調整步長。
在第 步更新的時候,actor model 的熵記為 ,如果它小於 ,就把熵 loss 的係數 加上 ,大於則減去 ,這個策略只在 時生效。具體的公式為:
關於熵的討論是這篇文章最精彩的地方,下文會詳細解讀,這裡就不多提了。
KL Loss
訓到一定階段後,KL_loss 會將 actor model 的策略拉到和 reference model 一致,導致 KL_loss 下降至接近零。同時,模型在測試集合上的效能也基本不會再提升了。所以文章裡的實驗也都不再加 KL_loss 了。
如圖,KL_loss 初期基本沒影響,訓得久了之後(750 step 往後)就讓模型訓不動了。KL_loss 一直以來被詬病的就是“reference_model 為什麼不定期更新一下”。都過了幾千、幾萬step 了,還要被原始的模型來約束,非常不合理,現在很多強化工作確實也都選擇不用 KL_loss 了。

緩解策略熵坍縮的探索
名詞解釋
-
,即 rollout batch size:每次使用的 prompt 數量 -
,即 mini batch size:每次模型進行引數更時新使用的 response 數量 -
,即資料複用:每次 rollout 產生的 response 的使用次數 -
,即 group size:每條 prompt 生成的 response 數量 -
:response 的最大長度 -
:temperature -
:在一次 rollout 資料的情況下,對模型的引數進行多少次更新。該數值等於 1 即為 on-policy,大於 1 即為 off-policy。特別的, -
on-policy:所有參與訓練的 response 都是模型自己生成出來的 -
off-policy:參與訓練的 response 可能是較早時期的模型生成出來的
on-policy 和 off-policy 的區別,主要體現在對資料的使用上,off-policy 的訓練效率會明顯更高一些。一方面,off-policy 可以不等所有的 response 生成完畢,就啟動模型訓練;另一方面,off-policy 可以多次使用同一條資料,提高資料利用率,on-policy 則不可以。

核心論點:過早的熵坍縮會導致模型效果差
“過早的熵坍縮會導致模型效果差,強化訓練中引入熵 loss 能明顯緩解熵坍縮的速度”屬於文章的核心觀點,關於熵的所有討論和實驗也都是圍繞這一觀點進行的。文章裡透過一個對比實驗來支撐該觀點:
-
藍線引入了 1e-3 的 熵 loss,熵坍縮的比較快,模型的測試效果差; -
黃線引入了 5e-3 的 熵 loss,熵坍縮的比較慢,模型的測試效果好。
個人覺著,文章裡對該論點的證明有點單薄了,baseline 缺少一個不加熵 loss 的曲線,實驗也不是那麼充分。雖然目前大部分人都認可 “熵低 = 模型輸出多樣性差 = 強化的探索空間小 = 強化效果差” 這一觀點,但其實還是缺少一些系統性的分析和證明的,畢竟 entropy 和 diversity 並不能完全劃等號,也有很多強化的工作完全無視對熵的控制。

rollout 多樣性對熵的影響
既然熵對模型的效果影響很大,那哪些因素能影響熵呢?首先是 rollout 的取樣階段,文章分析了這幾個超引數: , ,temperature。實驗結論如下圖所示,在 on-policy 的情況下, 和 怎麼調整都不會出現快速熵坍縮。
至於 Temperature,上文提到過:使用適當選擇的較高溫度,在訓練初期會導致較差的測試效能,但最終能帶來更大的效能提升。

對熵的影響
對 的分析,其實就是對 off-policy 和 on-policy 的分析。文章透過三組消融實驗給出了一個結論:on-policy 在任何情況下都好於 off-policy。
實驗 1:相同的 rollout 配置下,off-policy 容易熵坍縮,on-policy 不易熵坍縮。下圖中,只有藍線的 on-policy 沒有快速熵坍縮,自然而然效果也更好了。

實驗 2 :on-policy 可以用更少的訓練資料,達到比 off-policy 更好的效果。重點觀察下圖的紅線和黃線,紅線每一步訓練使用了 64 條 prompt,而黃線是 32 條 prompt。模型效果上,紅線初期是明顯壓著黃線的,但在 1500 step 左右,紅線訓不動了,黃線還在上繼續漲。

實驗 3 :即使增大 rollout 的資料量,也無法阻止 off-policy 的模型快速熵坍縮。黃線和綠線的趨勢完全一致,即使黃線的 rollout 數量有 256 條之多。

如何防止熵坍縮
總結下前文關於熵的討論,大概可以概括為下面這幾個觀點:
-
熵坍縮就會導致模型效果差; -
只要不是 on-policy,模型必然會快速熵坍縮,調整任何其他引數都沒用; -
off-policy 能大幅度提高訓練效率以及資料的利用率,不可能完全捨棄,尤其是“非同步訓練框架”的使用就離不開 off-policy 的訓練策略; -
即使是 on-policy,也只是緩慢熵坍縮,並不能從根本上防止熵坍縮。
氣氛都鋪墊到這兒了,那肯定要討論下如何防止熵坍縮唄。文章給出了兩個方法來防止熵坍縮:加入熵 loss 和 clip higher 技巧。
先說熵 loss,這個非常直接,讓模型直接朝著熵增的方向學習唄。此處必須提一句的是,語言模型的訓練是朝著熵減的方向去最佳化的,所以 熵 loss 和語言模型 loss 是兩個截然相反的最佳化目標,把它們揉雜在一起是一個很反直覺的行為。
有沒有感覺強化學習很擰巴,既希望模型朝著某個分佈去學習,又怕模型過於擬合某個分佈導致沒有訓練空間。我是感覺這也能從側面說明, pretrain 階段是在學習人類語言分佈,而 posttrain 階段只是在調整模型學到的人類語言分佈
言歸正傳,下圖充分說明了熵 loss 不是隨便加的,加大了模型直接崩潰,加小了又沒作用。

除此之外,熵 loss 對訓練資料也很敏感,相同引數配置下使用不同的資料,會得到完全不同的趨勢。(這裡其實可以更細緻的探究一下,兩份資料的 response 多樣性到底差別多大,比較一下 response 的熵的平均值,也許能給出一個近似的擬合公式:“熵在多大的區間內適合多大的 loss 係數”)

文章讀到這裡我覺著作者的意圖已經很明顯了,深度學習的慣用伎倆:當一個引數同時兼具 significant 和 sensitive 兩個屬性的時候,那不妨就給它補充一個 dynamic 屬性。也就是文章前面介紹過的動態調整熵 loss 係數的方法。
需要注意的是,當 較大的時候,自適應係數也控制不了熵。文章推測是因為“熵損失是基於整個詞彙表計算的,這可能會增加許多非預期 token 出現的機率”。因此,只推薦 的情況下使用自適應的熵控制。

再說另一個技巧,DAPO 論文裡已經講過的 clip higher,認真讀下 DPAO 論文裡的分析過程就好啦,這已經快屬於強化學習的常識之一了。
如下圖所示,clip_higher 之後,熵坍縮顯著放緩,模型在測試集表現更好。但是不能設定的過高,比如圖中的紅線 0.28。有意思的是,紅線的 0.28 恰恰是 DAPO 原始論文中的推薦值,所以這說明 clip higher ratio 也是嚴重依賴於資料的(既然熵 loss 都動態調控係數了,乾脆 clip higher ratio 也動態調算了)

訓練資源分配的探索
訓練資源分配問題是 qwen、seed 不太會探討的一個話題,因為他們並不缺卡,但對普通團隊來說資源分配確實是搞強化實驗的命門所在。
首先明確下 rl 的訓練時間: ,分別代表 data rollout 的時間,policy update 的時間,以及其他操作的時間(reward computation,experience generation),更具體地說:
-
的主要影響因素是 rollout batch size ( )和 group size( ) -
的主要影響因素是 隨機梯度下降(SGD)的步數( )

policy update 的耗時
毋庸置疑, 是 的大頭,因此可以合理做出判斷:適當增加每次 rollout 時的 ,可以在幾乎不增加 的情況下提高訓練效率(這裡很好理解,一次 rollout,多次 policy update 自然是能讓模型學的更多)。下表也證明了這個假設,一次 rollout,更新四次模和更新一次模型相比,僅僅增加了 3% 的耗時。

但是前面的實驗提到過,off-policy 會加劇熵坍縮。因此,不建議僅僅為提高訓練效率而增加 ,除非有適當的機制來緩解熵坍縮。
rollout 的耗時
現在考慮如何減少生成時間 。如下表所示, 主要由 batch size 和生成最長的那條 response 所需要的時間來確定。在計算資源充足的時候,增加生成階段的 gpu 數量並不能明顯降低最長的那條 response 所需要的時間,也就不能大幅度減少生成階段的耗時。

也就是說,當有了更多的訓練資源用來做生成階段的推理,完全不調整超引數帶來的收益是比較小的,這就是個木桶效應,更多的卡也沒辦法解決最長那條 response 對應的耗時。最好的辦法是,增加卡數量的同時,也增大 rollout batch size 或者 group size,透過利用更大的 rollout buffer,來獲得更精確的梯度估計。
長話短說,論文做了一些簡單的消融實驗,結論大概是:rollout batch size 越大,模型在測試集上的表現越好;group size 越大,模型在測試集上的表現越好。具體效果詳見下面兩張圖。


其他
文章還有一些內容,諸如:訓練資料如何清洗,math 任務的 verifier 怎麼設計,code 任務的 sandbox 怎麼搞等等。感興趣的同學自己去讀讀吧(顯然我不感興趣哈哈),我就不再解讀了。
最後總結一句,rl 的實驗結果和底座模型能力、訓練資料、訓練 topic 息息相關。大家都知道 qwen 底座模型訓過很多的題,那它就很容易在學習數學題的時候熵減過快,就會依賴文章裡講的控制熵的技巧。也許 llama 模型的做題能力較差,也就完全不需要考慮文章對熵的各種分析。
我們學習的是文章作者在嘗試穩定 rl 訓練的思考過程和實驗設計(尤其是消融實驗的動機和分析),而不是一昧相信文章裡給出的實驗結論。
技術交流群邀請函
△長按新增小助手
掃描二維碼新增小助手微信
請備註:姓名-學校/公司-研究方向
(如:小張-哈工大-對話系統)
即可申請加入自然語言處理/Pytorch等技術交流群
關於我們
MLNLP 社群是由國內外機器學習與自然語言處理學者聯合構建的民間學術社群,目前已經發展為國內外知名的機器學習與自然語言處理社群,旨在促進機器學習,自然語言處理學術界、產業界和廣大愛好者之間的進步。
社群可以為相關從業者的深造、就業及研究等方面提供開放交流平臺。歡迎大家關注和加入我們。

掃描二維碼新增小助手微信
關於我們
