從RLHF、PPO到GRPO再訓(xùn)練推理模型,這是你需要的強(qiáng)化學(xué)習(xí)入門(mén)指南
強(qiáng)化學(xué)習(xí)(RL)已經(jīng)成為當(dāng)今 LLM 不可或缺的技術(shù)之一。從大模型對(duì)齊到推理模型訓(xùn)練再到如今的智能體強(qiáng)化學(xué)習(xí)(Agentic RL),你幾乎能在當(dāng)今 AI 領(lǐng)域的每個(gè)領(lǐng)域看到強(qiáng)化學(xué)習(xí)的身影。
近日,Daniel Han 和 Michael Han 兩兄弟組成的團(tuán)隊(duì) Unsloth(用于微調(diào)模型的同名開(kāi)源項(xiàng)目 GitHub 星數(shù)已超過(guò) 4 萬(wàn))發(fā)布了一個(gè)強(qiáng)化學(xué)習(xí)教程,其中從吃豆人談起,簡(jiǎn)單易懂地從 RLHF、PPO 介紹到 GRPO,還分享了如何用 GRPO 訓(xùn)練推理模型的技巧。

- 原文地址:https://docs.unsloth.ai/basics/reinforcement-learning-guide
- 開(kāi)源項(xiàng)目:https://github.com/unslothai/unsloth
全面了解強(qiáng)化學(xué)習(xí)以及如何使用 GRPO 訓(xùn)練你自己的推理模型。這是一份從初學(xué)者到高級(jí)的完整指南。
你將學(xué)到什么
- 什么是強(qiáng)化學(xué)習(xí) (RL)?RLVR?PPO?GRPO?RLHF?RFT?對(duì)于強(qiáng)化學(xué)習(xí)來(lái)說(shuō),運(yùn)氣 is All You Need?
- 什么是環(huán)境?agent?動(dòng)作?獎(jiǎng)勵(lì)函數(shù)?獎(jiǎng)勵(lì)?
本文涵蓋了你需要了解的關(guān)于 GRPO、強(qiáng)化學(xué)習(xí) (RL) 和獎(jiǎng)勵(lì)函數(shù)的所有內(nèi)容 —— 從初學(xué)者到高級(jí),還有基于 Unsloth 使用 GRPO 的基礎(chǔ)知識(shí)。
如果你正需要學(xué)習(xí)如何一步步實(shí)現(xiàn) GRPO,這份指南值得一讀。
什么是強(qiáng)化學(xué)習(xí) (RL)?
強(qiáng)化學(xué)習(xí)的目標(biāo)是:
- 增加獲得「好」結(jié)果的幾率。
- 降低出現(xiàn)「壞」結(jié)果的幾率。
就這么簡(jiǎn)單!「好」和「壞」的含義錯(cuò)綜復(fù)雜,「增加」和「降低」也許斟酌,甚至「結(jié)果」的含義也各不相同。
舉個(gè)例子,在吃豆人(Pacman)游戲中:

- 環(huán)境就是游戲世界。
- 動(dòng)作包括向上、向左、向右和向下。
- 如果你吃掉一塊餅干,獎(jiǎng)勵(lì)是好的;如果你碰到敵人,獎(jiǎng)勵(lì)是壞的。
在強(qiáng)化學(xué)習(xí)中,你無(wú)法知道自己可以采取的「最佳動(dòng)作」,但你可以觀察中間步驟,或者最終的游戲狀態(tài)(勝或負(fù))。
再來(lái)個(gè)例子,假設(shè)你被問(wèn)到這個(gè)問(wèn)題:「What is 2 + 2?」 (4)
一個(gè)未對(duì)齊的語(yǔ)言模型會(huì)輸出 3、4、C、D、-10 等等各種亂七八糟的答案。

- 數(shù)字總比 C 或 D 好,對(duì)吧?
- 得到 3 總比得到 8 好,對(duì)吧?
- 得到 4 絕對(duì)沒(méi)錯(cuò)!
其實(shí),我們剛剛就設(shè)計(jì)出了一個(gè)獎(jiǎng)勵(lì)函數(shù)!
從 RLHF、PPO 到 GRPO 和 RLVR
OpenAI 讓 RLHF(基于人類反饋的強(qiáng)化學(xué)習(xí))的概念變得人盡皆知。在該方法中,我們需要訓(xùn)練一個(gè) agent 來(lái)針對(duì)某個(gè)問(wèn)題(狀態(tài))生成人類認(rèn)為更有用的輸出。

