
來源 | 知乎
強化學習基於獎勵最大化假設,所有的演算法都是建立在得到一個最大的期望獎勵的基礎上。
首先來明晰兩個概念:
On-Policy: 訓練資料由需要訓練的策略本身透過與環境的互動產生,用自己產生的資料來進行訓練(可以理解為需要即時互動)
Off-Policy: 訓練資料預先收集好(人工或者其它策略產生),策略直接透過這些資料進行學習。
PPO, GRPO,DAPO都是On-Policy的策略。這些On-Policy的策略一般由四個關鍵元件組成訓練的pipeline:
-
• Actor: 產生動作的策略 -
• Critic: 評估動作或狀態的價值的網路 -
• Reward Model:對狀態轉移給出即時的獎勵的模型或者函式 -
• Reference Model: 參考策略,這是為了防止在訓練過程中,策略網路在不斷的更新後,相對於原始策略偏移地太遠。(避免它訓歪了)
從PPO出發,捋清強化學習訓練的思路
Policy gradient optimization
基於獎勵假設,我們希望得到一個能夠最大化獎勵期望的策略,這個目標可以寫成:
而獎勵來自於軌跡上的每一個動作的即時獎勵,於是,這個目標可以寫成:
這裡的 代表一系列的動作狀態軌跡,也就是所謂的sasa。
而
這裡的狀態轉移由當前狀態和選擇的動作決定,也就是:
那麼,一條軌跡的整體機率分佈可以寫成:
對於policy gradient的方法來說,我們希望透過梯度上升的方式最大化軌跡得到的獎勵,也就是最大化我們的目標函式。梯度上升的更新公式可以寫為:
那麼問題來了,如何計算目標函式的梯度呢,這個目標函式涉及一輪迭代中軌跡上的所有點,直接去計算或者估算都具有很大的困難,而且還有由環境和策略共同決定的狀態轉移項,這麼多項揉在一起似乎無法求解。但是呢,要不說數學家是天才呢,它可以由一系列簡單的變換變為只與策略有關的項。先來對這個目標函式的梯度進行一個簡單的推導:
那麼上述目標函式的梯度轉變為了一個對軌跡轉移與獎勵函式的積分,採用log函式的導數變換技巧,上式可以變成:
由於 代表路徑,所以這裡的這個積分可以再寫回成為一個期望:
由於我們知道 ,那麼對這個方程取log對 求導,可以得到:
這個變換很巧妙,如果不取log的話,就要處理這裡的連乘狀態轉移,而這個往往是一個跟環境有關的不定項。
那麼目標函式的導數變成:
那麼現在就得到了一個只與策略和獎勵有關的式子,我們可以對此進行計算,但是顯然不可能對能夠取樣所有軌跡來進行梯度計算,在很多場景下要不軌跡無限要不窮舉所需算力太大,所以我們只能對它進行估算。而進行取樣估算,就要請出大名鼎鼎的蒙特卡洛演算法了。蒙特卡洛演算法其實就是透過區域性取樣來估計整體的方法,那麼我們可以取樣一部分軌跡,得到
那麼這個 就可以用來做期望的估計值,也就是策略梯度的估計值。
Reinforce 演算法
根據上面的策略梯度最佳化的推導基礎,我們可以開始介紹經典的Reinforce演算法,這個演算法就是簡單的梯度策略最佳化的應用。
那麼現在有一個需要最佳化的策略網路 ,它會根據當前狀態 輸出一個動作機率分佈 ,用於指導當前應該採用怎樣的動作。
有了策略網路以後就可以開始在環境中採集動作軌跡 ,這些動作軌跡用於計算策略更新的梯度(上述蒙特卡洛法)。
當收集到了足夠多的軌跡以後,採用這個蒙特卡洛估計法來計算策略梯度:
然後根據梯度進行策略更新:
反覆進行取樣然後計算梯度然後更新網路,直到你的策略網路擬合。
這就是經典的Reinforce演算法。
評估一下這個演算法:
這是一個Model-free的演算法,因為只涉及對策略網路本身輸出取樣,而不涉及由環境決定的狀態轉移過程。
但是呢,由於需要進行取樣估計,雖然蒙特卡洛法是策略梯度的無偏估計,但是如果樣本太少的話,得到的方差可能就會很大,這不利於訓練的穩定性。其實這也是策略梯度最佳化方法的固有缺陷,如果要學習的行為足夠複雜(取樣的軌跡太長)或者策略網路過大,那麼要進行的取樣和計算量也是非常大的,不然梯度估計的方差就會變得很大。
那麼有沒有減小方差的方法呢?有的兄弟,包有的
Focus only on the future
回顧一下我們目前介紹的梯度策略最佳化演算法,每一步的估計都乘上了從軌跡開始到結束的所有獎勵,想一想真的需要嗎?我第10步的時候去做下一步決策的時候,過去9步的獎勵還應該被考慮進來嗎?什麼?你說不需要,我也說不需要,從因果的角度來看壓根不需要之前的獎勵!那麼我們可以改寫一下策略梯度的數學表示式,變為:
這樣計算每一個軌跡點上的梯度時,就把過去的獎勵給過濾掉了,一定程度上減小了方差。這裡的 一般稱為rewards-to-go,或者稱為狀態-動作價值(對應DQN演算法中的Q值)
引入一個獎勵基線
引入一個基線可以有效減小方差(例如資料在基線上下跳動,那麼對所有的資料減去這個基線的話,資料整體的方差就會有效減小,大概想象一下就可以)
這裡的b就是引入的基線,這個基線常常是用一個價值模型評估當前狀態的價值,即
優勢函式
引入了rewards-to-go和獎勵基線以後, 這一項我們稱為優勢函式,它的意義是當前狀態下選擇某個動作的價值相較於這個狀態下的平均價值的好壞。通常前一項稱為Q-function,後一項是vaule-estimate. 那麼把這一項可以定義為:
那麼現在的策略梯度估計可以改寫為:
從rewards-to-go到優勢函式,目前做的一系列工作都是為了減少方差。接下來開始介紹PPO演算法了
Generalized Advantage estimation(GAE)
對於價值函式,我們有
那麼優勢函式可以寫為:
同樣的,如果再迭代一步,可以得到
重複迭代可以得到
我們定義每一步的TD error為: ,為了便於觀察,可以再寫一項
那麼我們把它代入回多步估計優勢函式的式子中去,可以發現:
以上都是透過取樣去對優勢函式進行估計的可行公式。
那麼GAE就是對多步估計優勢函式的求和:
這裡求和對於每一項還添加了一項衰減因子
把它展開來,就可以得到:
如果我們採集K步的話,那麼透過等比數列求和公式,我們得到:
當 ,上式實際上變為
那麼
把 作為GAE, 那麼就得到
這個式子也可以寫成一個遞迴的形式,即:
以上的所有推導過程中,都有
可以取邊界值對這個衰減因子進行一個簡單的分析:
時, ,也就是隻有一步時分估計對GAE有貢獻,而當 時, ,整個軌跡的取樣都會對GAE有貢獻。所以可以用它來平衡方差-偏差 trade-off問題,當 較大時,GAE會更多利用軌跡取樣歷史資訊,從而減小偏差,但是可能會增加偏差。而 較小時,GAE利用更少的軌跡取樣歷史資訊,而更偏向於使用短期的TD估計,所以可以減小方差,但是可能會增大偏差。這就是GAE的推導過程。
Proximal Policy Optimization
接下來就是著名的PPO演算法啦。PPO需要訓練兩個模型,一個是策略網路,一個是價值網路(標準的Actor-critic結構)
我們從它的目標函式來分析,首先對於策略網路
這裡 就是前文提到的GAE,這裡還有一個clip項,是為了防止策略更新過大。
對於價值模型:
這就是很簡單的平方損失。
然後還有一個所謂的熵損失,這是用來鼓勵探索的
那麼總體損失就是:
當然,這裡的損失其實完全可以自己設計,但是一般遵循這裡的clip原則,因為ppo的核心就是不能讓模型訓練引數更新過大,否則就會越訓練越偏。這裡還有個與ref model的KL散度項,也是為了維持模型不要偏太遠,即在目標函式中新增上 。
舉個例子
公式太多不想看?那就從例子出發來捋一下強化學習的過程
例如使用PPO去訓練一個大語言模型:
訓練過程中會策略會有兩個狀態,一個是用於產生取樣軌跡的 ,它在產生token prediction的過程中,引數保持不變,而另外一個就是 ,它用於梯度更新。而每輪輪取樣結束並更新完梯度以後,
一步一步來的話,就是:
-
• 準備prompt,把它投餵給 -
• 根據prompt生成回答,每個回答包含多個token,而我們訓練就是作用在這些token生成的過程中。 -
• 在生成過程中,對於每個生成的token,都記錄: (這個語境下就是模型生成當前token前的context), (這個語境下就是模型生成的toekn,以及生成它的log 機率) , 以及對應的 ,這部分用於計算優勢
一般來說,強化學習訓練llm時,都是用獎勵模型或者獎勵函式對模型生成的整體回答給一個獎勵,然後把這個獎勵複製或者平分給每個token,然後用它來計算優勢值
然後根據ppo的目標函式來計算梯度啦,計算完一個批次的資料的梯度以後就可以用來更新網路,直到它擬合。
這裡插一下DPO
DPO(Direct Preference Optimization)
從PPO的目標函數出發,
這個最大化目標可以改寫成最小化目標:
這個目標接著可以寫成
最後得到
那麼對於分母,可以把它構造成一個機率分佈,
其中
那麼上面的目標函式可以寫為:
即
由於 與 無關,計算梯度的時候用不上,所以可以直接忽略
即
我們知道KL散度總是非負的,而且只有當兩個分佈完全一樣時,它才能達到最小值0,也就是說,PPO的最佳化目標可以等效於讓模型的輸出分佈 趨近與 一樣。
而 ,如果獎勵模型的引數保持不變,那它就是我們需要的最優解。
也就是說,我們訓練出一個最優獎勵模型的時候,實際上它已經給出最優的策略網路。那麼也就是說,訓練獎勵模型和訓練策略網路實際上是等價的。那這就告訴我們,像之前的先訓練獎勵模型,然後透過獎勵模型再來訓練策略模型的這個正規化,實際上並不需要先顯式訓練出一個獎勵模型,而是可以直接用策略模型代替獎勵模型去進行訓練,從而得到我們最終需要的對齊模型。這兩種方法在數學上是完全等價的。所以DPO就繞過了online強化學習,直接用策略網路代替獎勵模型去進行訓練,從而達到同樣的目的。
從上面的最優解變換可以得到:
就有
這裡獎勵模型就完全可以用策略模型進行替代。
那麼來看一下我們一般是如何來訓練reward model的,一般來說,訓練reward model有兩種方法。第一種是採集LLM的兩個回答,構造偏好對,來訓練獎勵模型給正樣本更高的分數,負樣本更低的分數。它的資料組織形式是: 。
第二種是採集多個回答 , ,多個回答都會被人類標註,用來評估它們的被偏好程度,然後基於此訓練獎勵模型按照被偏好程度給這些回答進行打分。當然了,實際上多個回答也可以被拆解成兩兩配對的形式,把它變成第一種方法,像openai 訓練gpt就是採用拆解成兩兩配對的方式、
兩兩配對的模式被稱為BT model(Bradley-Terry)
BT模型定義的對於兩兩匹配訓練目標是: ,這裡 可以理解為y的得分,
那麼把它代入我們的獎勵模型的目標函式中有:
這裡的D就是採集的偏好資料集。之前推導DPO的時候,我們有
那麼它代入獎勵模型的目標函式中去有:
那麼這裡就成功把訓練獎勵模型,改成了直接訓練策略模型,從而繞過了訓練獎勵模型的過程,那麼後面的online 強化學習過程也就不需要了,這就是所謂的直接偏好訓練。
其實DPO彎彎繞繞這麼多,實際上執行起來很簡單,幾乎就是SFT,以上的公式推導,是為了說明DPO的訓練目標在數學上等價於PPO的強化學習訓練目標,從而說明PPO可以做成的事,DPO按道理也應該可以做成。
(這裡給一些大白話的insight,DPO首先給出了PPO訓練最優狀態下策略網路與獎勵網路的關係,也就是說如果滿足了這個關係,PPO的強化學習這一步都不用訓練了。那麼我們現在假定它滿足這個關係了,那麼我們還差一個問題,就是獎勵模型哪裡來的?它是經過reward model的訓練過程得來的。而如果滿足這個關係,我們不再需要把獎勵模型顯式地訓練出來,而是直接把策略網路代入獎勵模型的訓練過程。那麼這個過程中,獎勵模型的目標透過策略網路得到了實現,也就是說,訓練獎勵模型的過程,使得了這個關係得到了擬合式成立,從而不再需要真正的強化學習訓練。)
GRPO

