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