例如,ChatGPT 中的??和??符號(hào)就可以用于 RLHF 過(guò)程。
為了實(shí)現(xiàn) RLHF,PPO(近端策略優(yōu)化)被開(kāi)發(fā)了出來(lái)。

在這種情況下,agent 就是語(yǔ)言模型。事實(shí)上,它由三個(gè)系統(tǒng)組成:
- 生成策略(當(dāng)前被訓(xùn)練模型)
- 參考策略(原始模型)
- 價(jià)值模型(平均獎(jiǎng)勵(lì)估算器)
我們使用獎(jiǎng)勵(lì)模型來(lái)計(jì)算當(dāng)前環(huán)境的獎(jiǎng)勵(lì),而我們的目標(biāo)就是最大化獎(jiǎng)勵(lì)!
PPO 的公式看起來(lái)相當(dāng)復(fù)雜,因?yàn)樗脑O(shè)計(jì)初衷是保持穩(wěn)定性。

PPO 公式
DeepSeek 開(kāi)發(fā)了 GRPO(組相對(duì)策略優(yōu)化)來(lái)訓(xùn)練他們的推理模型。它與 PPO 的主要區(qū)別在于:
- 移除了價(jià)值模型,取而代之的是多次調(diào)用獎(jiǎng)勵(lì)模型的統(tǒng)計(jì)數(shù)據(jù)。
- 移除了獎(jiǎng)勵(lì)模型,取而代之的是自定義獎(jiǎng)勵(lì)函數(shù),RLVR 可以使用該函數(shù)。

這意味著 GRPO 非常高效。以前 PPO 需要訓(xùn)練多個(gè)模型 —— 現(xiàn)在移除了獎(jiǎng)勵(lì)模型和價(jià)值模型,便可以節(jié)省內(nèi)存并加快速度。
RLVR(可驗(yàn)證獎(jiǎng)勵(lì)的強(qiáng)化學(xué)習(xí))允許我們根據(jù)易于驗(yàn)證解答的任務(wù)來(lái)獎(jiǎng)勵(lì)模型。例如:
- 數(shù)學(xué)等式可以輕松驗(yàn)證,如 2+2 = 4。
- 代碼輸出可以驗(yàn)證是否正確執(zhí)行。
- 設(shè)計(jì)可驗(yàn)證的獎(jiǎng)勵(lì)函數(shù)可能很困難,因此大多數(shù)示例都與數(shù)學(xué)或代碼相關(guān)。
- GRPO 的用例不僅限于代碼或數(shù)學(xué) —— 它的推理過(guò)程可以增強(qiáng)電子郵件自動(dòng)化、數(shù)據(jù)庫(kù)檢索、法律和醫(yī)學(xué)等任務(wù),并根據(jù)數(shù)據(jù)集和獎(jiǎng)勵(lì)函數(shù)顯著提高準(zhǔn)確性 —— 訣竅在于定義一個(gè)規(guī)則 —— 即一系列較小的可驗(yàn)證獎(jiǎng)勵(lì),而不是最終的單一獎(jiǎng)勵(lì)。例如,OpenAI 也在其強(qiáng)化學(xué)習(xí)微調(diào) (RFT) 中用到了這一點(diǎn)。
為什么使用「組相對(duì)」?
GRPO 完全移除了價(jià)值模型,但我們?nèi)匀恍枰鶕?jù)當(dāng)前狀態(tài)估算「平均獎(jiǎng)勵(lì)」。
訣竅在于對(duì) LLM 進(jìn)行采樣!然后,我們通過(guò)統(tǒng)計(jì)多個(gè)不同問(wèn)題的采樣過(guò)程來(lái)計(jì)算平均獎(jiǎng)勵(lì)。
例如,對(duì)于「What is 2 + 2?」,我們采樣 4 次。我們可能得到 4、3、D、C。然后,我們計(jì)算每個(gè)答案的獎(jiǎng)勵(lì),計(jì)算平均獎(jiǎng)勵(lì)和標(biāo)準(zhǔn)差,最后用 Z 分?jǐn)?shù)進(jìn)行標(biāo)準(zhǔn)化!

