使用DeepSeek的GRPO,7B模型只需強化學習就能拿下數獨
机器之心發表於2025-03-11
沒有任何冷啟動資料,7B 引數模型能單純透過強化學習學會玩數獨嗎?近日,技術博主 Hrishbh Dalal 的實踐表明,這個問題的答案是肯定的。並且他在這個過程中用到了 DeepSeek 開發的 GRPO 演算法,最終他「成功在一個小型數獨資料集上實現了高獎勵和解答」。下面我們就來具體看看他的部落格文章,瞭解一番他的開發思路。原文地址:https://hrishbh.com/teaching-language-models-to-solve-sudoku-through-reinforcement-learning/現在的語言模型已經能完成很多工了,包括寫論文、生成程式碼和解答覆雜問題。但是,如何讓它們學會解答需要結構化思維、空間推理和邏輯推理的難題呢?這就是我最近的實驗的切入點 —— 透過強化學習教語言模型解決數獨問題。對語言模型來說,數獨有自己獨特的難點。不同於開放式的文字生成,玩數獨需要:- 遵循嚴格的規則(每行、每列和每框必須包含數字 1-9,且不能重複)
有趣的是,語言模型並不是為結構化問題設計的。它們的訓練目標是預測文字,而不是遵循邏輯規則或維持網格結構。然而,透過正確的方法,它們可以學會這些技能。本實驗使用了來自 Kaggle 的包含 400 萬數獨的資料集,其中有非常簡單的,也有非常困難的。準備資料集的過程包含幾大關鍵步驟:1、載入和過濾:使用 kagglehub 庫下載資料集並根據難度級別過濾數獨。2、難度分類:根據線索數量,將數獨分為四個難度級別:3、每個數獨一開始都被表示成了 81 個字元的字串。這裡將其轉換為具有適當行、列和框分隔符的網格格式:4、提示詞工程:每個數獨都會被封裝在一個精心設計的提示詞中,而該提示詞的作用是指示模型:- 在 <answer> 標籤中提供具有適當網格格式的最終答案
對於初始實驗,我建立了一個包含 400 個訓練樣本的聚焦資料集,這主要是使用更簡單的數獨來為學習構建一個基線。這個資料集被刻意選得較小,目的是測試模型使用有限樣本學習的效率。加上我的資源有限:如果使用 unsloth grpo 訓練,24GB RTX 4090 大約最多隻能放入 3000 上下文長度。因此我只能選擇更簡單的問題以避免記憶體溢位(OOM),因為困難的問題及其推理鏈更長。我決定探索強化學習(尤其是 GRPO)能否讓語言模型變成數獨求解器。我實驗了兩種不同的模型大小:- Qwen 2.5 7B Instruct:使用了秩為 16 的 LoRA 進行微調
- Qwen 2.5 3B Instruct:使用了秩為 32 的 LoRA 進行微調
重要的是,我沒有使用冷啟動資料或從 DeepSeek R1 等較大模型中蒸餾的資料。這裡會從基礎指令微調版模型開始,單純使用強化學習。訓練配置包括: Andrej Karpathy 曾表示 3e-4 是 Adam 的最佳學習率強化學習的核心是獎勵函式 —— 可以告訴模型它何時表現良好。我設計了一個多分量獎勵系統,它具有幾個專門的功能:為了實現良好的解析,模型應該始終記得使用正確的思考和答案標籤(分別是 <think></think> 和 <answer></answer> 標籤)。這些標籤有兩個關鍵目的:為了強制實施這種結構,我實現了兩個互補的獎勵函式:第一個函式(tags_presence_reward_func)為出現的每個標籤提供部分 credit,其作用是鼓勵模型包含所有必需的標籤。第二個函式(tags_order_reward_func)則用於確保這些標籤以正確的順序出現 —— 先思考再回答。它們一起可教會模型保持將推理與解答分開的一致結構。為了讓我們讀懂數獨的解答,必須以特定的網格格式呈現它。該獎勵函式的作用便是評估模型維持正確網格結構的能力:該函式會將網格格式分解為多個部分 —— 正確的行數、正確的分隔符位置、適當使用分隔符。模型每個方面正確了都會獲得一些獎勵。這種細粒度的方法有助於模型學習數獨網格的特定空間結構。當然,最終目標是讓模型正確解答數獨。這裡使用了兩個獎勵函式來評估解答的準確度:第一個函式 (exact_answer_reward_func) 會為完全正確的解答提供大獎勵 (5.0),從而為模型提供正確解答數獨的強大動力。第二個函式 (simple_robust_partial_reward_function) 會更微妙一些,會為部分正確的解答提供部分 credit。它有兩個關鍵特性:- 嚴格強制模型保留原始線索(如果任何線索發生變化,則給予零獎勵);
- 對於模型正確填充的每個空單元格,都按比例給予獎勵。
這種部分獎勵對於學習至關重要,因為它能為模型在訓練期間提供更平滑的梯度。最後,數獨解答必須遵守遊戲規則 —— 任何行、列或 3×3 框中都沒有重複數字:該函式會檢查每行、每列和每 3×3 框是否有重複項,模型滿足每個約束時都能獲得一些獎勵。這能讓模型學會數獨的基本規則,鼓勵它生成有效的解答,即使它們與預期答案不完全匹配。實際訓練結果揭示了一些有趣的事情:模型大小對學習穩定性和效能具有巨大的影響。7B 模型(使用了秩為 16 的 LoRA)結果優良:與之形成鮮明對比的是,3B 模型(使用了秩為 32 的 LoRA )表現不佳:圖表清楚地說明了這一點:7B 模型(粉色線)保持了穩定的效能,而 3B 模型(綠色線)則出現了劇烈波動,並且最終完全失敗。最重要的:最終答案獎勵(模型生成完全正確的響應網格並完全匹配):對於 7B 模型,精確答案獎勵增長意味著模型能給出完全匹配的答案,但 3B 則出現崩潰情況。這證明 7B 模型學會了用很少的資料解決數獨問題,並且學習速度很快!這個實驗揭示了關於複雜推理任務的語言模型教學的幾個重要啟示:1、Deepseek R1 論文中提到,在沒有冷啟動資料的情況下,複雜推理存在一個最小規模閾值。有些任務需要一定的模型能力才能穩定學習。3B 模型的失敗表明,數獨解題可能就是這樣一種任務。在模型學會正確解題之前,它需要保持穩定的訓練動態。7B 模型始終如一的指標使其能夠取得穩步進展。與單一的透過 / 失敗訊號相比,將獎勵細分為格式合規性、規則遵守性和解題準確性有助於更有效地指導學習過程。儘管困難重重,GRPO 還是成功地教會了 7B 模型保持正確的格式並開始解題,這些技能並不是語言模型所固有的。這在很大程度上是一個持續進行的專案,計劃下一步採取幾個步驟:- 增加難度:引入更具挑戰性的謎題來測試模型的推理能力
- 擴大計算規模:使用更多計算資源,進行更長時間和更大批次的訓練
- 探索模型架構:測試 7B 模型的 LoRA rank 32,看更高的 rank 是否能提高效能
- 蒸餾法:從 DeepSeek R1 等大型模型中提煉出冷啟動資料集,然後在此基礎上應用 GRPO
- 高階獎勵函式:實施我已經設計好但尚未在訓練中部署的更細緻入微的獎勵機制
- 評估框架:開發更復雜的評估指標,以評估推理質量,而不僅僅是解決方案的準確性
我未來工作中最重要的一個方面就是實現我已經設計好的更復雜的獎勵函式。目前的簡單獎勵函式是有效的,但增強版包含了幾項關鍵改進,可以顯著提高學習效率。- 漸進式獎勵優於二元反饋:我不會簡單地將答案標記為正確或錯誤,而是為部分解答提供部分獎勵。這能創造一個更平滑的學習梯度,有助於模型漸進式改進。
- 難度感知型擴充套件:這些增強過的函式會將問題難度作為一個乘數,這能為解決更難的問題提供更高的獎勵。這能鼓勵模型解決更難的問題,而不僅僅是最佳化簡單的問題。
- 嚴格的線索儲存:所有獎勵函式都執行了一條不可協商的規則,即必須保留原始問題線索。這可以防止模型透過更改問題本身來「作弊」。
- 額外獎勵閾值:這些經過增強的函式包括當模型超過某些效能閾值(75%、85%、95% 正確)時的額外獎勵。當模型走上正軌時,這些作為激勵里程碑,可以加速學習。
- 最低獎勵底線(我最關注的一點):即使是部分正確的解答也會獲得較小的最低獎勵(0.05),確保模型即使進展很小,也能獲得一些反饋。
當前的簡單函式側重於最關鍵的方面(線索儲存和部分 credit),而這裡增強後的版本則透過難度調整和漸進獎勵增加了複雜性。在未來的訓練中,我計劃實現這些更微妙的獎勵函式,看看它們能否進一步提高學習效率和解答質量。我設計獎勵函式的關鍵見解是:基於過程的獎勵(獎勵旅程,而不僅僅是目的)對於模型學習複雜的推理任務至關重要。透過提供中間步驟和部分解答的反饋,可建立一個比二元成功 / 失敗訊號更有效的學習環境。讓語言模型學會玩數獨不僅僅是為了解謎娛樂,還為了開發能夠完成以下任務的 AI 系統:
- 程式設計:教模型編寫遵循嚴格語法和邏輯約束的程式碼
這個實驗只是我透過強化學習讓語言模型學習結構化推理的探索的開始。雖然 7B 模型的初步結果很有希望,但仍有許多需要學習和改進的地方。3B 和 7B 模型效能之間的明顯差異凸顯了一個重要的教訓:對於某些任務,要實現穩定學習,對基礎模型有最低的尺寸要求。隨著我繼續使用更多資料、更好的獎勵函式和更大的模型來改進方法,我期望看到更出色的結果。隨著新發現的出現,我將定期更新這個專案。教機器邏輯思考和解決結構化問題的旅程充滿挑戰但又令人著迷 —— 我很期待其未來走向。