從RLHF、PPO到GRPO再訓練推理模型,這是你需要的強化學習入門指南
強化學習(RL)已經成為當今 LLM 不可或缺的技術之一。從大模型對齊到推理模型訓練再到如今的智能體強化學習(Agentic RL),你幾乎能在當今 AI 領域的每個領域看到強化學習的身影。
近日,Daniel Han 和 Michael Han 兩兄弟組成的團隊 Unsloth(用于微調模型的同名開源項目 GitHub 星數已超過 4 萬)發布了一個強化學習教程,其中從吃豆人談起,簡單易懂地從 RLHF、PPO 介紹到 GRPO,還分享了如何用 GRPO 訓練推理模型的技巧。
- 原文地址:https://docs.unsloth.ai/basics/reinforcement-learning-guide
- 開源項目:https://github.com/unslothai/unsloth
全面了解強化學習以及如何使用 GRPO 訓練你自己的推理模型。這是一份從初學者到高級的完整指南。
你將學到什么
- 什么是強化學習 (RL)?RLVR?PPO?GRPO?RLHF?RFT?對于強化學習來說,運氣 is All You Need?
- 什么是環境?agent?動作?獎勵函數?獎勵?
本文涵蓋了你需要了解的關于 GRPO、強化學習 (RL) 和獎勵函數的所有內容 —— 從初學者到高級,還有基于 Unsloth 使用 GRPO 的基礎知識。
如果你正需要學習如何一步步實現 GRPO,這份指南值得一讀。
什么是強化學習 (RL)?
強化學習的目標是:
- 增加獲得「好」結果的幾率。
- 降低出現「壞」結果的幾率。
就這么簡單!「好」和「壞」的含義錯綜復雜,「增加」和「降低」也許斟酌,甚至「結果」的含義也各不相同。
舉個例子,在吃豆人(Pacman)游戲中:
- 環境就是游戲世界。
- 動作包括向上、向左、向右和向下。
- 如果你吃掉一塊餅干,獎勵是好的;如果你碰到敵人,獎勵是壞的。
在強化學習中,你無法知道自己可以采取的「最佳動作」,但你可以觀察中間步驟,或者最終的游戲狀態(勝或負)。
再來個例子,假設你被問到這個問題:「What is 2 + 2?」 (4)
一個未對齊的語言模型會輸出 3、4、C、D、-10 等等各種亂七八糟的答案。
- 數字總比 C 或 D 好,對吧?
- 得到 3 總比得到 8 好,對吧?
- 得到 4 絕對沒錯!
其實,我們剛剛就設計出了一個獎勵函數!
從 RLHF、PPO 到 GRPO 和 RLVR
OpenAI 讓 RLHF(基于人類反饋的強化學習)的概念變得人盡皆知。在該方法中,我們需要訓練一個 agent 來針對某個問題(狀態)生成人類認為更有用的輸出。
例如,ChatGPT 中的??和??符號就可以用于 RLHF 過程。
為了實現 RLHF,PPO(近端策略優化)被開發了出來。
在這種情況下,agent 就是語言模型。事實上,它由三個系統組成:
- 生成策略(當前被訓練模型)
- 參考策略(原始模型)
- 價值模型(平均獎勵估算器)
我們使用獎勵模型來計算當前環境的獎勵,而我們的目標就是最大化獎勵!
PPO 的公式看起來相當復雜,因為它的設計初衷是保持穩定性。
PPO 公式
DeepSeek 開發了 GRPO(組相對策略優化)來訓練他們的推理模型。它與 PPO 的主要區別在于:
- 移除了價值模型,取而代之的是多次調用獎勵模型的統計數據。
- 移除了獎勵模型,取而代之的是自定義獎勵函數,RLVR 可以使用該函數。
這意味著 GRPO 非常高效。以前 PPO 需要訓練多個模型 —— 現在移除了獎勵模型和價值模型,便可以節省內存并加快速度。
RLVR(可驗證獎勵的強化學習)允許我們根據易于驗證解答的任務來獎勵模型。例如:
- 數學等式可以輕松驗證,如 2+2 = 4。
- 代碼輸出可以驗證是否正確執行。
- 設計可驗證的獎勵函數可能很困難,因此大多數示例都與數學或代碼相關。
- GRPO 的用例不僅限于代碼或數學 —— 它的推理過程可以增強電子郵件自動化、數據庫檢索、法律和醫學等任務,并根據數據集和獎勵函數顯著提高準確性 —— 訣竅在于定義一個規則 —— 即一系列較小的可驗證獎勵,而不是最終的單一獎勵。例如,OpenAI 也在其強化學習微調 (RFT) 中用到了這一點。
為什么使用「組相對」?
GRPO 完全移除了價值模型,但我們仍然需要根據當前狀態估算「平均獎勵」。
訣竅在于對 LLM 進行采樣!然后,我們通過統計多個不同問題的采樣過程來計算平均獎勵。
例如,對于「What is 2 + 2?」,我們采樣 4 次。我們可能得到 4、3、D、C。然后,我們計算每個答案的獎勵,計算平均獎勵和標準差,最后用 Z 分數進行標準化!
這就產生了優勢 A,我們將用它來替代價值模型。這可以節省大量內存!
GRPO 優勢計算
運氣(耐心) Is All You Need
強化學習的訣竅在于你只需要兩樣東西:
- 一個問題或指令,例如「What is 2+2?」 「用 Python 創建一個 Flappy Bird 游戲」
- 一個獎勵函數和一個驗證器,用于驗證輸出是好是壞。
僅憑這兩個,我們基本上可以無限次調用語言模型,直到得到一個好的答案。例如,對于「What is 2+2?」,一個未經訓練的糟糕模型語言模型可能會輸出:
0、cat、-10、1928、3、A、B、122、17、182、172、A、C、BAHS、%$、#、9、-192、12.31,然后突然變為 4。
獎勵信號為 0、0、0、0、0、0、0、0、0、0、0、0、0、0、0,然后突然變為 1。
因此,RL 憑借運氣和偶然性,在多次迭代中找到了正確答案。我們的目標是讓好答案(4)出現的次數更多,其余(壞答案)出現的次數更少。
因此,RL 的目標是耐心 —— 在極限情況下,只要正確答案的概率至少有一點(不為零),那么就只是一場等待的游戲 —— 你一定會在極限情況下 100% 找到正確答案。
所以我喜歡稱之為針對強化學習的「運氣 Is All You Need」。
其實,更好的說法是針對強化學習的「耐心 is All You Need」。
本質上,強化學習提供了一種技巧 —— 與其簡單地等待無限,不如在實實在在地收到「壞信號」(即壞答案)時去「引導」模型嘗試不生成壞答案。這意味著,盡管你可能等待了很長時間才出現一個「好」答案,但模型其實已經在盡力調整,盡量不輸出壞答案。
在「What is 2+2?」這個例子中,先出現了 0、cat、-10、1928、3、A、B、122、17、182、172、A、C、BAHS、%$、#、9、-192、12.31,然后突然出現了 4。
由于我們得到了壞答案,強化學習會影響模型,使其嘗試不輸出壞答案。這意味著隨著時間的推移,我們會仔細地「修剪」或移動模型的輸出分布,使其遠離錯誤答案。這意味著強化學習并非低效,因為我們并非只是等待無限,而是積極地嘗試「推動」模型盡可能地向「正確答案空間」靠攏。
注:如果概率始終為 0,那么強化學習就永遠不會奏效。這也是為什么人們喜歡基于已經過指令微調的模型進行強化學習的原因,因為這樣的模型已經可以相當好地部分執行指令 —— 這很可能將概率提升到 0 以上。
Unsloth 能為強化學習提供什么?
- Unsloth 配備 15GB 顯存,支持將參數最多 17B 的任何模型(例如 Llama 3.1 (8B)、Phi-4 (14B)、Mistral (7B) 或 Qwen2.5 (7B))轉換為推理模型。
- 最低要求:只需 5GB 顯存即可在本地訓練你自己的推理模型(適用于任何參數不超過 1.5B 的模型)。
這里給出了一個基于 Unsloth 使用 GRPO 訓練自己的推理模型的詳細教程,感興趣的讀者可以參考實驗:
GRPO 是如何訓練模型的?
- 對于每個問答對,模型會生成多種可能的答案(比如,8 種變體)。
- 使用獎勵函數對每個答案進行評估。
- 訓練步數:如果有 300 行數據,則需要 300 個訓練步驟(如果訓練 3 個 epoch,則需要 900 個訓練步驟)。也可以增加每個問題生成的答案數量(例如,從 8 個增加到 16 個)。
- 該模型的學習方式是在每一步對權重進行更新。
這里有一些示例筆記本:
https://docs.unsloth.ai/get-started/unsloth-notebooks#grpo-reasoning-notebooks
基礎知識/技巧
Unsloth 還分享了一些他們積累的心得:
- 等待至少 300 步,獎勵才會真正增加。為了獲得不錯的結果,你可能需要至少等待 12 小時(這是 GRPO 的工作原理),但請記住,這不是強制性的,你可以隨時停止。
- 為獲得最佳效果,至少需要 500 行數據。你甚至可以嘗試 10 行數據,但使用更多數據會更好。
- 每次訓練運行都會有所不同,具體取決于你的模型、數據、獎勵函數 / 驗證器等。因此,雖然前面說最低訓練步數是 300 步,但有時可能需要 1000 步或更多。所以,這取決于各種因素。
- 如果你在本地使用 GRPO 和 Unsloth,如果出現錯誤,可以「pip install diffusers」。請使用最新版本的 vLLM。
- 建議將 GRPO 應用于參數至少為 1.5B 的模型,以便正確生成思考 token,因為較小的模型可能無法做到。
- 對于 QLoRA 4-bit 的 GRPO GPU VRAM 要求,一般規則是模型參數 = 你需要的 VRAM 數量(你可以使用更少的 VRAM,但還是這樣更好)。你設置的上下文長度越長,VRAM 就越多。LoRA 16-bit 至少會使用 4 倍以上的 VRAM。
- 可以持續微調,并且你可以讓 GRPO 在后臺運行。
- 示例筆記本使用的數據集是 GSM8K,這是目前 R1 風格訓練最流行的選擇。
- 如果你使用的是基礎模型,請確保你擁有聊天模板。
- 使用 GRPO 訓練的次數越多越好。GRPO 最大的優點是你甚至不需要那么多數據。你只需要一個優秀的獎勵函數 / 驗證器,并且訓練時間越長,你的模型就會越好。隨著時間的推移,你的獎勵與步長的比率預計會像這樣增加:
- Unsloth 現已內置了 GRPO 的訓練損失跟蹤,無需使用 wandb 等外部工具。它現在包含所有獎勵函數的完整日志詳細信息,包括總聚合獎勵函數本身。
獎勵函數 / 驗證器
在強化學習中,獎勵函數和驗證器在評估模型輸出方面發揮著不同的作用。一般來說,你可以將它們理解為同一件事,但從技術上講,它們并非一回事,但這無關緊要,因為它們通常是配合使用的。
驗證器(Verifier):
- 確定生成的響應是否正確。
- 它不會分配數值分數 —— 只是驗證正確性。
- 例如:如果對于「2 + 2」,模型生成為「5」,則驗證器會檢查并將其標記為「錯誤」(因為正確答案是 4)。
- 驗證器還可以執行代碼(例如,使用 Python)來驗證邏輯、語法和正確性,而無需手動評估。
獎勵函數(Reward Function):
- 將驗證結果(或其他標準)轉換為數值分數。
- 例如:如果答案錯誤,它可能會分配罰分(-1、-2 等),而正確答案可能會獲得正得分(+1、+2)。
- 它還可以根據正確性以外的標準進行懲罰,例如長度過長或可讀性差。
主要區別:
- 驗證器檢查正確性,但不進行評分。
- 獎勵函數會分配分數,但不一定驗證正確性。
- 獎勵函數可以使用驗證器,但從技術上講,它們并不相同。
理解獎勵函數
GRPO 的主要目標是最大化獎勵并學習答案的得出方式,而不是簡單地記憶并根據訓練數據復現答案。
- 在每個訓練步驟中,GRPO 都會調整模型權重以最大化獎勵。此過程會逐步微調模型。
- 常規微調(不使用 GRPO)僅最大化下一詞的預測概率,而不會針對獎勵進行優化。GRPO 針對獎勵函數進行優化,而不僅僅是預測下一詞。
- 你可以在多個 epoch 中重復使用數據。
- 你可以預定義默認獎勵函數,以用于各種用例,或者你可以讓 ChatGPT / 本地模型為你生成它們。
- 設計獎勵函數或驗證器沒有唯一正確的方法 —— 這方面可能性無窮無盡。然而,它們必須設計精良且有意義,因為設計不當的獎勵可能會無意中降低模型性能。
獎勵函數示例
參考以下示例。可以將你的生成結果輸入到 ChatGPT 4o 或 Llama 3.1 (8B) 等 LLM 中,并設計一個獎勵函數和驗證器來評估它。例如,將你的生成結果輸入到你選擇的 LLM 中,并設置一條規則:「如果答案聽起來太機械化,則扣 3 分。」這有助于根據質量標準優化輸出。
示例 1:簡單算術任務
- 問題:2 + 2
- 答案:4
- 獎勵函數 1:如果檢測到數字 → +1;如果未檢測到數字 → -1
- 獎勵函數 2:如果數字與正確答案匹配 → +3;如果不正確 → -3
- 總獎勵:所有獎勵函數的總和
示例 2:電子郵件自動化任務
- 問題:接收電子郵件
- 答案:發送電子郵件
- 獎勵函數:
- 如果答案包含必需關鍵詞 → +1
- 如果答案與理想答案完全匹配 → +1
- 如果答案過長 → -1
- 如果包含收件人姓名 → +1
- 如果存在簽名塊(電話、電子郵件、地址)→ +1
Unsloth 基于鄰近度的獎勵函數
在前面的 GRPO Colab 筆記本,可以看到其中創建了一個完全從零開始構建的自定義基于鄰近度的獎勵函數,旨在獎勵那些更接近正確答案的答案。這個靈活的函數可以應用于各種任務。
- 在其中的示例中,是在 Qwen3 (Base) 上啟用了推理功能,并將其引導至特定任務
- 應用預微調策略,以避免 GRPO 默認只學習格式
- 使用基于正則表達式的匹配提升評估準確度
- 創建自定義 GRPO 模板,超越諸如「think」之類的一般提示詞,例如 <start_working_out></end_working_out>
- 應用基于鄰近度的評分 —— 模型會因更接近的答案獲得更多獎勵(例如,預測 9 比預測 10 更好),而異常值則會受到懲罰
GSM8K 獎勵函數
在其他示例中,Unsloth 使用了 @willccbb 提供的現有 GSM8K 獎勵函數,該函數廣受歡迎且已被證明非常有效:
- Correctness_reward_func – 獎勵完全匹配的標簽。
- Int_reward_func – 鼓勵僅使用整數的答案。
- Soft_format_reward_func – 檢查結構,但允許少量換行符不匹配。
- strict_format_reward_func – 確保響應結構與提示符匹配,包括換行符。
- xmlcount_reward_func – 確保響應中每個 XML 標簽恰好對應一個。