這就產(chǎn)生了優(yōu)勢(shì) A,我們將用它來(lái)替代價(jià)值模型。這可以節(jié)省大量?jī)?nèi)存!

GRPO 優(yōu)勢(shì)計(jì)算
運(yùn)氣(耐心) Is All You Need
強(qiáng)化學(xué)習(xí)的訣竅在于你只需要兩樣?xùn)|西:
- 一個(gè)問(wèn)題或指令,例如「What is 2+2?」 「用 Python 創(chuàng)建一個(gè) Flappy Bird 游戲」
- 一個(gè)獎(jiǎng)勵(lì)函數(shù)和一個(gè)驗(yàn)證器,用于驗(yàn)證輸出是好是壞。
僅憑這兩個(gè),我們基本上可以無(wú)限次調(diào)用語(yǔ)言模型,直到得到一個(gè)好的答案。例如,對(duì)于「What is 2+2?」,一個(gè)未經(jīng)訓(xùn)練的糟糕模型語(yǔ)言模型可能會(huì)輸出:
0、cat、-10、1928、3、A、B、122、17、182、172、A、C、BAHS、%$、#、9、-192、12.31,然后突然變?yōu)?4。
獎(jiǎng)勵(lì)信號(hào)為 0、0、0、0、0、0、0、0、0、0、0、0、0、0、0,然后突然變?yōu)?1。

