LFM2.5-350M GRPO 微調將 IFStruct 分數提升至 29.7%
TL;DR
僅用 100 步和約 500 個樣本對 3.5 億參數的 LFM2.5 模型進行群組相對策略優化(GRPO)微調,即可使其 IFStruct 結構化輸出符合度從 22.6% 提升至 29.7%,提升了 7.1 個百分點,大幅縮小了與大型模型之間的差距。
為何結構化輸出符合度至關重要
結構化輸出——返回語法正確且符合指定架構的資料——是將大語言模型整合至下游系統的先決條件。許多衡量原始推理能力的基準往往忽略此要求;IFStruct 僅專注於架構遵從性,因此成為現實部署可行性的可靠指標。
"模型是否能穩定地以請求的格式和結構返回有效且可解析的輸出——即架構符合性——往往是決定其能否被整合至下游系統的關鍵。" – Hugging Face 博客
LFM2.5‑350M 的基線評估
- 模型:
LiquidAI/LFM2.5-350M(GGUF BF16),透過llama.cpp提供服務。 - 設定:使用免費層級的 Colab/Kaggle GPU 提供服務;評估在 MacBook Pro(Apple M5 Max,36 GB)上執行,使用 IFStruct 評估器。
- 結果:整體通過率為 22.6%(2000 個樣本中通過 452 個)。詳細分項:
- JSON:18.0%
- YAML:27.2%
- 包裝鍵:28.5%
- 純清單:16.6%
- 常見錯誤:遺漏必要欄位、項目數量錯誤、類型不匹配,以及未關閉的程式碼區塊。
這些數字與原始 IFStruct 發布時報告的 21.1% 非常接近,確認基線數據可靠。
GRPO 微調流程
整個工作流程已公開於 GitHub 的筆記本中,並可在免費層級 GPU 上執行。
訓練資料
- 來源:
nvidia/Nemotron-RL-instruction_following-structured_outputs(約 500 個樣本)。 - 增強:
- 40% 的提示加入「將輸出包含在 fenced code block 內」的指令,訓練模型遵守格式要求。
- 20% 轉換為頂層陣列任務,促進正確的純清單生成與項目數量符合。
模型與 LoRA 适配器
lora_config = LoraConfig(
r=16,
lora_alpha=32,
bias="none",
task_type="CAUSAL_LM",
target_modules=[
"q_proj", "k_proj", "v_proj", "out_proj", "in_proj",
"w1", "w2", "w3",
],
)
- 訓練約 600 萬參數(約為 3.5 億模型的 1.66%)。
奖勵函數
三個標量獎勵(0–1)評估結構正確性:
- json_format_reward – 解析輸出並檢查請求的格式(fenced 與原始);完全符合格式得全分,格式錯誤但可解析得部分分(0.2),無法解析則得零分。
- field_count_reward – 比較頂層欄位數量與預期數量;不匹配時線性遞減。
- schema_validation_reward – 根據提供的 JSON Schema 進行驗證,懲罰遺漏必要鍵值與約束違規。
綜合獎勵為加權總和,權重為 reward_weights = [1.0, 0.5, 2.0]。
訓練設定
testing_args = GRPOConfig(
output_dir="./outputs/lfm25-350m-nemotron-schema-grpo",
learning_rate=5e-5,
max_steps=100,
warmup_steps=10,
num_generations=8,
per_device_train_batch_size=4,
gradient_accumulation_steps=8,
steps_per_generation=2,
max_completion_length=1024,
mask_truncated_completions=False,
temperature=1.1,
beta=0.01,
reward_weights=[1.0, 0.5, 2.0],
logging_steps=1,
save_steps=100,
)
- 100 次優化步驟,每組提示產生 8 筆完成結果,並採用適度的 KL 懲罰(
beta=0.01)。 - 在 16 GB GPU 上訓練時間不到一小時即可完成。
合併 LoRA
訓練完成後,將 LoRA 适配器合併回基礎權重,並儲存為單一檢查點,即可轉換為 GGUF 格式,供 llama.cpp 服務使用。
微調後的 IFStruct 結果
- 模型:合併 GRPO 微調檢查點,轉換為 BF16 GGUF 格式。
- 服務:與基線相同
llama.cpp參數,僅更換別名與埠號。 - 結果:整體通過率為 29.7%(2000 個樣本中通過 594 個)。
- JSON:31.9%(↑13.9 點)
- YAML:27.5%(↑0.3 點)
- 包裝鍵:29.7%(↑1.2 點)
- 純清單:29.7%(↑13.1 點)
- 錯誤模式轉變:遺漏欄位錯誤減少,但仍存在明顯的類型不匹配與額外欄位。
| 指標 | 基線 | GRPO 微調後 | Δ |
|---|---|---|---|
| 整體 | 22.6% | 29.7% | +7.1 |
| JSON | 18.0% | 31.9% | +13.9 |
| YAML | 27.2% | 27.5% | +0.3 |
| 包裝鍵 | 28.5% | 29.7% | +1.2 |
| 純清單 | 16.6% | 29.7% | +13.1 |
提升集中在獎勵信號所針對的項目——JSON 格式與純清單生成——證實了 GRPO 方法的有效性。
意義與啟示
- 成本效益高的擴展 – 僅需 100 步 GRPO 訓練與約 500 個範例,成本低於一次免費層級 Colab 會話,卻能帶來 7 個百分點的結構化輸出符合度絕對提升。
- 模型規模對等 – 微調後的 350 M 模型表現接近 20 億參數模型(Qwen3.5‑2B 在 IFStruct 上得 33.15%),同時仍遠小且運行成本更低。
- 獎勵設計至關重要 – 對格式、欄位數量與架構驗證的明確獎勵,直接轉化為目標輸出形式的更高通過率。
- 可重現性 – 所有腳本、資料連結與轉換步驟皆公開,讓研究人員可複製或擴展實驗至其他模型或資料集。
如何複製
- 按照部落格說明安裝
uv、llama.cpp和 IFStruct 評估腳本。 - 克隆筆記本儲存庫,並執行提供的
GRPOConfig的 GRPO 微調單元格。 - 合併 LoRA 适配器,將檢查點轉換為 GGUF,並使用
llama-server提供服務。 - 對已提供服務的端點執行 IFStruct 評估器。
所有指令與 URL 均在原始 Hugging Face 帖文中逐字重現。
局限性
- 訓練資料(約 500 個樣本)僅為大規模 RLHF 所用資料的極小部分,因此提升迅速達到飽和。
- YAML 輸出的改進較小,顯示目前獎勵權重更傾向於 JSON 格式。
- 評估仍反映合成任務;現實世界整合可能暴露更多邊際案例。
未來方向
- 擴充訓練集,加入更多樣的架構與格式(如 XML、CSV),以提升全面符合度。
- 探索其他獎勵權重或額外約束(例如邏輯一致性)。
- 將相同 GRPO 流程應用於其他緊湊型模型(例如 2 億參數變體),以評估可擴展性。
參考資料
- 模型:
LiquidAI/LFM2.5-350M– https://huggingface.co/LiquidAI/LFM2.5-350M - 基準:IFStruct v1.0 – https://huggingface.co/datasets/LiquidAI/ifstruct-v1.0
- 訓練資料:
nvidia/Nemotron-RL-instruction_following-structured_outputs - GRPO 實作:TRL 庫 – https://huggingface.co/docs/trl/en/index
- 完整筆記本:https://github.com/Liquid4All/cookbook/blob/main/finetuning/notebooks/grpo_with_trl_ifstruct.ipynb
- 原始 IFStruct 博客:https://www.liquid.ai/blog/ifstruct-v1.0