GRPO的目標函式為:

其實主要的就是把GAE Advantage估計改為了組間相對優勢估計,

那麼這樣一改,就不需要value model了,從而減少了訓練開銷。
GRPO的訓練虛擬碼為:

DAPO
DAPO的目標函式是:

這是位元組新發布的基於GRPO最佳化的一個演算法,主要做了以下四個最佳化:

它第一個clip higher呢意思是對clip的兩個邊界分別設定不同的 來控制,分別指代為:來控制。而在這裡設定為一個相對較大的值。出發點呢是希望鼓勵探索,因為機率較小的token預測和機率較大的token預測所受到的clip的影響是不同的,比如等於0.01和0.9時,如果,那麼更新的最大允許機率就會是0.012和1.08,那麼實際上低機率的token就會長時間難以得到選擇。所以對上界給一個更大的來鼓勵探索。而下界 保持一個較小值,不然的話可能很多token更新著更新著機率選擇就變成0了。
第二個動態取樣,更像是一種訓練上的工程技巧,說的是在訓練過程中,模型可能對很多問題都回答的很好,那麼這樣一來,對同一個批次中的很多問題,模型取樣一組回答,可能都會獲得最好的獎勵,比如1,那麼這樣一來,每個回答的組間優勢都變成了0,那麼這樣的資料就無法提供有效的梯度供模型訓練。所以在訓練目標中,加入了這一項