因此,RL 憑借運(yùn)氣和偶然性,在多次迭代中找到了正確答案。我們的目標(biāo)是讓好答案(4)出現(xiàn)的次數(shù)更多,其余(壞答案)出現(xiàn)的次數(shù)更少。
因此,RL 的目標(biāo)是耐心 —— 在極限情況下,只要正確答案的概率至少有一點(diǎn)(不為零),那么就只是一場(chǎng)等待的游戲 —— 你一定會(huì)在極限情況下 100% 找到正確答案。
所以我喜歡稱之為針對(duì)強(qiáng)化學(xué)習(xí)的「運(yùn)氣 Is All You Need」。
其實(shí),更好的說(shuō)法是針對(duì)強(qiáng)化學(xué)習(xí)的「耐心 is All You Need」。
本質(zhì)上,強(qiáng)化學(xué)習(xí)提供了一種技巧 —— 與其簡(jiǎn)單地等待無(wú)限,不如在實(shí)實(shí)在在地收到「壞信號(hào)」(即壞答案)時(shí)去「引導(dǎo)」模型嘗試不生成壞答案。這意味著,盡管你可能等待了很長(zhǎng)時(shí)間才出現(xiàn)一個(gè)「好」答案,但模型其實(shí)已經(jīng)在盡力調(diào)整,盡量不輸出壞答案。
在「What is 2+2?」這個(gè)例子中,先出現(xiàn)了 0、cat、-10、1928、3、A、B、122、17、182、172、A、C、BAHS、%$、#、9、-192、12.31,然后突然出現(xiàn)了 4。
由于我們得到了壞答案,強(qiáng)化學(xué)習(xí)會(huì)影響模型,使其嘗試不輸出壞答案。這意味著隨著時(shí)間的推移,我們會(huì)仔細(xì)地「修剪」或移動(dòng)模型的輸出分布,使其遠(yuǎn)離錯(cuò)誤答案。這意味著強(qiáng)化學(xué)習(xí)并非低效,因?yàn)槲覀儾⒎侵皇堑却裏o(wú)限,而是積極地嘗試「推動(dòng)」模型盡可能地向「正確答案空間」靠攏。
注:如果概率始終為 0,那么強(qiáng)化學(xué)習(xí)就永遠(yuǎn)不會(huì)奏效。這也是為什么人們喜歡基于已經(jīng)過(guò)指令微調(diào)的模型進(jìn)行強(qiáng)化學(xué)習(xí)的原因,因?yàn)檫@樣的模型已經(jīng)可以相當(dāng)好地部分執(zhí)行指令 —— 這很可能將概率提升到 0 以上。
Unsloth 能為強(qiáng)化學(xué)習(xí)提供什么?
- Unsloth 配備 15GB 顯存,支持將參數(shù)最多 17B 的任何模型(例如 Llama 3.1 (8B)、Phi-4 (14B)、Mistral (7B) 或 Qwen2.5 (7B))轉(zhuǎn)換為推理模型。
- 最低要求:只需 5GB 顯存即可在本地訓(xùn)練你自己的推理模型(適用于任何參數(shù)不超過(guò) 1.5B 的模型)。
這里給出了一個(gè)基于 Unsloth 使用 GRPO 訓(xùn)練自己的推理模型的詳細(xì)教程,感興趣的讀者可以參考實(shí)驗(yàn):
GRPO 是如何訓(xùn)練模型的?
- 對(duì)于每個(gè)問(wèn)答對(duì),模型會(huì)生成多種可能的答案(比如,8 種變體)。
- 使用獎(jiǎng)勵(lì)函數(shù)對(duì)每個(gè)答案進(jìn)行評(píng)估。
- 訓(xùn)練步數(shù):如果有 300 行數(shù)據(jù),則需要 300 個(gè)訓(xùn)練步驟(如果訓(xùn)練 3 個(gè) epoch,則需要 900 個(gè)訓(xùn)練步驟)。也可以增加每個(gè)問(wèn)題生成的答案數(shù)量(例如,從 8 個(gè)增加到 16 個(gè))。
- 該模型的學(xué)習(xí)方式是在每一步對(duì)權(quán)重進(jìn)行更新。
這里有一些示例筆記本:
https://docs.unsloth.ai/get-started/unsloth-notebooks#grpo-reasoning-notebooks
基礎(chǔ)知識(shí)/技巧
Unsloth 還分享了一些他們積累的心得:
- 等待至少 300 步,獎(jiǎng)勵(lì)才會(huì)真正增加。為了獲得不錯(cuò)的結(jié)果,你可能需要至少等待 12 小時(shí)(這是 GRPO 的工作原理),但請(qǐng)記住,這不是強(qiáng)制性的,你可以隨時(shí)停止。
- 為獲得最佳效果,至少需要 500 行數(shù)據(jù)。你甚至可以嘗試 10 行數(shù)據(jù),但使用更多數(shù)據(jù)會(huì)更好。
- 每次訓(xùn)練運(yùn)行都會(huì)有所不同,具體取決于你的模型、數(shù)據(jù)、獎(jiǎng)勵(lì)函數(shù) / 驗(yàn)證器等。因此,雖然前面說(shuō)最低訓(xùn)練步數(shù)是 300 步,但有時(shí)可能需要 1000 步或更多。所以,這取決于各種因素。
- 如果你在本地使用 GRPO 和 Unsloth,如果出現(xiàn)錯(cuò)誤,可以「pip install diffusers」。請(qǐng)使用最新版本的 vLLM。
- 建議將 GRPO 應(yīng)用于參數(shù)至少為 1.5B 的模型,以便正確生成思考 token,因?yàn)檩^小的模型可能無(wú)法做到。
- 對(duì)于 QLoRA 4-bit 的 GRPO GPU VRAM 要求,一般規(guī)則是模型參數(shù) = 你需要的 VRAM 數(shù)量(你可以使用更少的 VRAM,但還是這樣更好)。你設(shè)置的上下文長(zhǎng)度越長(zhǎng),VRAM 就越多。LoRA 16-bit 至少會(huì)使用 4 倍以上的 VRAM。
- 可以持續(xù)微調(diào),并且你可以讓 GRPO 在后臺(tái)運(yùn)行。
- 示例筆記本使用的數(shù)據(jù)集是 GSM8K,這是目前 R1 風(fēng)格訓(xùn)練最流行的選擇。
- 如果你使用的是基礎(chǔ)模型,請(qǐng)確保你擁有聊天模板。
- 使用 GRPO 訓(xùn)練的次數(shù)越多越好。GRPO 最大的優(yōu)點(diǎn)是你甚至不需要那么多數(shù)據(jù)。你只需要一個(gè)優(yōu)秀的獎(jiǎng)勵(lì)函數(shù) / 驗(yàn)證器,并且訓(xùn)練時(shí)間越長(zhǎng),你的模型就會(huì)越好。隨著時(shí)間的推移,你的獎(jiǎng)勵(lì)與步長(zhǎng)的比率預(yù)計(jì)會(huì)像這樣增加:

