[ PROMPT_NODE_22886 ]
reward-modeling
[ SKILL_DOCUMENTATION ]
# 奖励建模
使用 TRL 为 RLHF 流水线训练奖励模型的指南。
## 概述
奖励模型根据人类偏好对补全内容进行评分。用于:
- PPO 训练 (强化学习反馈)
- GRPO 在线强化学习
- 补全结果排序
## 基础训练
python
from transformers import AutoModelForSequenceClassification, AutoTokenizer
from trl import RewardTrainer, RewardConfig
from datasets import load_dataset
# 加载模型 (num_labels=1 用于单个奖励分数)
model = AutoModelForSequenceClassification.from_pretrained(
"Qwen/Qwen2.5-0.5B-Instruct",
num_labels=1
)
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-0.5B-Instruct")
# 加载偏好数据集 (chosen/rejected 对)
dataset = load_dataset("trl-lib/ultrafeedback_binarized", split="train")
# 配置
config = RewardConfig(
output_dir="Qwen2.5-Reward",
per_device_train_batch_size=2,
num_train_epochs=1,
learning_rate=1e-5
)
# 训练
trainer = RewardTrainer(
model=model,
args=config,
processing_class=tokenizer,
train_dataset=dataset
)
trainer.train()
## 数据集格式
必需字段:
{
"prompt": "问题或指令",
"chosen": "更好的回答",
"rejected": "较差的回答"
}
## Bradley-Terry 损失函数
默认损失函数:
loss = -log(sigmoid(reward_chosen - reward_rejected))
学习使 chosen 的分数高于 rejected。
## 使用奖励模型
### 推理
python
from transformers import pipeline
# 加载训练好的奖励模型
reward_pipe = pipeline("text-classification", model="Qwen2.5-Reward")
# 对补全内容评分
texts = ["好的回答", "坏的回答"]
scores = reward_pipe(texts)
print(scores) # 分数越高越好
### 在 PPO 中使用
python
from trl import PPOTrainer, PPOConfig
config = PPOConfig(
reward_model_path="Qwen2.5-Reward" # 使用训练好的奖励模型
)
trainer = PPOTrainer(
model=policy_model,
config=config,
# 自动加载奖励模型
)
## 超参数
| 模型大小 | 学习率 | 批次大小 | 轮数 |
|------------|---------------|------------|--------|
| rejected_rewards).float().mean()
print(f"准确率: {accuracy:.2%}") # 目标: >80%
## 参考资料
- InstructGPT 论文