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)評估結構正確性:

  1. json_format_reward – 解析輸出並檢查請求的格式(fenced 與原始);完全符合格式得全分,格式錯誤但可解析得部分分(0.2),無法解析則得零分。
  2. field_count_reward – 比較頂層欄位數量與預期數量;不匹配時線性遞減。
  3. 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%),同時仍遠小且運行成本更低。
  • 獎勵設計至關重要 – 對格式、欄位數量與架構驗證的明確獎勵,直接轉化為目標輸出形式的更高通過率。
  • 可重現性 – 所有腳本、資料連結與轉換步驟皆公開,讓研究人員可複製或擴展實驗至其他模型或資料集。

如何複製

  1. 按照部落格說明安裝 uvllama.cpp 和 IFStruct 評估腳本。
  2. 克隆筆記本儲存庫,並執行提供的 GRPOConfig 的 GRPO 微調單元格。
  3. 合併 LoRA 适配器,將檢查點轉換為 GGUF,並使用 llama-server 提供服務。
  4. 對已提供服務的端點執行 IFStruct 評估器。

所有指令與 URL 均在原始 Hugging Face 帖文中逐字重現。


局限性

  • 訓練資料(約 500 個樣本)僅為大規模 RLHF 所用資料的極小部分,因此提升迅速達到飽和。
  • YAML 輸出的改進較小,顯示目前獎勵權重更傾向於 JSON 格式。
  • 評估仍反映合成任務;現實世界整合可能暴露更多邊際案例。

未來方向

  • 擴充訓練集,加入更多樣的架構與格式(如 XML、CSV),以提升全面符合度。
  • 探索其他獎勵權重或額外約束(例如邏輯一致性)。
  • 將相同 GRPO 流程應用於其他緊湊型模型(例如 2 億參數變體),以評估可擴展性。

參考資料

Sources