- Unsloth 現(xiàn)已內(nèi)置了 GRPO 的訓(xùn)練損失跟蹤,無(wú)需使用 wandb 等外部工具。它現(xiàn)在包含所有獎(jiǎng)勵(lì)函數(shù)的完整日志詳細(xì)信息,包括總聚合獎(jiǎng)勵(lì)函數(shù)本身。

獎(jiǎng)勵(lì)函數(shù) / 驗(yàn)證器
在強(qiáng)化學(xué)習(xí)中,獎(jiǎng)勵(lì)函數(shù)和驗(yàn)證器在評(píng)估模型輸出方面發(fā)揮著不同的作用。一般來(lái)說(shuō),你可以將它們理解為同一件事,但從技術(shù)上講,它們并非一回事,但這無(wú)關(guān)緊要,因?yàn)樗鼈兺ǔJ桥浜鲜褂玫摹?/span>
驗(yàn)證器(Verifier):
- 確定生成的響應(yīng)是否正確。
- 它不會(huì)分配數(shù)值分?jǐn)?shù) —— 只是驗(yàn)證正確性。
- 例如:如果對(duì)于「2 + 2」,模型生成為「5」,則驗(yàn)證器會(huì)檢查并將其標(biāo)記為「錯(cuò)誤」(因?yàn)檎_答案是 4)。
- 驗(yàn)證器還可以執(zhí)行代碼(例如,使用 Python)來(lái)驗(yàn)證邏輯、語(yǔ)法和正確性,而無(wú)需手動(dòng)評(píng)估。
獎(jiǎng)勵(lì)函數(shù)(Reward Function):
- 將驗(yàn)證結(jié)果(或其他標(biāo)準(zhǔn))轉(zhuǎn)換為數(shù)值分?jǐn)?shù)。
- 例如:如果答案錯(cuò)誤,它可能會(huì)分配罰分(-1、-2 等),而正確答案可能會(huì)獲得正得分(+1、+2)。
- 它還可以根據(jù)正確性以外的標(biāo)準(zhǔn)進(jìn)行懲罰,例如長(zhǎng)度過(guò)長(zhǎng)或可讀性差。
主要區(qū)別:
- 驗(yàn)證器檢查正確性,但不進(jìn)行評(píng)分。
- 獎(jiǎng)勵(lì)函數(shù)會(huì)分配分?jǐn)?shù),但不一定驗(yàn)證正確性。
- 獎(jiǎng)勵(lì)函數(shù)可以使用驗(yàn)證器,但從技術(shù)上講,它們并不相同。
理解獎(jiǎng)勵(lì)函數(shù)
GRPO 的主要目標(biāo)是最大化獎(jiǎng)勵(lì)并學(xué)習(xí)答案的得出方式,而不是簡(jiǎn)單地記憶并根據(jù)訓(xùn)練數(shù)據(jù)復(fù)現(xiàn)答案。
- 在每個(gè)訓(xùn)練步驟中,GRPO 都會(huì)調(diào)整模型權(quán)重以最大化獎(jiǎng)勵(lì)。此過(guò)程會(huì)逐步微調(diào)模型。
- 常規(guī)微調(diào)(不使用 GRPO)僅最大化下一詞的預(yù)測(cè)概率,而不會(huì)針對(duì)獎(jiǎng)勵(lì)進(jìn)行優(yōu)化。GRPO 針對(duì)獎(jiǎng)勵(lì)函數(shù)進(jìn)行優(yōu)化,而不僅僅是預(yù)測(cè)下一詞。
- 你可以在多個(gè) epoch 中重復(fù)使用數(shù)據(jù)。
- 你可以預(yù)定義默認(rèn)獎(jiǎng)勵(lì)函數(shù),以用于各種用例,或者你可以讓 ChatGPT / 本地模型為你生成它們。
- 設(shè)計(jì)獎(jiǎng)勵(lì)函數(shù)或驗(yàn)證器沒(méi)有唯一正確的方法 —— 這方面可能性無(wú)窮無(wú)盡。然而,它們必須設(shè)計(jì)精良且有意義,因?yàn)樵O(shè)計(jì)不當(dāng)?shù)莫?jiǎng)勵(lì)可能會(huì)無(wú)意中降低模型性能。
獎(jiǎng)勵(lì)函數(shù)示例
參考以下示例。可以將你的生成結(jié)果輸入到 ChatGPT 4o 或 Llama 3.1 (8B) 等 LLM 中,并設(shè)計(jì)一個(gè)獎(jiǎng)勵(lì)函數(shù)和驗(yàn)證器來(lái)評(píng)估它。例如,將你的生成結(jié)果輸入到你選擇的 LLM 中,并設(shè)置一條規(guī)則:「如果答案聽(tīng)起來(lái)太機(jī)械化,則扣 3 分?!惯@有助于根據(jù)質(zhì)量標(biāo)準(zhǔn)優(yōu)化輸出。
示例 1:簡(jiǎn)單算術(shù)任務(wù)
- 問(wèn)題:2 + 2
- 答案:4
- 獎(jiǎng)勵(lì)函數(shù) 1:如果檢測(cè)到數(shù)字 → +1;如果未檢測(cè)到數(shù)字 → -1
- 獎(jiǎng)勵(lì)函數(shù) 2:如果數(shù)字與正確答案匹配 → +3;如果不正確 → -3
- 總獎(jiǎng)勵(lì):所有獎(jiǎng)勵(lì)函數(shù)的總和
示例 2:電子郵件自動(dòng)化任務(wù)
- 問(wèn)題:接收電子郵件
- 答案:發(fā)送電子郵件
- 獎(jiǎng)勵(lì)函數(shù):
- 如果答案包含必需關(guān)鍵詞 → +1
- 如果答案與理想答案完全匹配 → +1
- 如果答案過(guò)長(zhǎng) → -1
- 如果包含收件人姓名 → +1
- 如果存在簽名塊(電話、電子郵件、地址)→ +1
Unsloth 基于鄰近度的獎(jiǎng)勵(lì)函數(shù)
在前面的 GRPO Colab 筆記本,可以看到其中創(chuàng)建了一個(gè)完全從零開(kāi)始構(gòu)建的自定義基于鄰近度的獎(jiǎng)勵(lì)函數(shù),旨在獎(jiǎng)勵(lì)那些更接近正確答案的答案。這個(gè)靈活的函數(shù)可以應(yīng)用于各種任務(wù)。
- 在其中的示例中,是在 Qwen3 (Base) 上啟用了推理功能,并將其引導(dǎo)至特定任務(wù)
- 應(yīng)用預(yù)微調(diào)策略,以避免 GRPO 默認(rèn)只學(xué)習(xí)格式
- 使用基于正則表達(dá)式的匹配提升評(píng)估準(zhǔn)確度
- 創(chuàng)建自定義 GRPO 模板,超越諸如「think」之類的一般提示詞,例如 <start_working_out></end_working_out>
- 應(yīng)用基于鄰近度的評(píng)分 —— 模型會(huì)因更接近的答案獲得更多獎(jiǎng)勵(lì)(例如,預(yù)測(cè) 9 比預(yù)測(cè) 10 更好),而異常值則會(huì)受到懲罰
GSM8K 獎(jiǎng)勵(lì)函數(shù)
在其他示例中,Unsloth 使用了 @willccbb 提供的現(xiàn)有 GSM8K 獎(jiǎng)勵(lì)函數(shù),該函數(shù)廣受歡迎且已被證明非常有效:
- Correctness_reward_func – 獎(jiǎng)勵(lì)完全匹配的標(biāo)簽。
- Int_reward_func – 鼓勵(lì)僅使用整數(shù)的答案。
- Soft_format_reward_func – 檢查結(jié)構(gòu),但允許少量換行符不匹配。
- strict_format_reward_func – 確保響應(yīng)結(jié)構(gòu)與提示符匹配,包括換行符。
- xmlcount_reward_func – 確保響應(yīng)中每個(gè) XML 標(biāo)簽恰好對(duì)應(yīng)一個(gè)。





