也就是說對於輸入的樣本持續取樣,直到滿足這個條件才把這一批資料拿去訓練。
第三個是所謂的token level的損失計算。由於GRPO是先對每一條回答基於回答的長度做了一個平均,再對G個回答做一個平均。即:

而由於每個回答的長度不一致,這就會導致實際上對多個回答的每個token的loss除以了一個不一樣的因子,這會導致一些很長的回答對loss的貢獻減小。而在long-COT的訓練過程中,我們希望學習到有效的長回答,所以希望對長回答也給相應更大的loss。DAPO把GRPO的這種loss計算方式稱為sample-level loss。而DAPO把這個正規化改成了:

也就是所有的token的loss都施加同樣的平均因子,這樣對於長回答整體上就給了一個相對更大的loss。
最後一個是說之前訓練模型的時候,如果模型生成的回答太長了,超過了限定值,就會被直接階段。而對於這些被階段的回答,會施加一個懲罰性的獎勵。而這種懲罰性的訊號可能又會引入訓練噪聲,因為可能雖然回答很長,但是卻是邏輯上非常正確的回答,那模型就會不知道這個回答到底是好的還是不好的。那DAPO在這裡實施了一個跟長度有關的線性獎勵:

除了上面四個最佳化技巧以外,DAPO還把KL散度約束給去掉了,理由是:“However, during training the long-CoT reasoning model, the model distribution can diverge significantly from the initial model, thus this restriction is not necessary. Therefore, we will exclude the KL term from our proposed algorithm. ”就是說long-COT訓練過程中,模型本來就是要在較大程度上偏離原始的狀態,所以乾脆省了用於約束模型更新的KL散度。
DAPO的訓練流程虛擬碼為:

主要參考
https://huggingface.co/blog/NormalUhr/rlhf-pipeline#navigating-the-rlhf-landscape-from-policy-gradients-to-ppo-gae-and-dpo-for-llm-alignmenthttps://doi.org/10.48550/arXiv.2503.14476
技術交流群邀請函
△長按新增小助手
掃描二維碼新增小助手微信
請備註:姓名-學校/公司-研究方向
(如:小張-哈工大-對話系統)
即可申請加入自然語言處理/Pytorch等技術交流群
關於我們
MLNLP 社群是由國內外機器學習與自然語言處理學者聯合構建的民間學術社群,目前已經發展為國內外知名的機器學習與自然語言處理社群,旨在促進機器學習,自然語言處理學術界、產業界和廣大愛好者之間的進步。
社群可以為相關從業者的深造、就業及研究等方面提供開放交流平臺。歡迎大家關注和加入我們。

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