之前在文章大模型面試八股中提到一個問題,大模型訓練中RM分數越來越高,那訓出來LLM的效果一定好嗎?
這么肯定的判斷肯定是有坑的,值得懷疑。
如果你動手跑幾次ppo的過程就發現了,大模型的強化學習非常難以訓練,難以訓練不僅僅指的是費卡,還是指的非常容易訓崩。
第一,費卡。假設你訓llama 7b,SFT 和 RM 都用7B的模型,那么顯存耗費 = 2*7B(TRIAN MODE) + *7B(EVAL MODE), 分別對應 policy model / critic model,還有ref model/reward model
本來你能用幾張40GB A100的卡+deepspeed 做7b的全參數微調,強化學習就得升級到80GB的A100了,勉勉強強能跑到7B。想跑更大的就得充錢了。
第二,容易崩。LLM訓著訓著就不聽你話了,要么變成停不下來的復讀機,輸出到后面沒有邏輯直到maxlen,要么變成啞巴,直接一個eosid躺平。
RLHF中的問題其實在RL游戲訓練里面很常見了,如果環境和參數設置不好的話,agent很容走極端,在 一頭撞死or循環鬼畜之間反復橫跳。
原始的ppo就是很難訓,對SFT基模型和RM的訓練數據以及采樣prompt的數據要求很高,參數設置要求也很高。
自從openai帶了一波RLHF的節奏后,大家都覺得強化學習在對齊方面的無敵功力,但自己跑似乎又不是那么回事,這玩意也太有講究了吧。
更多的魔鬼在細節了,openai像拿了一個比賽的冠軍,告訴你了成功的solution,結果沒告訴你各個步驟的重要性和關鍵設置,更沒有告訴你失敗和無效的經驗。
在講trick之前,首先復旦-MOSS也對LLM的訓練過程加了更多監測,其實這些都是實驗中非常重要的監控過程指標,能很清楚的發現你模型是否出現異常。
然后這個圖很好,非常清楚地講述了trick是如何作用在RLHF中的各個階段的,另外配套的開源代碼實現也非常清晰易懂,典型的面條代碼沒有什么封裝,一碼到底,易讀性和魔改都很方便。
下面我們看看這7個trick,對應圖中右側畫星號的部分。
1, token級別的KL散度懲罰
kl_penalty = (-self.kl_penalty_weight * (logprobs - ref_logprobs)).cpu()
這一步主要解決的問題是訓練穩定性,防止步子太大扯著蛋,如果你輸出的和參考模型差別過大的話就減分。
2,Reward Normalization and Clipping
3,Value Function Loss Clipping
Clipping類似梯度裁剪,也是止步子太大扯著蛋,對一些異常的loss和reward做了限制,Normalization為了對reward做標準化。
這部分的代碼可以對應開源中的這些設置仔細查看,原理大同小異
self.use_reward_clip: bool = opt.use_reward_clip self.use_reward_norm:bool=opt.use_reward_norm self.use_advantage_norm:bool=opt.use_advantage_norm self.use_advantage_clip: bool = opt.use_advantage_clip self.use_critic_loss_clip:bool=opt.use_critic_loss_clip self.use_policy_loss_clip:bool=opt.use_policy_loss_clip
4.Critic Model Initialization
用RM model初始化Critic可能不是一個必要的選擇,作者做了一些實驗證明這個問題,推薦使用critic model pre-training。代碼里這部分還沒有,還是使用rm初始化的,后續跟進一下這個問題。
5. Generalized Advantage Estimation
附錄里C.3有GAE的調參實驗。
6.Clipped Surrogate Objective
這個也是一種正則化方法,防止步子太大扯著蛋,確保訓練過程的中的穩定性,這個方法比一般policy gradient處理的更為高效。
7.Global Gradient Clipping
原理還是同上,所有的Clipping無非都是砍掉太大的步子。
另外作者還用了一個instruct gpt里面用到的方案,增加了訓練過程使用 llm_pretrain_loss,參考代碼
if self.use_entropy_loss: loss1 = pg_loss + self.vf_loss_weight * vf_loss + self.entropy_loss_weight * entro_loss else: loss1 = pg_loss + self.vf_loss_weight * vf_loss loss2 = self.ppo_pretrain_loss_weight * pretrain_loss loss = loss1 + loss2
總結下,整體ppo-max的改進主要集中在訓練過程的穩定性上,用的東西還是模型的老三樣,訓練過程裁剪,初始化,loss改進,主要集中在如何能讓RLHF更好調,推薦參考作者的源碼進行一些實驗。
另外,作者在論文里留了一個彩蛋,技術報告的第二部分預告主要是講Reward Model的成功和踩坑經驗,目前還沒有發布,靜待作者更新。之前大家一直的爭論點用什么scale的RM,說要用遠遠大于SFT model的RM model,這到底是不是一個關鍵的問題,是不是deberta 和 65B都行,期待作者第二個技術報告里給一個實驗~
審核編輯:劉清
-
處理器
+關注
關注
68文章
19387瀏覽量
230537 -
SFT
+關注
關注
0文章
9瀏覽量
6822 -
GAE
+關注
關注
0文章
5瀏覽量
6779
原文標題:大模型RLHF的trick
文章出處:【微信號:zenRRan,微信公眾號:深度學習自然語言處理】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論