使用 LLaMA 3 8B 微调一个 Reward Model:从入门到实践

本文将介绍如何基于 Meta 的 LLaMA 3 8B 模型构建并微调一个 Reward Model ,它是构建 RLHF(基于人类反馈的强化学习)系统中的关键一环。我们将使用 Hugging Face 的 transformerstrlpeft 等库,通过参数高效微调(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 数据,基本格式如下:

python 复制代码
{
  "prompt": "什么是人工智能?",
  "chosen": "人工智能是让机器具备模拟人类智能的能力,例如学习、推理、感知等。",
  "rejected": "人工智能就是让机器变得更厉害。"
}
  • prompt 是输入问题

  • chosen 是较优回答

  • rejected 是较差回答

我们训练模型区分出"好回答"和"不好回答"。

安装依赖

python 复制代码
pip install transformers peft trl accelerate datasets bitsandbytes

加载 LLaMA 3 模型

我们使用 Hugging Face 的 transformers 加载 LLaMA 3,并通过 LoRA 应用微调。

python 复制代码
from transformers import AutoTokenizer, AutoModelForCausalLM
from peft import LoraConfig, get_peft_model

model_name = "meta-llama/Meta-Llama-3-8B"

tokenizer = AutoTokenizer.from_pretrained(model_name)
tokenizer.pad_token = tokenizer.eos_token  # 处理 padding

model = 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 格式。

python 复制代码
from datasets import Dataset
import json

with 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。

python 复制代码
from trl import RewardTrainer, RewardConfig

training_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()

保存模型

python 复制代码
trainer.save_model("./output/rm-llama3")
tokenizer.save_pretrained("./output/rm-llama3")

保存后的模型可以直接用于 PPO、DPO 等强化学习阶段,作为 reward function 评估输出质量。

奖励评分逻辑(原理简述)

虽然你加载的是普通的语言模型(AutoModelForCausalLM),但 RewardTrainer 会这样做:

  1. 输入 prompt + chosenprompt + rejected 两个序列

  2. 使用语言模型计算每个序列的 log-likelihood(对数似然)

  3. 总结每个序列的 log-prob 得分作为 reward 分数

  4. log(sigmoid(reward_chosen - reward_rejected)) 作为 loss,更新参数

这个过程实现了 pairwise preference learning,而你无需自定义 loss 函数。

非lora 的方式训练的reward 模型。

如何训练一个 Reward Model:RLHF 的核心组件详解_reward model训练-CSDN博客

参考资料

https://github.com/huggingface/trl

相关推荐
Mr_sst6 小时前
infra-ai模块宏观设计解析:业务与模型之间的中间层核心架构
大数据·人工智能·ai·llama
微软技术分享11 小时前
Windows平台下CUDA安装及llama.cpp使用教程
windows·llama
小wu学cv2 天前
llama.cpp调用GPU推理Qwen3.5-0.8b模型
llama
zhangfeng11332 天前
LLaMA-Factory 保存 checkpoint 时崩溃解决办法 OOM 内存溢出(不是显存)
运维·服务器·人工智能·深度学习·llama
老唐7773 天前
30分钟手搓 Agent:LLM + Tools + Loop + Memory 跑通最小闭环
人工智能·ai·语言模型·agent·llama·智能体
高兴就好(石3 天前
Mac使用llama.cpp
macos·llama
zhangfeng11333 天前
No space left on device (28) llamafactory微调训练的时候 报错,需要调节 dataloader_num_workers
人工智能·语言模型·llama
阿珊和她的猫4 天前
大模型在客服场景:落地路径 + 效果评估
ai·agent·llama·cli·mcp
谷子熟了5 天前
电商智能客服系统本地搭建
经验分享·docker·typescript·ai编程·llama
YXHPY5 天前
开源 AI 工作流底座正在加速:从 llama.cpp、Ollama 到 vLLM 与 Agent 编排
人工智能·开源·llama