Reward Model(獎勵模型)是 RLHF 的核心,決定了模型“覺得人類偏好什么”的依據。本文將系統介紹如何從零開始訓練一個 reward model,包括數據準備、模型結構、損失函數、訓練方法與注意事項。
什么是 Reward Model?
Reward Model(RM)是一個評分器:它輸入一個文本(通常是 prompt + 模型回答),輸出一個實數分值(reward),表示這個回答的“人類偏好程度”。
它不是分類器,也不是生成器,而是一個 打分器。
在 RLHF 流程中,RM 的作用是:
-
替代人工給生成內容打分;
-
指導 PPO 等算法優化語言模型,讓它生成更“優質”的回答。
訓練 Reward Model 的流程
步驟概覽:
-
準備人類偏好數據(pairwise comparisons);
-
構建 backbone 模型(Transformer);
-
添加 reward head(輸出 scalar);
-
使用 pairwise loss 進行訓練;
-
驗證 reward model 能正確排序人類偏好。
1. 數據準備:Pairwise Preference Data
Reward Model 通常使用 人類偏好數據對(Preference Pairs) 訓練。
每條樣本形式為:
{"prompt": "Explain what is RLHF.","chosen": "RLHF is a method where humans guide the training...","rejected": "RLHF is a way of training GPT models by ... (low quality)"
}
這意味著:在給定 prompt 下,chosen
比 rejected
更好。
數據來源:
-
OpenAI 的
summarize-from-feedback
-
Anthropic HH (Helpful–Harmless) dataset
-
自定義對比打分數據(通過眾包等獲得)
2. 模型結構設計
? Backbone 模型
Reward model 通常使用預訓練語言模型作為 backbone,比如:
-
bert-base-uncased
(RoBERTa 更好) -
gpt2
(decoder-only 模型) -
llama
,chatglm
,baichuan
,qwen
, etc.
? Reward Head
在模型頂部添加一個 Dense 層,輸出一個 scalar:
class RewardModel(tf.keras.Model):def __init__(self):self.backbone = TFAutoModel.from_pretrained("bert-base-uncased")self.reward_head = tf.keras.layers.Dense(1) # 輸出 reward 分數def call(self, input_ids, attention_mask):output = self.backbone(input_ids, attention_mask=attention_mask)cls_embedding = output.last_hidden_state[:, 0, :]reward = self.reward_head(cls_embedding)return tf.squeeze(reward, axis=-1)
對于 decoder-only 模型(如 GPT、LLaMA),常用策略是取最后一個 token 的 hidden state 或均值池化。
3. 損失函數:Pairwise Logistic Loss
Reward Model 不預測具體分數,而是學習排序關系。
給定一個 batch:
-
r_chosen = RM(prompt + chosen)
-
r_rejected = RM(prompt + rejected)
目標:使 r_chosen > r_rejected
損失函數(pairwise loss)定義為:
L=?log?(σ(rchosen?rrejected))\mathcal{L} = -\log(\sigma(r_{\text{chosen}} - r_{\text{rejected}}))
實現(PyTorch):
def pairwise_loss(reward_chosen, reward_rejected):return -torch.log(torch.sigmoid(reward_chosen - reward_rejected)).mean()
這種損失稱為 BPR Loss / Bradley-Terry loss / RankNet loss,是訓練 ranking 模型的標準做法。
4. 輸入構建策略
輸入內容:
將 prompt 和 response 拼接成一段文本輸入 reward model。
例如:
input_text = prompt + response
tokenized = tokenizer(input_text, padding=True, truncation=True, return_tensors="pt")
為了避免模型“偏向 prompt”,你可以只喂 response,也可以打上特殊分隔符(如 <|sep|>
)。
5. 訓練技巧
項目 | 推薦設置 |
---|---|
Optimizer | AdamW |
Learning Rate | 1e-5 ~ 5e-6 |
Batch Size | 8 ~ 64 |
Max Token Length | 512 ~ 1024 |
Regularization | gradient clipping, weight decay |
Evaluation | accuracy of ranking, NDCG |
評估方式
你可以用如下指標評估 reward model 的排序能力:
-
Pairwise accuracy(多少對判斷正確)
-
Kendall’s Tau / Spearman correlation
-
NDCG(對于多選排序數據)
常見問題 FAQ
Reward 值范圍有限制嗎?
→ 理論上是任意 float,但實踐中建議控制范圍(如 [-5, 5])防止 PPO 梯度不穩定。
Reward Model 一定要用 LLaMA 嗎?
→ 不一定。小模型如 RoBERTa 也可以。只有當你追求極高一致性或生成風格對齊時,才建議用同架構。
可以多頭訓練 reward model 嗎?
→ 是的,可以擴展為多任務結構,如同時預測 helpfulness 和 harmlessness。
總結:訓練一個 Reward Model 的完整流程
步驟 | 內容 |
---|---|
數據準備 | 收集 prompt + chosen/rejected 對 |
模型選擇 | 使用 BERT / GPT / LLaMA 等作為 backbone |
輸入構造 | 拼接 prompt 與 response,做 tokenization |
構建 reward head | 加一個 dense 輸出實數分值 |
訓練 loss | 使用 pairwise logistic loss |
評估指標 | ranking accuracy、NDCG、Kendall Tau |
輸出范圍 | 推薦做歸一化或限制范圍 |
推薦工具庫
-
transformers
-
trl — PPO / DPO 強化訓練
-
wandb
— 訓練日志可視化 -
datasets
— 讀取 OpenAI / Anthropic 公開數據
參考開源項目
-
OpenAI – summarize-from-feedback
-
Anthropic – HH-RLHF
-
TRL – reward model example
附加: 利用 Reward Model 和 RLHF 微調 LLaMA3
現在我們已經訓練好了 Reward Model,接下來我們將它用于 微調 LLaMA3 模型,使其生成更符合人類偏好的內容。這一步通常稱為 RLHF 的第二階段:使用強化學習優化語言模型策略。
背景:RLHF 三階段流程
階段 | 目標 | 方法 |
---|---|---|
1. SFT(監督微調) | 初步學習任務 | 用人類標注樣本微調 LLM |
2. Reward Model 訓練 | 模擬人類偏好 | 用人類比較訓練 RM |
3.RLHF(PPO/DPO) | 提升生成質量 | 用 RM 做 reward,強化訓練 LLM |
我們現在要做的,就是第三階段的 PPO 微調。
1. 準備工作
模型
-
Policy 模型(被優化者):
LLaMA3-8B
或LLaMA3-7B
; -
Reward 模型(打分者):你在前面階段訓練得到的 RM,可是小模型如 RoBERTa,也可以是 LLaMA3。
工具
我們使用 Hugging Face 的 trl 包,它封裝了 PPO 的訓練過程。
安裝依賴:
pip install trl transformers datasets accelerate bitsandbytes
2. PPO 微調 LLaMA3(代碼示例)
下面是使用 trl
對 LLaMA3 模型進行 PPO 微調的一個精簡范例。
from transformers import AutoTokenizer, AutoModelForCausalLM
from trl import PPOTrainer, PPOConfig
import torch# 加載 Policy 模型(LLaMA3)
model_name = "meta-llama/Meta-Llama-3-8B"
policy_model = AutoModelForCausalLM.from_pretrained(model_name, device_map="auto", load_in_4bit=True)
tokenizer = AutoTokenizer.from_pretrained(model_name)
tokenizer.pad_token = tokenizer.eos_token# 加載 Reward Model(之前訓練的)
reward_model = AutoModelForCausalLM.from_pretrained("your-reward-model-checkpoint").eval().to("cuda")# 配置 PPOTrainer
config = PPOConfig(model_name=model_name,learning_rate=1e-5,batch_size=4,mini_batch_size=1,gradient_accumulation_steps=4,log_with="wandb", # optional
)ppo_trainer = PPOTrainer(config=config, model=policy_model, tokenizer=tokenizer)# 示例 prompt 數據
prompts = ["Explain how quantum computing works.","What are some good ways to improve sleep quality?","Why is the sky blue?"
]for prompt in prompts:# Tokenize inputinputs = tokenizer(prompt, return_tensors="pt").to("cuda")# 生成 responseresponse_ids = policy_model.generate(**inputs, max_new_tokens=64)response = tokenizer.decode(response_ids[0], skip_special_tokens=True)# 構建 reward model 輸入full_input = prompt + responsereward_input = tokenizer(full_input, return_tensors="pt", padding=True, truncation=True).to("cuda")# 使用 Reward Model 打分with torch.no_grad():reward_logits = reward_model(**reward_input).logitsreward_score = reward_logits[:, -1].mean().item()# PPO stepppo_trainer.step([prompt], [response], [reward_score])print(f"Prompt: {prompt}")print(f"Response: {response}")print(f"Reward Score: {reward_score:.4f}")
3.訓練建議與技巧
項目 | 推薦 |
---|---|
Batch Size | 4 ~ 16 |
Learning Rate | 1e-5 ~ 5e-6 |
生成長度 | 控制在 64~128 token,便于穩定獎勵 |
數據 | 使用指令 + 多樣領域 prompt |
LoRA | 可選,節省資源(qLoRA + PPO) |
Mixed Precision | 推薦使用 FP16 / bfloat16 |
訓練時長 | PPO 通常訓練 10k~50k steps |
4. 獎勵信號設計建議
-
獎勵值的尺度很重要,避免 reward 值過大或過小;
-
建議 reward 范圍控制在 -5 ~ +5;
-
可加入
KL penalty
或KL control
來防止模型發散。
總結:使用 Reward Model 強化微調 LLaMA3
步驟 | 工具 | 目標 |
---|---|---|
? 準備 Reward Model | transformers | 提供打分 |
? 加載 LLaMA3 | AutoModelForCausalLM | 微調目標模型 |
? 使用 PPOTrainer | trl | 根據 reward 優化生成行為 |
? 控制訓練穩定性 | KL 約束、clip、reward 范圍 | 保證輸出多樣性和一致性 |
拓展方向
-
使用 DPO 替代 PPO(無需 reward scalar,直接對比 pair);
-
使用 Preference Transformer 將 RM 與生成過程融合;
-
多任務 RM(評分 helpfulness、toxicity 等多維指標);
-
強化風格 / 語調一致性:RM 評分“像人說話”的程度。