作者:haotian(阿里巴巴 高級算法工程師)
近期,seed&清華發表的DAPO [2],將32b-base做到了aime50分的效果,是一個值得參考的技術報告。這個報告里面提到了很多方法/tricks:
好的流程遠勝不靠譜的算法trick
llm的sft和rl,筆者認為,二者差別不大,sft是rl的一個特例(有一些文章做了類似的討論),而rl則更好的利用了負樣本。在dapo中,一個核心是dynamic-sampling,簡單來說,根據當前模型在prompt的bon,動態決定采樣budget,難prompt采樣更多的sample,簡單prompt則采樣更少的prompt,以及過濾模型解決不了的hard-prompt或者easy-prompt。
在sft階段,通常也會使用類似的策略做code/math等等的拒絕采樣、篩選多樣性response(embedding+聚類、長度)。從DAPO中可以看出,一個良好的pipline(online-dynamic-sampling)遠勝于不靠譜的算法trick。
當做好sft后,從數據/task、response合成/采樣、response挑選/打分方法等等,都有一個相對固定且運行良好的流程。把這個流程做到online,在replay-buffer 的數據構造中即可應用,配合對應的挑選/打分/篩選策略,便可將sft階段積累的優秀流程直接遷移到online-rl。同時也需要replay-buffer和主代碼解耦,做靈活的控制。
總之,能做好sft且pipline能夠在線化運行的團隊,做好online-rl只是算力和時間的問題(生產要素)。反之,則陷入一個窘境(生產關系):
1. 做sft的一直offline調數據、蒸餾、挑選,但pipline較難在線化運行,且需要人力不斷重復,但實際上都是well-defined流程和配比實驗,不太需要過多的人工參與;(出現能力/任務沖突后,人工介入處理)
2. 做rl的不斷重復sft的數據流程:找數據、找replay-buffer的數據構建策略,踩過一坨坑后,發現,這些策略其實和sft并無不同,造成了極大的資源浪費和時間浪費。
3. 做agent-rl的時候,agent-rl只需要寫一個推理引擎的多次采樣即可,而環境的穩定性則更為重要。如果sft沒怎么做過agent-based的sft數據,則環境積累基本為0,當應用agent-rl的時候,環境穩定性會成為rl訓練的阿喀琉斯之踵。尤其是agent環境,延時、返回結果的不確定性等等會加劇這個問題。
token-level-loss分析
DAPO中提到了token-level-loss,這個議題在24年末在社區也引起了一些討論,尤其當梯度累加較大的時候,會導致梯度累加訓練和大batch訓練loss有較大的差異,具體可參考[1]: 這里,第一行是 大batch的loss計算,第二行是ga=2的loss計算,顯然,主流框架實現的為第二行的loss計算,天然會比大batch計算的loss更大,對于長文本訓練會產生不利的影響。
在openrlhf/verl中,micro-batch-loss為token-level-loss計算,但有梯度累加的時候,也會存在類似的問題。對于訓練會有一定的影響。前期loss過大,優化過于激進。
實現梯度累加內的token-level-loss也比較直觀,計算loss的時候,直接按照各個維度求和再除以當前ga內的總token數:
if len(prefetch) == 0 or len(prefetch) % self.strategy.accumulated_gradient != 0:
prefetch.append(experience)
if len(prefetch) % self.strategy.accumulated_gradient == 0:
torch.distributed.barrier()
length_status = {
'response_length': prefetch[0].info['response_length'].sum()
}
for exp in prefetch[1:]:
length_status['response_length'] += exp.info['response_length'].sum()
length_status = self.strategy.all_reduce(length_status, op='sum')
grpo:無token-level-loss
grpo:有ga-token-level-loss
參考orz的repeatness統計,ga-token-level-loss會讓grpo優化更穩定一些,至少不會產生特別多的重復,而none-token-level-loss訓練到后期,repeatness、format崩潰會顯著上升(不加任何dataloader-filter、kl、entropy正則的情況下)。
對比reinforce_baseline 和grpo的異同點
(token-level-loss,不考慮kl、entropy等等)
reinforce_baseline的advantage計算:r-group_mean+全局歸一化
grpo的advantage計算:(r-group_mean)/group_std(group歸一化)
[3]中對grpo進行了細致的分析和推導:當reward=0/1時(為一個隨機變量服從伯努利分布),我們有如下均值/方差的估計
對于reinforce_baseline來說,
全局std:由于進行了局部均值歸一化,global-mean的期望=0,global-std為group的方差求和開根號,global-std要大于group-std,當采樣樣本無窮多時,
如果不對group樣本做調整,當group-std的標準差小到一定程度,會讓當前的loss急劇增加,產生更為激進的優化。道理上,reinfroce_baseline和grpo有著類似的training-dynamics,而grpo的收斂速度要好于reinfroce_baseline,但穩定性來說,不如reinforce_baseline。當全局樣本都處于方差較小的狀態,reinforce_baseline也會崩,只是要比grpo來的晚一些。
最后總結一下:
1. sft流程搬到online-replay-buffer采樣流程中,基本上就能做好online-rl(穩定的online環境+魯棒的rl方法);
2. token-level-loss在ga層面實現也重要,畢竟,在rl訓練時,梯度累加都開的比較大,一種規避方式是一次采樣多次參數更新即更offpolicy一些;
3. reinforce_baseline和grpo有著類似的training-dynamics,二者的advantage只差一個系數,道理上,reinforce_baseline會更穩定,而grpo可能前期優化會比較猛。
參考文獻
[1] Bug Fixes in LLM Training - Gradient Accumulation
[2] https://dapo-sia.github.io/static/pdf/dapo_paper.pdf
[3] REINFORCEMENT LEARNING WITH VERIFIABLE REWARDS: GRPO’S EFFECTIVE LOSS, DYNAMICS, AND SUCCESS AMPLIFICATION
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.