本文將介紹如何基于 Meta 的 LLaMA 3 8B 模型構建并微調一個 Reward Model,它是構建 RLHF(基于人類反饋的強化學習)系統中的關鍵一環。我們將使用 Hugging Face 的 transformers
、trl
和 peft
等庫,通過參數高效微調(LoRA)實現高質量 Reward Model 的訓練。
什么是 Reward Model?
Reward Model(RM)是 RLHF 流程中的評分器,它學習人類偏好:在多個候選回答中判斷哪個更符合用戶意圖。訓練目標是使模型給出更高 reward 分數的輸出更符合人類偏好,常用于后續的強化學習微調如 PPO、DPO 等。
技術選型
-
模型基座:
LLaMA 3 8B
(你需要有模型訪問權限) -
微調方法:
LoRA
(Parameter-Efficient Fine-Tuning) -
訓練庫:trl (Transformers Reinforcement Learning)
-
數據格式:偏好比較數據(prompt, chosen, rejected)
數據格式示例
Reward Model 使用的是 pairwise preference 數據,基本格式如下:
{"prompt": "什么是人工智能?","chosen": "人工智能是讓機器具備模擬人類智能的能力,例如學習、推理、感知等。","rejected": "人工智能就是讓機器變得更厲害。"
}
-
prompt
是輸入問題 -
chosen
是較優回答 -
rejected
是較差回答
我們訓練模型區分出“好回答”和“不好回答”。
安裝依賴
pip install transformers peft trl accelerate datasets bitsandbytes
加載 LLaMA 3 模型
我們使用 Hugging Face 的 transformers
加載 LLaMA 3,并通過 LoRA 應用微調。
from transformers import AutoTokenizer, AutoModelForCausalLM
from peft import LoraConfig, get_peft_modelmodel_name = "meta-llama/Meta-Llama-3-8B"tokenizer = AutoTokenizer.from_pretrained(model_name)
tokenizer.pad_token = tokenizer.eos_token # 處理 paddingmodel = AutoModelForCausalLM.from_pretrained(model_name,load_in_8bit=True, # 節省顯存device_map="auto"
)# 應用 LoRA
lora_config = LoraConfig(r=8,lora_alpha=16,lora_dropout=0.05,bias="none",task_type="CAUSAL_LM"
)
model = get_peft_model(model, lora_config)
準備數據集
我們使用本地 JSON 文件作為訓練數據,并轉換為 Hugging Face Dataset
格式。
from datasets import Dataset
import jsonwith open("data/reward_data.json", "r", encoding="utf-8") as f:raw_data = json.load(f)dataset = Dataset.from_list(raw_data)
使用 RewardTrainer 訓練模型
我們使用 trl
中的 RewardTrainer
,它自動處理 pairwise loss(log-sigmoid ranking loss),非常適合訓練 Reward Model。
from trl import RewardTrainer, RewardConfigtraining_args = RewardConfig(output_dir="./output/rm-llama3",per_device_train_batch_size=2,gradient_accumulation_steps=4,learning_rate=1e-5,max_length=1024,num_train_epochs=3,logging_steps=10,save_strategy="epoch",remove_unused_columns=False,bf16=True, # 或根據硬件選擇 fp16/bf16
)trainer = RewardTrainer(model=model,tokenizer=tokenizer,train_dataset=dataset,args=training_args,
)trainer.train()
保存模型
trainer.save_model("./output/rm-llama3")
tokenizer.save_pretrained("./output/rm-llama3")
保存后的模型可以直接用于 PPO、DPO 等強化學習階段,作為 reward function 評估輸出質量。
獎勵評分邏輯(原理簡述)
雖然你加載的是普通的語言模型(AutoModelForCausalLM
),但 RewardTrainer
會這樣做:
-
輸入
prompt + chosen
和prompt + rejected
兩個序列 -
使用語言模型計算每個序列的 log-likelihood(對數似然)
-
總結每個序列的 log-prob 得分作為 reward 分數
-
用
log(sigmoid(reward_chosen - reward_rejected))
作為 loss,更新參數
這個過程實現了 pairwise preference learning,而你無需自定義 loss 函數。
?非lora 的方式訓練的reward 模型。
如何訓練一個 Reward Model:RLHF 的核心組件詳解_reward model訓練-CSDN博客
參考資料
https://github.com/huggingface/trl